summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-06-20 08:35:29 +0000
committerCoprDistGit <infra@openeuler.org>2023-06-20 08:35:29 +0000
commitb5129b60440d756d95d0355cc18c513443489bd9 (patch)
tree9cf0c236d7bce706e78c84573d4ad9afb730a9b5
parent145c4600467265b53f2fc4a8cd292afbff8c99b5 (diff)
automatic import of python-ionicalopeneuler20.03
-rw-r--r--.gitignore1
-rw-r--r--python-ionical.spec1035
-rw-r--r--sources1
3 files changed, 1037 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..d92f4bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/ionical-0.5.13.tar.gz
diff --git a/python-ionical.spec b/python-ionical.spec
new file mode 100644
index 0000000..29d24fe
--- /dev/null
+++ b/python-ionical.spec
@@ -0,0 +1,1035 @@
+%global _empty_manifest_terminate_build 0
+Name: python-ionical
+Version: 0.5.13
+Release: 1
+Summary: command line tool for tracking ical changes
+License: MIT
+URL: https://github.com/danyul/ionical
+Source0: https://mirrors.aliyun.com/pypi/web/packages/9e/bb/7af9655ee53b70cbaf206851aa39d5982a0e294bb104d9a59b13e7661677/ionical-0.5.13.tar.gz
+BuildArch: noarch
+
+Requires: python3-icalendar
+Requires: python3-pytz
+Requires: python3-recurring-ical-events
+Requires: python3-toml
+Requires: python3-black
+Requires: python3-mypy
+Requires: python3-flake8
+Requires: python3-flake8-import-order
+Requires: python3-sphinx
+Requires: python3-recommonmark
+Requires: python3-pytest
+Requires: python3-pytest
+
+%description
+
+# ionical: Keep an eye on ical!
+
+
+- **ionical** is a command line tool for tracking schedule changes
+ in iCalendar feeds (downloadable .ics files):
+ - Download and compare sets of iCalendar files obtained on
+ different dates to generate changelogs of added/removed events.
+ - View current schedules, optionally filtered by start date
+ or event summary text.
+ - Classify events based on user-specified criteria
+ (e.g., categorize events whose start time falls between
+ range Xpm-Ypm as being "Workshift A" events, and those with
+ start times in a different range as "Workshift B" events).
+ - Export filtered events from calendars to CSV files,
+ using user-specified filter criteria (e.g., workshifts)
+ and user-specified formatting.
+- Limitations:
+ - ionical only deals with iCalendar start times
+ and summary text fields, and ignores other fields.
+ This proves adequate for many simple use cases (e.g., it was
+ designed to track changes to employee schedules on
+ [Amion](https://amion.com/), and has worked well for that). For iCalendar management
+ involving additional fields or more complex use cases, you'll need to
+ look at other tools (or submit a pull request! :) ).
+
+
+
+## Installing via pip:
+```
+$ pip install ionical
+$ ionical
+```
+- The first time you run ionical there will be no
+ ionical_config.toml file present, and you'll be
+ prompted to generate one (in the current directory).
+ Once it is created, you can add the names and URLs
+ for calendars you want to track/monitor, and specify
+ multilple other configuration options.
+
+
+## Installing for development from GitHub:
+```
+$ git clone https://github.com/danyul/ionical
+$ cd ionical
+$ python3 -m venv env
+$ source env/bin/activate
+$ pip install -e ".[dev]"
+$ python -m ionical
+```
+- If on Windows, replace:
+ - **'source env/bin/activate'** with **'.\env\Scripts\activate'**
+ - **'python3'** with **'python'**
+
+
+## Command line usage ('ionical -h' output):
+```
+
+
+Usage: ionical [-h] [-v] [-V]
+ [-f CONFIG_DIRECTORY] [-d ICS_DIR]
+ [-g] [-s] [-l [#_COMPARISONS]] [-c [CSV_FILE]]
+ [-i NAME [NAME ...]]
+ [-a DATE_OR_NUMBER] [-b DATE_OR_NUMBER] [-t TEXT [TEXT ...]]
+
+Keep an eye on ical! ionical is a CLI tool to track iCalendar changes.
+
+Help/About:
+ -h, --help Print help message, then exit.
+ -v, --verbose Increase the level of printed feeedback.
+ -V, --version Print version, then exit.
+
+File Locations:
+ Specify expected locations for config files and calendar downloads.
+
+ -f CONFIG_DIRECTORY Directory where config file ionical_config.toml located.
+ This file will contain basic calendar information
+ (names, URLs for .ics files, and timezones) and allows
+ various additional configuration options.
+ See README file for an example, or run 'ionical' to
+ generate a sample config file which may then be edited.
+ (default: current directory)
+
+ -d ICS_DIR Directory for downloading/accessing .ics files.
+ (default: current directory)
+
+
+Actions:
+ One or more action options MUST be specified.
+
+ -g, --get_today Download current .ics files and label them with today's
+ date. This will be done prior to other actions.
+ (If this is left unspecified, operations will only use
+ .ics files that have been previously downloaded.)
+
+ -s, --show Display events from most recent ical file version for
+ each calendar.
+
+ -l [#_COMPARISONS] Show changelogs comparing calendar versions from
+ multiple dates. Optionally, specify the number of
+ prior versions (per each calendar) for which to show
+ comparison changelogs. (If left unspecified,
+ #_COMPARISONS default is 2.)
+
+ -c [CSV_FILE] Export calendar events to csv.
+
+
+Calendar Filters:
+ Restrict all actions to a subset of calendars.
+
+ -i NAME [NAME ...] Only operate on calendars with a specified NAME.
+ (If -i not specified, operate on every calendar
+ listed in ionical_config.toml.)
+
+
+Event Filters:
+ Filter events shown in changelogs, schedule displays
+
+ -a DATE_OR_NUMBER Only include events that start AFTER a specified date.
+ (I.e., exclude events starting before the date.)
+ Value must be EITHER a date in format YYYY-MM-DD, or
+ a positive integer representing # of days in the past
+ (If option unspecified, default behavior is to exclude
+ any events starting prior to 1 day ago.)
+
+ -b DATE_OR_NUMBER Only include events that start BEFORE a specified date.
+ (I.e., exclude events starting on or after the date.)
+ Value must be EITHER a date in format YYYY-MM-DD, or
+ a positive integer representing # of days in the future.
+ (If option unspecified, default behavior is to
+ have no upper limit on event dates.)
+
+ -t TEXT [TEXT ...] Only include events whose summary text includes words
+ that match at least one TEXT item. TEXT items can be
+ either a single word or phrases comprised of words and
+ spaces. If the latter, you must enclose TEXT within
+ quotation marks.
+ (If option not specified, no text filters are applied.)
+
+```
+
+
+
+## ionical configuration file:
+```
+# ionical_config.toml
+
+title = "ionical configuration file"
+verbose = true
+
+# Note: All options that can be specified on the command line may
+# alternatively be specified in this config file. For example,
+# uncommenting 'get_today = true' (below) has the same effect as running
+# 'ionical -g' (i.e., today's ics files will be downloaded). Likewise,
+# uncommenting 'export_csv = ["CAL_1_NAME"]' is equivalent to running
+# ionical using the argument/parameter '-i CAL_1_NAME'.
+#
+# Note: If configuration is specified both in this config file AND via
+# a command line argument, the command line argument takes precedence, and
+# the information from the config file is ignored.
+
+[actions]
+ # restrict_to = ["CAL_1_NAME"]
+ # get_today = true
+ # show_schedule = true
+ # show_changelog = true
+ # num_changelogs = 2
+ # export_csv = true
+
+[filters]
+ # earliest = 2020-11-01
+ # latest = 2022-06-30
+ # summary_text = ["search text 1", "search text two"]
+
+
+[calendars]
+
+ [calendars.CAL1_NAME]
+ description = "CAL1_LONG_NAME"
+ url = "http://url_to_ics_download_for_CAL_1.ics"
+ tz = "US/Eastern" # or other timezone in pytz format, for CAL1
+
+ [calendars.CAL2_NAME]
+ description = "CAL2_LONG_NAME"
+ url = "http://url_to_ics_download_for_CAL_2.ics"
+ tz = "US/Mountain" # or other timezone in pytz format, for CAL2
+
+
+[event_classifications]
+ [event_classifications.by_start_time]
+ [event_classifications.by_start_time.example_time_category]
+
+ Morning = [
+ [5, 12], # Any event starting between 5am and 12pm
+ ] # is categorized as "Morning"
+ Afternoon = [
+ [12, 16], # Any event starting between 12p and 4pm
+ ] # is categorized as "Afternoon"
+ Evening = [
+ [16, 20], # Any event starting between 4pm and 8pm
+ ] # is categorized as "Evening"
+ Night = [
+ [20, 24], # Any event that starts between 8pm
+ [ 0, 4], # and 4am is categorized as "Night"
+ ]
+ All-Day = "missing" # If no start time, categorize as "All-Day"
+ Other = "default" # All other events (in this case, only
+ # events starting between 4 and 5 am) will
+ # be categorized as "Unspecified".
+
+
+[csv]
+ file = "ionical_export_default_csv_filename.csv"
+ include_empty_dates = false
+ grouping = "example_time_category"
+ order = ["Morning", "Afternoon"]
+ format = "My morning events: {0} \n My afternoon events: {1}"
+ text_if_not_present = "I AM AVAILABLE"
+
+ [csv.substitutions]
+ "Secret spy meeting with Carl" = "Going to the zoo"
+ "Present shopping to suprise JoJo" = "Flossing the cat"
+
+# You can tweak the below to change display formatting
+[formatting]
+
+ [formatting.schedule_view] # For displaying schedules (-s option):
+
+ date_fmt = "%a, %b %d %Y"
+ time_fmt = "at %I:%M%p"
+ time_replacements = {" 0" = " ", "(0" = "(", "AM" = "am", "PM" = "pm"}
+ time_group = "example_time_category"
+ time_group_fmt = "{:>} Time"
+
+ event_summary = " {0:16} {1:10} ({2:<}) {3:30}"
+
+ # Meanings for event_summary fields:
+ # 0: date (further formatted by date_fmt variable)
+ # 1: time (further formatted by time_fmt and/or time_replacements)
+ # 2: user_defined time grouping (further formatted by time_group_fmt)
+ # 3: event summary text
+
+
+ [formatting.changelog] # For displaying changelogs (-l option):
+
+ date_fmt = "%a, %b %d %Y"
+ time_fmt = " %I%p"
+ time_replacements = {" 0" = " ", "(0" = "(", "AM" = "am", "PM" = "pm"}
+
+ change_report = " {label:10}{name:18}{start_str:19} {summary:30} [comp vers:{compare_date}]\\n"
+
+ # Meanings for change_report fields:
+ # label : "ADD" if an event has been added or "REMOVE" if removed
+ # (modifying a schedule's time or event summary will
+ # show up as a combination of a removal and an addition).
+ # name : The Full Name of a calendar.
+ # start_str : A string representing an event's start date and time.
+ # summary: : The event's summary text
+ # compare_date : The date of the second-most-recentics file for this
+ # calendar, against which the changelog is being compared.
+
+
+```
+
+ - Timezones are in pytz format, e.g., "US/Eastern".
+ Listing of pytz timezones [can be found here](https://stackoverflow.com/questions/13866926/is-there-a-list-of-pytz-timezones).
+ - The calendar **NAME**:
+ - Serves as an ID when asking ionical (via -i option)
+ to restrict actions to a subset of calendars.
+ - Serves as the leftmost part of the filename for
+ downloaded ics files.
+ - Shouldn't have spaces or non-alphanumeric characters.
+ - The calendar **LONG NAME**:
+ - Is used for display purposes.
+
+
+## Note on filename format for downloaded ics files:
+
+ Downloaded .ics files have a filename format of
+ ABC123__20200314.ics, where "ABC123" is a name
+ identifier. (A reasonable name for a calendar
+ which tracks an employee's work schedule might
+ be a last name or an employee ID number.) Names
+ should contain only alphanumeric characters.
+
+ "20200314" indicates that this particular version
+ of the calendar was downloaded on March 14, 2020.
+
+
+# Libraries used
+
+- [icalendar](https://pypi.org/project/icalendar/)
+- [pytz](https://pypi.org/project/pytz/)
+- [recurring_ical_events](https://pypi.org/project/recurring-ical-events/)
+ (which, in turn, uses [python-dateutil](https://pypi.org/project/python-dateutil/))
+- [toml](https://pypi.org/project/toml/)
+
+# Related projects
+
+- [icalevents](https://github.com/irgangla/icalevents)
+- [gcalcii](https://github.com/insanum/gcalcli)
+- [vobject](https://pypi.org/project/vobject/)
+
+
+# 0.1.0
+Initial release
+
+# 0.2.0 (12/8/2020)
+- Substantial help message cleanup
+- Changed/renamed multiple CLI options
+
+# 0.2.5 (12/9/2020)
+- Google Calendar event viewing working
+
+# 0.3.0
+- Removed hacky csv functionality for now
+
+
+
+%package -n python3-ionical
+Summary: command line tool for tracking ical changes
+Provides: python-ionical
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-ionical
+
+# ionical: Keep an eye on ical!
+
+
+- **ionical** is a command line tool for tracking schedule changes
+ in iCalendar feeds (downloadable .ics files):
+ - Download and compare sets of iCalendar files obtained on
+ different dates to generate changelogs of added/removed events.
+ - View current schedules, optionally filtered by start date
+ or event summary text.
+ - Classify events based on user-specified criteria
+ (e.g., categorize events whose start time falls between
+ range Xpm-Ypm as being "Workshift A" events, and those with
+ start times in a different range as "Workshift B" events).
+ - Export filtered events from calendars to CSV files,
+ using user-specified filter criteria (e.g., workshifts)
+ and user-specified formatting.
+- Limitations:
+ - ionical only deals with iCalendar start times
+ and summary text fields, and ignores other fields.
+ This proves adequate for many simple use cases (e.g., it was
+ designed to track changes to employee schedules on
+ [Amion](https://amion.com/), and has worked well for that). For iCalendar management
+ involving additional fields or more complex use cases, you'll need to
+ look at other tools (or submit a pull request! :) ).
+
+
+
+## Installing via pip:
+```
+$ pip install ionical
+$ ionical
+```
+- The first time you run ionical there will be no
+ ionical_config.toml file present, and you'll be
+ prompted to generate one (in the current directory).
+ Once it is created, you can add the names and URLs
+ for calendars you want to track/monitor, and specify
+ multilple other configuration options.
+
+
+## Installing for development from GitHub:
+```
+$ git clone https://github.com/danyul/ionical
+$ cd ionical
+$ python3 -m venv env
+$ source env/bin/activate
+$ pip install -e ".[dev]"
+$ python -m ionical
+```
+- If on Windows, replace:
+ - **'source env/bin/activate'** with **'.\env\Scripts\activate'**
+ - **'python3'** with **'python'**
+
+
+## Command line usage ('ionical -h' output):
+```
+
+
+Usage: ionical [-h] [-v] [-V]
+ [-f CONFIG_DIRECTORY] [-d ICS_DIR]
+ [-g] [-s] [-l [#_COMPARISONS]] [-c [CSV_FILE]]
+ [-i NAME [NAME ...]]
+ [-a DATE_OR_NUMBER] [-b DATE_OR_NUMBER] [-t TEXT [TEXT ...]]
+
+Keep an eye on ical! ionical is a CLI tool to track iCalendar changes.
+
+Help/About:
+ -h, --help Print help message, then exit.
+ -v, --verbose Increase the level of printed feeedback.
+ -V, --version Print version, then exit.
+
+File Locations:
+ Specify expected locations for config files and calendar downloads.
+
+ -f CONFIG_DIRECTORY Directory where config file ionical_config.toml located.
+ This file will contain basic calendar information
+ (names, URLs for .ics files, and timezones) and allows
+ various additional configuration options.
+ See README file for an example, or run 'ionical' to
+ generate a sample config file which may then be edited.
+ (default: current directory)
+
+ -d ICS_DIR Directory for downloading/accessing .ics files.
+ (default: current directory)
+
+
+Actions:
+ One or more action options MUST be specified.
+
+ -g, --get_today Download current .ics files and label them with today's
+ date. This will be done prior to other actions.
+ (If this is left unspecified, operations will only use
+ .ics files that have been previously downloaded.)
+
+ -s, --show Display events from most recent ical file version for
+ each calendar.
+
+ -l [#_COMPARISONS] Show changelogs comparing calendar versions from
+ multiple dates. Optionally, specify the number of
+ prior versions (per each calendar) for which to show
+ comparison changelogs. (If left unspecified,
+ #_COMPARISONS default is 2.)
+
+ -c [CSV_FILE] Export calendar events to csv.
+
+
+Calendar Filters:
+ Restrict all actions to a subset of calendars.
+
+ -i NAME [NAME ...] Only operate on calendars with a specified NAME.
+ (If -i not specified, operate on every calendar
+ listed in ionical_config.toml.)
+
+
+Event Filters:
+ Filter events shown in changelogs, schedule displays
+
+ -a DATE_OR_NUMBER Only include events that start AFTER a specified date.
+ (I.e., exclude events starting before the date.)
+ Value must be EITHER a date in format YYYY-MM-DD, or
+ a positive integer representing # of days in the past
+ (If option unspecified, default behavior is to exclude
+ any events starting prior to 1 day ago.)
+
+ -b DATE_OR_NUMBER Only include events that start BEFORE a specified date.
+ (I.e., exclude events starting on or after the date.)
+ Value must be EITHER a date in format YYYY-MM-DD, or
+ a positive integer representing # of days in the future.
+ (If option unspecified, default behavior is to
+ have no upper limit on event dates.)
+
+ -t TEXT [TEXT ...] Only include events whose summary text includes words
+ that match at least one TEXT item. TEXT items can be
+ either a single word or phrases comprised of words and
+ spaces. If the latter, you must enclose TEXT within
+ quotation marks.
+ (If option not specified, no text filters are applied.)
+
+```
+
+
+
+## ionical configuration file:
+```
+# ionical_config.toml
+
+title = "ionical configuration file"
+verbose = true
+
+# Note: All options that can be specified on the command line may
+# alternatively be specified in this config file. For example,
+# uncommenting 'get_today = true' (below) has the same effect as running
+# 'ionical -g' (i.e., today's ics files will be downloaded). Likewise,
+# uncommenting 'export_csv = ["CAL_1_NAME"]' is equivalent to running
+# ionical using the argument/parameter '-i CAL_1_NAME'.
+#
+# Note: If configuration is specified both in this config file AND via
+# a command line argument, the command line argument takes precedence, and
+# the information from the config file is ignored.
+
+[actions]
+ # restrict_to = ["CAL_1_NAME"]
+ # get_today = true
+ # show_schedule = true
+ # show_changelog = true
+ # num_changelogs = 2
+ # export_csv = true
+
+[filters]
+ # earliest = 2020-11-01
+ # latest = 2022-06-30
+ # summary_text = ["search text 1", "search text two"]
+
+
+[calendars]
+
+ [calendars.CAL1_NAME]
+ description = "CAL1_LONG_NAME"
+ url = "http://url_to_ics_download_for_CAL_1.ics"
+ tz = "US/Eastern" # or other timezone in pytz format, for CAL1
+
+ [calendars.CAL2_NAME]
+ description = "CAL2_LONG_NAME"
+ url = "http://url_to_ics_download_for_CAL_2.ics"
+ tz = "US/Mountain" # or other timezone in pytz format, for CAL2
+
+
+[event_classifications]
+ [event_classifications.by_start_time]
+ [event_classifications.by_start_time.example_time_category]
+
+ Morning = [
+ [5, 12], # Any event starting between 5am and 12pm
+ ] # is categorized as "Morning"
+ Afternoon = [
+ [12, 16], # Any event starting between 12p and 4pm
+ ] # is categorized as "Afternoon"
+ Evening = [
+ [16, 20], # Any event starting between 4pm and 8pm
+ ] # is categorized as "Evening"
+ Night = [
+ [20, 24], # Any event that starts between 8pm
+ [ 0, 4], # and 4am is categorized as "Night"
+ ]
+ All-Day = "missing" # If no start time, categorize as "All-Day"
+ Other = "default" # All other events (in this case, only
+ # events starting between 4 and 5 am) will
+ # be categorized as "Unspecified".
+
+
+[csv]
+ file = "ionical_export_default_csv_filename.csv"
+ include_empty_dates = false
+ grouping = "example_time_category"
+ order = ["Morning", "Afternoon"]
+ format = "My morning events: {0} \n My afternoon events: {1}"
+ text_if_not_present = "I AM AVAILABLE"
+
+ [csv.substitutions]
+ "Secret spy meeting with Carl" = "Going to the zoo"
+ "Present shopping to suprise JoJo" = "Flossing the cat"
+
+# You can tweak the below to change display formatting
+[formatting]
+
+ [formatting.schedule_view] # For displaying schedules (-s option):
+
+ date_fmt = "%a, %b %d %Y"
+ time_fmt = "at %I:%M%p"
+ time_replacements = {" 0" = " ", "(0" = "(", "AM" = "am", "PM" = "pm"}
+ time_group = "example_time_category"
+ time_group_fmt = "{:>} Time"
+
+ event_summary = " {0:16} {1:10} ({2:<}) {3:30}"
+
+ # Meanings for event_summary fields:
+ # 0: date (further formatted by date_fmt variable)
+ # 1: time (further formatted by time_fmt and/or time_replacements)
+ # 2: user_defined time grouping (further formatted by time_group_fmt)
+ # 3: event summary text
+
+
+ [formatting.changelog] # For displaying changelogs (-l option):
+
+ date_fmt = "%a, %b %d %Y"
+ time_fmt = " %I%p"
+ time_replacements = {" 0" = " ", "(0" = "(", "AM" = "am", "PM" = "pm"}
+
+ change_report = " {label:10}{name:18}{start_str:19} {summary:30} [comp vers:{compare_date}]\\n"
+
+ # Meanings for change_report fields:
+ # label : "ADD" if an event has been added or "REMOVE" if removed
+ # (modifying a schedule's time or event summary will
+ # show up as a combination of a removal and an addition).
+ # name : The Full Name of a calendar.
+ # start_str : A string representing an event's start date and time.
+ # summary: : The event's summary text
+ # compare_date : The date of the second-most-recentics file for this
+ # calendar, against which the changelog is being compared.
+
+
+```
+
+ - Timezones are in pytz format, e.g., "US/Eastern".
+ Listing of pytz timezones [can be found here](https://stackoverflow.com/questions/13866926/is-there-a-list-of-pytz-timezones).
+ - The calendar **NAME**:
+ - Serves as an ID when asking ionical (via -i option)
+ to restrict actions to a subset of calendars.
+ - Serves as the leftmost part of the filename for
+ downloaded ics files.
+ - Shouldn't have spaces or non-alphanumeric characters.
+ - The calendar **LONG NAME**:
+ - Is used for display purposes.
+
+
+## Note on filename format for downloaded ics files:
+
+ Downloaded .ics files have a filename format of
+ ABC123__20200314.ics, where "ABC123" is a name
+ identifier. (A reasonable name for a calendar
+ which tracks an employee's work schedule might
+ be a last name or an employee ID number.) Names
+ should contain only alphanumeric characters.
+
+ "20200314" indicates that this particular version
+ of the calendar was downloaded on March 14, 2020.
+
+
+# Libraries used
+
+- [icalendar](https://pypi.org/project/icalendar/)
+- [pytz](https://pypi.org/project/pytz/)
+- [recurring_ical_events](https://pypi.org/project/recurring-ical-events/)
+ (which, in turn, uses [python-dateutil](https://pypi.org/project/python-dateutil/))
+- [toml](https://pypi.org/project/toml/)
+
+# Related projects
+
+- [icalevents](https://github.com/irgangla/icalevents)
+- [gcalcii](https://github.com/insanum/gcalcli)
+- [vobject](https://pypi.org/project/vobject/)
+
+
+# 0.1.0
+Initial release
+
+# 0.2.0 (12/8/2020)
+- Substantial help message cleanup
+- Changed/renamed multiple CLI options
+
+# 0.2.5 (12/9/2020)
+- Google Calendar event viewing working
+
+# 0.3.0
+- Removed hacky csv functionality for now
+
+
+
+%package help
+Summary: Development documents and examples for ionical
+Provides: python3-ionical-doc
+%description help
+
+# ionical: Keep an eye on ical!
+
+
+- **ionical** is a command line tool for tracking schedule changes
+ in iCalendar feeds (downloadable .ics files):
+ - Download and compare sets of iCalendar files obtained on
+ different dates to generate changelogs of added/removed events.
+ - View current schedules, optionally filtered by start date
+ or event summary text.
+ - Classify events based on user-specified criteria
+ (e.g., categorize events whose start time falls between
+ range Xpm-Ypm as being "Workshift A" events, and those with
+ start times in a different range as "Workshift B" events).
+ - Export filtered events from calendars to CSV files,
+ using user-specified filter criteria (e.g., workshifts)
+ and user-specified formatting.
+- Limitations:
+ - ionical only deals with iCalendar start times
+ and summary text fields, and ignores other fields.
+ This proves adequate for many simple use cases (e.g., it was
+ designed to track changes to employee schedules on
+ [Amion](https://amion.com/), and has worked well for that). For iCalendar management
+ involving additional fields or more complex use cases, you'll need to
+ look at other tools (or submit a pull request! :) ).
+
+
+
+## Installing via pip:
+```
+$ pip install ionical
+$ ionical
+```
+- The first time you run ionical there will be no
+ ionical_config.toml file present, and you'll be
+ prompted to generate one (in the current directory).
+ Once it is created, you can add the names and URLs
+ for calendars you want to track/monitor, and specify
+ multilple other configuration options.
+
+
+## Installing for development from GitHub:
+```
+$ git clone https://github.com/danyul/ionical
+$ cd ionical
+$ python3 -m venv env
+$ source env/bin/activate
+$ pip install -e ".[dev]"
+$ python -m ionical
+```
+- If on Windows, replace:
+ - **'source env/bin/activate'** with **'.\env\Scripts\activate'**
+ - **'python3'** with **'python'**
+
+
+## Command line usage ('ionical -h' output):
+```
+
+
+Usage: ionical [-h] [-v] [-V]
+ [-f CONFIG_DIRECTORY] [-d ICS_DIR]
+ [-g] [-s] [-l [#_COMPARISONS]] [-c [CSV_FILE]]
+ [-i NAME [NAME ...]]
+ [-a DATE_OR_NUMBER] [-b DATE_OR_NUMBER] [-t TEXT [TEXT ...]]
+
+Keep an eye on ical! ionical is a CLI tool to track iCalendar changes.
+
+Help/About:
+ -h, --help Print help message, then exit.
+ -v, --verbose Increase the level of printed feeedback.
+ -V, --version Print version, then exit.
+
+File Locations:
+ Specify expected locations for config files and calendar downloads.
+
+ -f CONFIG_DIRECTORY Directory where config file ionical_config.toml located.
+ This file will contain basic calendar information
+ (names, URLs for .ics files, and timezones) and allows
+ various additional configuration options.
+ See README file for an example, or run 'ionical' to
+ generate a sample config file which may then be edited.
+ (default: current directory)
+
+ -d ICS_DIR Directory for downloading/accessing .ics files.
+ (default: current directory)
+
+
+Actions:
+ One or more action options MUST be specified.
+
+ -g, --get_today Download current .ics files and label them with today's
+ date. This will be done prior to other actions.
+ (If this is left unspecified, operations will only use
+ .ics files that have been previously downloaded.)
+
+ -s, --show Display events from most recent ical file version for
+ each calendar.
+
+ -l [#_COMPARISONS] Show changelogs comparing calendar versions from
+ multiple dates. Optionally, specify the number of
+ prior versions (per each calendar) for which to show
+ comparison changelogs. (If left unspecified,
+ #_COMPARISONS default is 2.)
+
+ -c [CSV_FILE] Export calendar events to csv.
+
+
+Calendar Filters:
+ Restrict all actions to a subset of calendars.
+
+ -i NAME [NAME ...] Only operate on calendars with a specified NAME.
+ (If -i not specified, operate on every calendar
+ listed in ionical_config.toml.)
+
+
+Event Filters:
+ Filter events shown in changelogs, schedule displays
+
+ -a DATE_OR_NUMBER Only include events that start AFTER a specified date.
+ (I.e., exclude events starting before the date.)
+ Value must be EITHER a date in format YYYY-MM-DD, or
+ a positive integer representing # of days in the past
+ (If option unspecified, default behavior is to exclude
+ any events starting prior to 1 day ago.)
+
+ -b DATE_OR_NUMBER Only include events that start BEFORE a specified date.
+ (I.e., exclude events starting on or after the date.)
+ Value must be EITHER a date in format YYYY-MM-DD, or
+ a positive integer representing # of days in the future.
+ (If option unspecified, default behavior is to
+ have no upper limit on event dates.)
+
+ -t TEXT [TEXT ...] Only include events whose summary text includes words
+ that match at least one TEXT item. TEXT items can be
+ either a single word or phrases comprised of words and
+ spaces. If the latter, you must enclose TEXT within
+ quotation marks.
+ (If option not specified, no text filters are applied.)
+
+```
+
+
+
+## ionical configuration file:
+```
+# ionical_config.toml
+
+title = "ionical configuration file"
+verbose = true
+
+# Note: All options that can be specified on the command line may
+# alternatively be specified in this config file. For example,
+# uncommenting 'get_today = true' (below) has the same effect as running
+# 'ionical -g' (i.e., today's ics files will be downloaded). Likewise,
+# uncommenting 'export_csv = ["CAL_1_NAME"]' is equivalent to running
+# ionical using the argument/parameter '-i CAL_1_NAME'.
+#
+# Note: If configuration is specified both in this config file AND via
+# a command line argument, the command line argument takes precedence, and
+# the information from the config file is ignored.
+
+[actions]
+ # restrict_to = ["CAL_1_NAME"]
+ # get_today = true
+ # show_schedule = true
+ # show_changelog = true
+ # num_changelogs = 2
+ # export_csv = true
+
+[filters]
+ # earliest = 2020-11-01
+ # latest = 2022-06-30
+ # summary_text = ["search text 1", "search text two"]
+
+
+[calendars]
+
+ [calendars.CAL1_NAME]
+ description = "CAL1_LONG_NAME"
+ url = "http://url_to_ics_download_for_CAL_1.ics"
+ tz = "US/Eastern" # or other timezone in pytz format, for CAL1
+
+ [calendars.CAL2_NAME]
+ description = "CAL2_LONG_NAME"
+ url = "http://url_to_ics_download_for_CAL_2.ics"
+ tz = "US/Mountain" # or other timezone in pytz format, for CAL2
+
+
+[event_classifications]
+ [event_classifications.by_start_time]
+ [event_classifications.by_start_time.example_time_category]
+
+ Morning = [
+ [5, 12], # Any event starting between 5am and 12pm
+ ] # is categorized as "Morning"
+ Afternoon = [
+ [12, 16], # Any event starting between 12p and 4pm
+ ] # is categorized as "Afternoon"
+ Evening = [
+ [16, 20], # Any event starting between 4pm and 8pm
+ ] # is categorized as "Evening"
+ Night = [
+ [20, 24], # Any event that starts between 8pm
+ [ 0, 4], # and 4am is categorized as "Night"
+ ]
+ All-Day = "missing" # If no start time, categorize as "All-Day"
+ Other = "default" # All other events (in this case, only
+ # events starting between 4 and 5 am) will
+ # be categorized as "Unspecified".
+
+
+[csv]
+ file = "ionical_export_default_csv_filename.csv"
+ include_empty_dates = false
+ grouping = "example_time_category"
+ order = ["Morning", "Afternoon"]
+ format = "My morning events: {0} \n My afternoon events: {1}"
+ text_if_not_present = "I AM AVAILABLE"
+
+ [csv.substitutions]
+ "Secret spy meeting with Carl" = "Going to the zoo"
+ "Present shopping to suprise JoJo" = "Flossing the cat"
+
+# You can tweak the below to change display formatting
+[formatting]
+
+ [formatting.schedule_view] # For displaying schedules (-s option):
+
+ date_fmt = "%a, %b %d %Y"
+ time_fmt = "at %I:%M%p"
+ time_replacements = {" 0" = " ", "(0" = "(", "AM" = "am", "PM" = "pm"}
+ time_group = "example_time_category"
+ time_group_fmt = "{:>} Time"
+
+ event_summary = " {0:16} {1:10} ({2:<}) {3:30}"
+
+ # Meanings for event_summary fields:
+ # 0: date (further formatted by date_fmt variable)
+ # 1: time (further formatted by time_fmt and/or time_replacements)
+ # 2: user_defined time grouping (further formatted by time_group_fmt)
+ # 3: event summary text
+
+
+ [formatting.changelog] # For displaying changelogs (-l option):
+
+ date_fmt = "%a, %b %d %Y"
+ time_fmt = " %I%p"
+ time_replacements = {" 0" = " ", "(0" = "(", "AM" = "am", "PM" = "pm"}
+
+ change_report = " {label:10}{name:18}{start_str:19} {summary:30} [comp vers:{compare_date}]\\n"
+
+ # Meanings for change_report fields:
+ # label : "ADD" if an event has been added or "REMOVE" if removed
+ # (modifying a schedule's time or event summary will
+ # show up as a combination of a removal and an addition).
+ # name : The Full Name of a calendar.
+ # start_str : A string representing an event's start date and time.
+ # summary: : The event's summary text
+ # compare_date : The date of the second-most-recentics file for this
+ # calendar, against which the changelog is being compared.
+
+
+```
+
+ - Timezones are in pytz format, e.g., "US/Eastern".
+ Listing of pytz timezones [can be found here](https://stackoverflow.com/questions/13866926/is-there-a-list-of-pytz-timezones).
+ - The calendar **NAME**:
+ - Serves as an ID when asking ionical (via -i option)
+ to restrict actions to a subset of calendars.
+ - Serves as the leftmost part of the filename for
+ downloaded ics files.
+ - Shouldn't have spaces or non-alphanumeric characters.
+ - The calendar **LONG NAME**:
+ - Is used for display purposes.
+
+
+## Note on filename format for downloaded ics files:
+
+ Downloaded .ics files have a filename format of
+ ABC123__20200314.ics, where "ABC123" is a name
+ identifier. (A reasonable name for a calendar
+ which tracks an employee's work schedule might
+ be a last name or an employee ID number.) Names
+ should contain only alphanumeric characters.
+
+ "20200314" indicates that this particular version
+ of the calendar was downloaded on March 14, 2020.
+
+
+# Libraries used
+
+- [icalendar](https://pypi.org/project/icalendar/)
+- [pytz](https://pypi.org/project/pytz/)
+- [recurring_ical_events](https://pypi.org/project/recurring-ical-events/)
+ (which, in turn, uses [python-dateutil](https://pypi.org/project/python-dateutil/))
+- [toml](https://pypi.org/project/toml/)
+
+# Related projects
+
+- [icalevents](https://github.com/irgangla/icalevents)
+- [gcalcii](https://github.com/insanum/gcalcli)
+- [vobject](https://pypi.org/project/vobject/)
+
+
+# 0.1.0
+Initial release
+
+# 0.2.0 (12/8/2020)
+- Substantial help message cleanup
+- Changed/renamed multiple CLI options
+
+# 0.2.5 (12/9/2020)
+- Google Calendar event viewing working
+
+# 0.3.0
+- Removed hacky csv functionality for now
+
+
+
+%prep
+%autosetup -n ionical-0.5.13
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-ionical -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Tue Jun 20 2023 Python_Bot <Python_Bot@openeuler.org> - 0.5.13-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..e557248
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+b4f3189bb8cb60475bce281b2e167bfe ionical-0.5.13.tar.gz