ics-query 0.1.1a0__py3-none-any.whl → 0.3.0b0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. ics_query/__init__.py +3 -2
  2. ics_query/_version.py +2 -2
  3. ics_query/cli.py +406 -23
  4. ics_query/parse.py +26 -4
  5. ics_query/query.py +54 -0
  6. ics_query/tests/runs/all --tz Singapore one-event.ics -.run +9 -0
  7. ics_query/tests/runs/all three-events.ics -.run +33 -0
  8. ics_query/tests/runs/at 2024-08-20 Berlin-Los-Angeles.ics -.run +23 -0
  9. ics_query/tests/runs/between 20240823 4d recurring-work-events.ics -.run +24 -0
  10. ics_query/tests/runs/calendars/Berlin-Los-Angeles.ics +381 -0
  11. ics_query/tests/runs/calendars/empty-calendar.ics +7 -0
  12. ics_query/tests/runs/calendars/empty-file.ics +0 -0
  13. ics_query/tests/runs/calendars/recurring-work-events.ics +223 -0
  14. ics_query/tests/runs/calendars/simple-journal.ics +15 -0
  15. ics_query/tests/runs/calendars/simple-todo.ics +15 -0
  16. ics_query/tests/runs/calendars/three-events.ics +37 -0
  17. ics_query/tests/runs/first -c VJOURNAL -c VEVENT one-event.ics -.run +9 -0
  18. ics_query/tests/runs/first -c VJOURNAL one-event.ics -.run +0 -0
  19. ics_query/tests/runs/first -c VJOURNAL simple-journal.ics -.run +12 -0
  20. ics_query/tests/runs/first -c VTODO -c VJOURNAL simple-todo.ics -.run +10 -0
  21. ics_query/tests/runs/first -c VTODO simple-todo.ics -.run +10 -0
  22. ics_query/tests/runs/first empty-calendar.ics -.run +0 -0
  23. ics_query/tests/runs/first empty-file.ics -.run +0 -0
  24. ics_query/tests/runs/first recurring-work-events.ics -.run +12 -0
  25. ics_query/tests/test_command_line.py +11 -0
  26. ics_query/tests/test_parse_date.py +8 -5
  27. ics_query/tests/test_parse_timedelta.py +25 -0
  28. ics_query/version.py +19 -0
  29. {ics_query-0.1.1a0.dist-info → ics_query-0.3.0b0.dist-info}/METADATA +194 -44
  30. ics_query-0.3.0b0.dist-info/RECORD +43 -0
  31. ics_query-0.1.1a0.dist-info/RECORD +0 -22
  32. {ics_query-0.1.1a0.dist-info → ics_query-0.3.0b0.dist-info}/WHEEL +0 -0
  33. {ics_query-0.1.1a0.dist-info → ics_query-0.3.0b0.dist-info}/entry_points.txt +0 -0
  34. {ics_query-0.1.1a0.dist-info → ics_query-0.3.0b0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,37 @@
1
+ BEGIN:VCALENDAR
2
+ VERSION:2.0
3
+ PRODID:-//SabreDAV//SabreDAV//EN
4
+ CALSCALE:GREGORIAN
5
+ X-WR-CALNAME:test
6
+ X-APPLE-CALENDAR-COLOR:#e78074
7
+ BEGIN:VTIMEZONE
8
+ TZID:Europe/Berlin
9
+ X-LIC-LOCATION:Europe/Berlin
10
+ BEGIN:DAYLIGHT
11
+ TZOFFSETFROM:+0100
12
+ TZOFFSETTO:+0200
13
+ TZNAME:CEST
14
+ DTSTART:19700329T020000
15
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
16
+ END:DAYLIGHT
17
+ BEGIN:STANDARD
18
+ TZOFFSETFROM:+0200
19
+ TZOFFSETTO:+0100
20
+ TZNAME:CET
21
+ DTSTART:19701025T030000
22
+ RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
23
+ END:STANDARD
24
+ END:VTIMEZONE
25
+ BEGIN:VEVENT
26
+ CREATED:20190303T111937
27
+ DTSTAMP:20190303T111937
28
+ LAST-MODIFIED:20190303T111937
29
+ UID:UYDQSG9TH4DE0WM3QFL2J
30
+ SUMMARY:test4
31
+ CLASS:PUBLIC
32
+ STATUS:CONFIRMED
33
+ RRULE:FREQ=DAILY;COUNT=3;INTERVAL=3
34
+ DTSTART;TZID=Europe/Berlin:20190304T000000
35
+ DTEND;TZID=Europe/Berlin:20190304T010000
36
+ END:VEVENT
37
+ END:VCALENDAR
@@ -0,0 +1,9 @@
1
+ BEGIN:VEVENT
2
+ SUMMARY:test1
3
+ DTSTART;TZID=Europe/Berlin:20190304T080000
4
+ DTEND;TZID=Europe/Berlin:20190304T083000
5
+ DTSTAMP:20190303T111937
6
+ UID:UYDQSG9TH4DE0WM3QFL2J
7
+ CREATED:20190303T111937
8
+ LAST-MODIFIED:20190303T111937
9
+ END:VEVENT
@@ -0,0 +1,12 @@
1
+ BEGIN:VJOURNAL
2
+ CATEGORIES:FAMILY,FINANCE
3
+ CLASS:CONFIDENTIAL
4
+ DESCRIPTION:We made it this year too. Probably. What's the point of a re
5
+ curring journal entry? Journals are supposed to describe past events\, ar
6
+ en't they?
7
+ DTSTAMP:19920901T130000Z
8
+ DTSTART;VALUE=DATE:19920420
9
+ PRIORITY:1
10
+ SUMMARY:Yearly Income Tax Report
11
+ UID:19920901T130000Z-123409@host.com
12
+ END:VJOURNAL
@@ -0,0 +1,10 @@
1
+ BEGIN:VTODO
2
+ CATEGORIES:FAMILY,FINANCE
3
+ CLASS:CONFIDENTIAL
4
+ DTSTAMP:19920901T130000Z
5
+ DTSTART:19920415T133000Z
6
+ DUE:19920516T045959Z
7
+ PRIORITY:1
8
+ SUMMARY:Yearly Income Tax Preparation
9
+ UID:19920901T130000Z-123408@host.com
10
+ END:VTODO
@@ -0,0 +1,10 @@
1
+ BEGIN:VTODO
2
+ CATEGORIES:FAMILY,FINANCE
3
+ CLASS:CONFIDENTIAL
4
+ DTSTAMP:19920901T130000Z
5
+ DTSTART:19920415T133000Z
6
+ DUE:19920516T045959Z
7
+ PRIORITY:1
8
+ SUMMARY:Yearly Income Tax Preparation
9
+ UID:19920901T130000Z-123408@host.com
10
+ END:VTODO
File without changes
File without changes
@@ -0,0 +1,12 @@
1
+ BEGIN:VEVENT
2
+ SUMMARY:Work
3
+ DTSTART;TZID=Europe/Berlin:20240819T090000
4
+ DTEND;TZID=Europe/Berlin:20240819T170000
5
+ DTSTAMP:20240823T082915Z
6
+ UID:6b85b60c-eb1a-4338-9ece-33541b95bf17
7
+ SEQUENCE:1
8
+ CREATED:20240823T082829Z
9
+ LAST-MODIFIED:20240823T082915Z
10
+ TRANSP:OPAQUE
11
+ X-MOZ-GENERATION:2
12
+ END:VEVENT
@@ -9,6 +9,7 @@ def test_check_program_output(io_testcase: IOTestCase):
9
9
  """Run the test case and check the output."""
10
10
  result = io_testcase.run()
11
11
  print(result.error)
12
+ assert result.exit_code == 0, "The process must not exist with an error."
12
13
  assert result.output == io_testcase.expected_output
13
14
 
14
15
 
@@ -17,3 +18,13 @@ def test_version(run):
17
18
  result = run("--version")
18
19
  assert result.exit_code == 0
19
20
  assert version in result.output
21
+
22
+
23
+ def test_timezones(run):
24
+ """Check the available timezones."""
25
+ result = run("--available-timezones")
26
+ tz = result.output.split()
27
+ assert result.exit_code == 0
28
+ assert tz.index("Zulu") > tz.index("Pacific/Nauru")
29
+ assert tz.index("Pacific/Nauru") > tz.index("UTC")
30
+ assert tz.index("UTC") > tz.index("localtime")
@@ -2,7 +2,7 @@
2
2
 
3
3
  import pytest
4
4
 
5
- from ics_query.parse import InvalidTimeFormat, to_time
5
+ from ics_query.parse import InvalidTimeFormat, to_time, to_time_and_delta
6
6
 
7
7
 
8
8
  @pytest.mark.parametrize(
@@ -43,9 +43,10 @@ from ics_query.parse import InvalidTimeFormat, to_time
43
43
  ("20141010183012", (2014, 10, 10, 18, 30, 12)),
44
44
  ],
45
45
  )
46
- def test_parse_to_date_argument(string_argument, expected_result):
46
+ @pytest.mark.parametrize("parser", [to_time_and_delta, to_time])
47
+ def test_parse_to_date_argument(string_argument, expected_result, parser):
47
48
  """Check that we can properly parse what is accepted."""
48
- result = to_time(string_argument)
49
+ result = parser(string_argument)
49
50
  assert result == expected_result
50
51
 
51
52
 
@@ -53,11 +54,13 @@ def test_parse_to_date_argument(string_argument, expected_result):
53
54
  "dt",
54
55
  [
55
56
  "",
57
+ " ",
56
58
  "132",
57
59
  "12345",
58
60
  ],
59
61
  )
60
- def test_invalid_time_format(dt: str):
62
+ @pytest.mark.parametrize("parser", [to_time_and_delta, to_time])
63
+ def test_invalid_time_format(dt: str, parser):
61
64
  """Check invalid time formats."""
62
65
  with pytest.raises(InvalidTimeFormat):
63
- to_time(dt)
66
+ parser(dt)
@@ -0,0 +1,25 @@
1
+ """This tests parsing input times and dates."""
2
+
3
+ from datetime import timedelta
4
+
5
+ import pytest
6
+
7
+ from ics_query.parse import to_time_and_delta
8
+
9
+
10
+ @pytest.mark.parametrize(
11
+ ("string_argument", "expected_result"),
12
+ [
13
+ ("10d", timedelta(days=10)),
14
+ ("10d10h", timedelta(days=10, hours=10)),
15
+ ("1d2h12m33s", timedelta(days=1, hours=2, minutes=12, seconds=33)),
16
+ ("3600s", timedelta(seconds=3600)),
17
+ ("10m", timedelta(minutes=10)),
18
+ ("23h", timedelta(hours=23)),
19
+ ],
20
+ )
21
+ @pytest.mark.parametrize("plus", ["", "+"])
22
+ def test_parse_to_date_argument(string_argument, expected_result, plus):
23
+ """Check that we can properly parse what is accepted."""
24
+ result = to_time_and_delta(plus + string_argument)
25
+ assert result == expected_result
ics_query/version.py CHANGED
@@ -7,10 +7,29 @@ try:
7
7
  except ModuleNotFoundError:
8
8
  __version__ = version = "0.0dev0"
9
9
  __version_tuple__ = version_tuple = (0, 0, "dev0")
10
+ from importlib.metadata import version as get_version
11
+
12
+ cli_version = f"""{__version__}
13
+
14
+ Components:
15
+ """
16
+ modules = [
17
+ "recurring-ical-events",
18
+ "icalendar",
19
+ "pytz",
20
+ "python-dateutil",
21
+ "click",
22
+ "tzdata",
23
+ "x-wr-timezone",
24
+ ]
25
+ modules.sort()
26
+ for module in modules:
27
+ cli_version += f"{module}: {get_version(module)}\n"
10
28
 
11
29
  __all__ = [
12
30
  "__version__",
13
31
  "version",
14
32
  "__version_tuple__",
15
33
  "version_tuple",
34
+ "cli_version",
16
35
  ]
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: ics-query
3
- Version: 0.1.1a0
3
+ Version: 0.3.0b0
4
4
  Summary: Find out what happens in ICS calendar files - query and filter RFC 5545 compatible .ics files for events, journals, TODOs and more.
5
5
  Project-URL: Homepage, https://github.com/niccokunzmann/ics-query/
6
6
  Project-URL: Repository, https://github.com/niccokunzmann/ics-query/
7
- Project-URL: source_archive, https://github.com/niccokunzmann/ics-query/archive/fb12ef2822d23f693aa5f9faaa0cb97fa9f67516.zip
7
+ Project-URL: source_archive, https://github.com/niccokunzmann/ics-query/archive/8a23bc5bc6e89064a99de1e57afdcd94c180181c.zip
8
8
  Project-URL: Issues, https://github.com/niccokunzmann/ics-query/issues
9
9
  Project-URL: Documentation, https://github.com/niccokunzmann/ics-query/
10
10
  Project-URL: Changelog, https://github.com/niccokunzmann/ics-query/#changelog
@@ -686,7 +686,7 @@ License: GNU GENERAL PUBLIC LICENSE
686
686
  <https://www.gnu.org/licenses/why-not-lgpl.html>.
687
687
  License-File: LICENSE
688
688
  Keywords: calendar,command line,icalendar,ics,rfc5545,scheduling
689
- Classifier: Development Status :: 3 - Alpha
689
+ Classifier: Development Status :: 4 - Beta
690
690
  Classifier: Intended Audience :: Developers
691
691
  Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
692
692
  Classifier: Operating System :: OS Independent
@@ -695,10 +695,11 @@ Classifier: Programming Language :: Python :: 3.10
695
695
  Classifier: Programming Language :: Python :: 3.11
696
696
  Classifier: Programming Language :: Python :: 3.12
697
697
  Classifier: Topic :: Office/Business :: Scheduling
698
- Requires-Python: >=3.8
698
+ Requires-Python: >=3.9
699
699
  Requires-Dist: click
700
700
  Requires-Dist: icalendar
701
- Requires-Dist: recurring-ical-events
701
+ Requires-Dist: recurring-ical-events<4,>=3.2.0
702
+ Requires-Dist: x-wr-timezone
702
703
  Provides-Extra: test
703
704
  Requires-Dist: pytest; extra == 'test'
704
705
  Description-Content-Type: text/markdown
@@ -767,100 +768,199 @@ BEGIN:VEVENT
767
768
  ...
768
769
  ```
769
770
 
771
+ #### Piping calendars
772
+
773
+ You can pipe one or more calendars into the input.
774
+
775
+ ```shell
776
+ cat calendar.ics | ics-query first -
777
+ ```
778
+
770
779
  ### Events at Certain Times
771
780
 
772
781
  You can query which events happen at certain times:
773
782
 
774
783
  ```shell
775
- ics-query at <date-time> calendar.ics -
784
+ ics-query at TIME calendar.ics -
776
785
  ```
777
786
 
778
- `<date-time>` can be built up: It can be a year, a month, a day, an hour, a minute or a second.
787
+ The format of TIME:
788
+
789
+ | TIME | description |
790
+ | ------- | ----------- |
791
+ | `2019` | the whole year 2019 |
792
+ | `2019-08` | August 2019 |
793
+ | `2019-08-12` | 12th of August 2019 |
794
+ | `2019-08-12T17` | 17:00-18:00 at the 12th of August 2019 |
795
+ | `2019-08-12T17:20` | 17:20-17:21 at the 12th of August 2019 |
796
+ | `2019-08-12T17:20:00` | 17:20 at the 12th of August 2019 |
797
+
779
798
 
780
799
  Please see the command documentation for more help:
781
800
 
782
801
  ```shell
783
- ics-query --help
784
802
  ics-query at --help
803
+ ics-query --help
785
804
  ```
786
805
 
787
- ## Vision
788
-
789
- This section shows where we would like to get to.
790
-
791
- ### `ics-query at` - occurrences at certain times
792
-
793
806
  You can get all **events** that happen at a certain **day**.
794
807
 
795
808
  ```shell
796
- ics-query --components VEVENT at 2029-12-24 calendar.ics
809
+ ics-query at --components VEVENT 2029-12-24 calendar.ics
797
810
  ```
798
811
 
799
812
  You can get all **events** that happen **today**.
800
813
 
801
814
  ```shell
802
- ics-query --components VEVENT at `date +%Y-%m-%d` calendar.ics
815
+ ics-query at --components VEVENT `date +%Y-%m-%d` calendar.ics
803
816
  ```
804
817
 
805
818
  You can get all **TODO**s that happen at in certain **month**.
806
819
 
807
820
  ```shell
808
- ics-query --components VTODO at 2029-12-24 calendar.ics
821
+ ics-query at --components VTODO 2029-12-24 calendar.ics
809
822
  ```
810
823
 
811
- ### `ics-query at` - time ranges
824
+ ### Events within a Time Span
812
825
 
826
+ You can query which events happen between certain times:
813
827
 
814
- ### `ics-query --output=count` - count occurrences
828
+ ```shell
829
+ ics-query between START END calendar.ics -
830
+ ics-query between START DURATION calendar.ics -
831
+ ```
815
832
 
833
+ Please see the command documentation for more help:
816
834
 
817
- ### `ics-query --output=ics` - use ics as output (default)
835
+ ```shell
836
+ ics-query between --help
837
+ ics-query --help
838
+ ```
818
839
 
840
+ The format of START and END with examples:
819
841
 
820
- ### `ics-query --select-index` - reduce output size
842
+ | START or END | Description |
843
+ | ------- | ----------- |
844
+ | `2019` | the whole year 2019 |
845
+ | `2019-08` | August 2019 |
846
+ | `2019-08-12` | 12th of August 2019 |
847
+ | `2019-08-12T17` | 17:00-18:00 at the 12th of August 2019 |
848
+ | `2019-08-12T17:20` | 17:20-17:21 at the 12th of August 2019 |
849
+ | `2019-08-12T17:20:00` | 17:20 at the 12th of August 2019 |
821
850
 
822
- Examples: `0,2,4` `0-10`
851
+ Instead of an absolute time, you can specify a duration after the START.
852
+ The `+` is optional.
853
+
854
+ | DURATION | Description |
855
+ | ------- | ----------- |
856
+ | `+1d` | one more day |
857
+ | `+1h` | one more hour |
858
+ | `+1m` | one more minute |
859
+ | `+1s` | one more second |
860
+ | `+3600s` | one more hour or 3600 seconds |
861
+ | `+5d10h` | five more days and 10 more hours |
862
+
863
+ ### Time Span Examples
864
+
865
+ This example returns the occurrences within the **next week**:
866
+
867
+ ```shell
868
+ ics-query between `date +%Y%m%d` +7d calendar.ics -
869
+ ```
870
+
871
+ This example saves the **events** from the **1st of May 2024 to the 10th of June** in
872
+ events.ics:
873
+
874
+ ```shell
875
+ ics-query between --component VEVENT 2024-5-1 2024-6-10 calendar.ics events.ics
876
+ ```
877
+
878
+ In this example, you can check what is happening on **New Years Eve 2025** around
879
+ midnight:
880
+
881
+ ```shell
882
+ ics-query between 2025-12-31T21:00 +6h calendar.ics events.ics
883
+ ```
823
884
 
824
885
  ### `ics-query all` - the whole calendar
825
886
 
826
- ### `ics-query between` - time ranges
887
+ You can get everything that is happening in a calendar but that can be a lot!
827
888
 
828
889
  ```shell
829
- ics-query between dt dt
830
- ics-query between dt duration
890
+ ics-query all calendar.ics
831
891
  ```
832
892
 
833
- ### `ics-query --select-component` - filter for components
893
+ ### Filtering Components
834
894
 
895
+ We support different component types: VEVENT, VJOURNAL and VTODO.
896
+ By default, we include all types in the result.
835
897
 
836
- ### `ics-query --select-uid` - filter by uid
898
+ You can specify which components you would like to get using the
899
+ `--component` or `-c` parameter.
837
900
 
901
+ ```shell
902
+ -c VEVENT # only events
903
+ -c VTODO # only TODOs
904
+ -c VJOURNAL # only journal entries
905
+ -c VEVENT -v VTODO # only events and journal entries
906
+ ```
838
907
 
839
- ## How to edit an event
908
+ This example returns the first event of a calendar.
840
909
 
841
- To edit a component like an event, you can append it to the calendar and increase the sequence number.
910
+ ```shell
911
+ ics-query first -c VEVENT calendar.ics -
912
+ ```
842
913
 
843
- Example:
914
+ This is also available as `ICS_QUERY_COMPONENT` variable.
844
915
 
845
- 1. get the first event `--select-index=0` TODO: recurring-ical-events: set recurrence-id, sequence number
846
- 2. change the summary
847
- 3. increase sequence number
848
- 4. add the event to the end of the calendar file
849
- 5. show that the occurrence has changed
916
+ ```shell
917
+ export ICS_QUERY_COMPONENT=VEVENT
918
+ # from now on, you will get only events
919
+ ics-query first calendar.ics
920
+ ```
850
921
 
851
- ## Piping calendars
922
+ ### Timezones
923
+
924
+ You can set the timezone of the query, otherwise the event's local timezone is used and you
925
+ might miss events in your own timezone.
926
+
927
+ The first event at New Year 2000 in the **event's local time**:
852
928
 
853
929
  ```shell
854
- cat calendar.ics | ics-query --output=count --filter-component=VEVENT all > calendar-event-count.int
930
+ ics-query at 2000-01-01 calendar.ics
855
931
  ```
856
932
 
857
- ## Notifications
933
+ The first event at New Year 2000 in **your local time**:
858
934
 
859
- Examples:
935
+ ```shell
936
+ ics-query at --tz=localtime 2000-01-01 calendar.ics
937
+ ```
860
938
 
861
- - There are x todos in the next hour
862
- - There are x events today
863
- - Please write a journal entry!
939
+ The first event at New Year 2000 in **UTC**:
940
+
941
+ ```shell
942
+ ics-query at --tz=UTC 2000-01-01 calendar.ics
943
+ ```
944
+
945
+ The first event at New Year 2000 in **Berlin time**:
946
+
947
+ ```shell
948
+ ics-query at --tz=Europe/Berlin 2000-01-01 calendar.ics
949
+ ```
950
+
951
+ You can also use the `ICS_QUERY_TZ` variable.
952
+
953
+ ```shell
954
+ export ICS_QUERY_TZ=localtime
955
+ # from now on, we use your local time
956
+ ics-query at 2000-01-01 calendar.ics
957
+ ```
958
+
959
+ For all avaiable timezones see:
960
+
961
+ ```shell
962
+ ics-query --available-timezones
963
+ ```
864
964
 
865
965
  ## Version Fixing
866
966
 
@@ -920,7 +1020,7 @@ Run this to format the code and show problems:
920
1020
  tox -e ruff
921
1021
  ```
922
1022
 
923
- ## New Release
1023
+ ### New Release
924
1024
 
925
1025
  To release new versions,
926
1026
 
@@ -938,10 +1038,24 @@ To release new versions,
938
1038
 
939
1039
  ## Changelog
940
1040
 
1041
+ - v0.3.0b
1042
+
1043
+ - Add `--tz` timezone parameter
1044
+ - Add `ics-query all` to get all occurrences
1045
+
1046
+ - v0.2.1a
1047
+
1048
+ - Add `--component` to filter component types VEVENT, VJOURNAL and VTODO
1049
+
1050
+ - v0.2.0a
1051
+
1052
+ - Add `ics-query first <calendar> <output>` for earliest occurrences
1053
+ - Add `ics-query between <span_start> <span_stop> <calendar> <output>` to query time ranges
1054
+
941
1055
  - v0.1.1a
942
1056
 
943
1057
  - Add `--version`
944
- - Add `ics-query at <date>`
1058
+ - Add `ics-query at <date> <calendar> <output>`
945
1059
  - Add support for multiple calendars in one input
946
1060
 
947
1061
  - v0.1.0a
@@ -952,3 +1066,39 @@ To release new versions,
952
1066
  - v0.0.1a
953
1067
 
954
1068
  - first version
1069
+
1070
+ ## Related Work
1071
+
1072
+ - [icalBuddy](https://hasseg.org/icalBuddy/)
1073
+
1074
+ ## Vision
1075
+
1076
+ This section shows where we would like to get to.
1077
+
1078
+ ### `ics-query --select-index` - reduce output size
1079
+
1080
+ Examples: `0,2,4` `0-10`
1081
+
1082
+
1083
+ ### `ics-query --select-uid` - filter by uid
1084
+
1085
+ ### How to edit an event
1086
+
1087
+ To edit a component like an event, you can append it to the calendar and increase the sequence number.
1088
+
1089
+ Example:
1090
+
1091
+ 1. get the event `--select-index=0`
1092
+ 2. change the summary
1093
+ 3. increase sequence number
1094
+ 4. add the event to the end of the calendar file
1095
+ 5. show that the occurrence has changed
1096
+
1097
+
1098
+ ### Notifications
1099
+
1100
+ Examples:
1101
+
1102
+ - There are x todos in the next hour
1103
+ - There are x events today
1104
+ - Please write a journal entry!
@@ -0,0 +1,43 @@
1
+ ics_query/__init__.py,sha256=CN48ECsXCq2OzZ4Waj1_0j4oTxUUjH5NFfnaYYma7NY,232
2
+ ics_query/__main__.py,sha256=E6Gls0DNz8GQK2K-kOUIx8cYhgANW_CH54VKrfCfs14,52
3
+ ics_query/_version.py,sha256=B-4CcxJgND-NHNJ8i5tcgV-dwWIrZ-oQkFxWpPZ9MR8,413
4
+ ics_query/cli.py,sha256=xLZSIrszPAWAseLtapwKxYQ5pUbiKDBrTulu0zErIDc,18175
5
+ ics_query/parse.py,sha256=mq6d1m7ITiEqD901nu54yvnYfY4U71J8_l5c9JdlPZ8,1730
6
+ ics_query/query.py,sha256=Y8e_sZygp4bkBznqH20duw-QVWmV_TARzaMANWcwHTg,1717
7
+ ics_query/version.py,sha256=6dSmmmajuyZaNKL8nJBk6jUaebuZaNKO_dsQerNrbo0,828
8
+ ics_query/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ ics_query/tests/conftest.py,sha256=MGwKXod7sFfepXK0mtvKkR8SaIiI1SZNW_rAhz6aSA0,2258
10
+ ics_query/tests/test_command_line.py,sha256=6JYWqMqm0CmBfBQVBXzTXlbnNoY0-ju4cKNk541jSnI,902
11
+ ics_query/tests/test_parse_date.py,sha256=vVOj5bBvYel3euKmuBMy2v-uhpMDnC03OVcjyahhXPE,2100
12
+ ics_query/tests/test_parse_timedelta.py,sha256=wsAdfyagfndkZXX-KfAVDf4Ui2o2hcSu_yoUeyKuSuo,784
13
+ ics_query/tests/runs/all --tz Singapore one-event.ics -.run,sha256=sWF9T4kKzhnZYrgidUX5sgdJ5q95q1gp9vd8X65bIdk,218
14
+ ics_query/tests/runs/all three-events.ics -.run,sha256=gdcQ-LKaM0Bpre06txuoTTk2WYIh4Qe2-v0weO2Ckkc,768
15
+ ics_query/tests/runs/at 2019-03-04 multiple-calendars.ics -.run,sha256=Cyeg9DMK6BibiCwkM8nW0ZtULUYSZFIgDvKRlSo_jTw,482
16
+ ics_query/tests/runs/at 2019-03-04 one-event-twice.ics -.run,sha256=hc-0yJhWpnSVzPNB_0_tJfR6dskNMm9xdbHeAhsX1zI,452
17
+ ics_query/tests/runs/at 2019-03-04 one-event.ics -.run,sha256=GVVmVpqzFjQLw2_RuhxnVTpCnwflNqeWbkFZ6u5WXxA,226
18
+ ics_query/tests/runs/at 2019-03-07 multiple-calendars.ics -.run,sha256=ZlLXxPMIai7vvmQTL4NyXJwdCQzoU1scEn_FpjmkkUA,256
19
+ ics_query/tests/runs/at 2024-08-20 Berlin-Los-Angeles.ics -.run,sha256=KzQaFp65wntWfEu4fQwr3iH1kE-ooEmslA4UeA9-gkc,643
20
+ ics_query/tests/runs/between 20240823 4d recurring-work-events.ics -.run,sha256=2_sM7CkSW4SDk6wbwyLURZ8WZm2rT0hgmx1k7O07T3M,574
21
+ ics_query/tests/runs/first -c VJOURNAL -c VEVENT one-event.ics -.run,sha256=GVVmVpqzFjQLw2_RuhxnVTpCnwflNqeWbkFZ6u5WXxA,226
22
+ ics_query/tests/runs/first -c VJOURNAL one-event.ics -.run,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ ics_query/tests/runs/first -c VJOURNAL simple-journal.ics -.run,sha256=Av_N2nsE2sfku6owvJwguQ53699C-GTHV5tWS8j5mZ4,370
24
+ ics_query/tests/runs/first -c VTODO -c VJOURNAL simple-todo.ics -.run,sha256=-mcQWZIxMcIdSMOeHpdzAWDLXseGULNHOoGhy6ca8J0,224
25
+ ics_query/tests/runs/first -c VTODO simple-todo.ics -.run,sha256=-mcQWZIxMcIdSMOeHpdzAWDLXseGULNHOoGhy6ca8J0,224
26
+ ics_query/tests/runs/first empty-calendar.ics -.run,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ ics_query/tests/runs/first empty-file.ics -.run,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ ics_query/tests/runs/first recurring-work-events.ics -.run,sha256=-mGNYgI4vBSkBMMJ0WCYdkg97JpnOJ64rlaqdSKCi2Y,287
29
+ ics_query/tests/runs/calendars/Berlin-Los-Angeles.ics,sha256=_FFRUurDU_q7G8d8lSvfbCy3y1XvujaclLXei6GrW5U,9107
30
+ ics_query/tests/runs/calendars/empty-calendar.ics,sha256=78162P3KYUj6Qhbdnjsm3E84jv--_--p5U0h_jovrpw,153
31
+ ics_query/tests/runs/calendars/empty-file.ics,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ ics_query/tests/runs/calendars/multiple-calendars.ics,sha256=lS1Q9eSPpzLs2TRDKUiwF9HmpnJMw8xqjLudA0-KtY4,1516
33
+ ics_query/tests/runs/calendars/one-event-twice.ics,sha256=GZ5wE-U4kjO91N2nIaLsYZpSOLvQTjkoLPI6saMocOM,1450
34
+ ics_query/tests/runs/calendars/one-event.ics,sha256=-uwohttEzg-jsTETNb6tQ5dO9PE3DXzlicwRiXJs1KQ,725
35
+ ics_query/tests/runs/calendars/recurring-work-events.ics,sha256=4ASS_-xZl2pVv1kZ7nDOU9jpkmbo4zJC2KEAgHtpsNU,5115
36
+ ics_query/tests/runs/calendars/simple-journal.ics,sha256=U6_YMQM6EHwPDaszWgJDo-pR4WIqbJx8CRlHg4iu9zA,457
37
+ ics_query/tests/runs/calendars/simple-todo.ics,sha256=l9uHQD4eyiCE8STvd2tj5lAVaBrqUtpF_M8Pv6yf1es,327
38
+ ics_query/tests/runs/calendars/three-events.ics,sha256=YvPfthOzMCR0DQhGR6uj_1Bltgax3uA1ETlkI4JUI08,828
39
+ ics_query-0.3.0b0.dist-info/METADATA,sha256=64fCboXNTqb7V0KEzrvbSU1s7axOn5PJn-r4u3xtKfw,51589
40
+ ics_query-0.3.0b0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
41
+ ics_query-0.3.0b0.dist-info/entry_points.txt,sha256=Jq_39vCKVOkNZjL7Wngf_04V_n_QRszLgLT2CbJKiH4,49
42
+ ics_query-0.3.0b0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
43
+ ics_query-0.3.0b0.dist-info/RECORD,,
@@ -1,22 +0,0 @@
1
- ics_query/__init__.py,sha256=YxyZzqxwfA77sBVFjUyUj3_fvR2gL3bs0pkE93prRFY,216
2
- ics_query/__main__.py,sha256=E6Gls0DNz8GQK2K-kOUIx8cYhgANW_CH54VKrfCfs14,52
3
- ics_query/_version.py,sha256=cU7fSuITRwo1pTWU-OD7oXC6-FpABHrqGppdiounZFo,413
4
- ics_query/cli.py,sha256=-ogJQ994ssQNNvU8tojCPDea4wJwFd4f9REoJ1hDCOs,6949
5
- ics_query/parse.py,sha256=VkF4z5KR-uzg4YmEKaY7Zz67d4Ffxc4rsB6ezNtxBr8,1113
6
- ics_query/version.py,sha256=LgqmHh_dcmWi9HMxfWJ8OhfmbzWsBTq3h08jIE18pYM,468
7
- ics_query/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- ics_query/tests/conftest.py,sha256=MGwKXod7sFfepXK0mtvKkR8SaIiI1SZNW_rAhz6aSA0,2258
9
- ics_query/tests/test_command_line.py,sha256=-XnpYWETEVEc1dJ5_dpd8dqBoMQFz1CyGaSoe_ETq5o,488
10
- ics_query/tests/test_parse_date.py,sha256=ZMbllWHNCwuluGTr55xKlM7xBzoMNsoE7TQUC5uGlVA,1923
11
- ics_query/tests/runs/at 2019-03-04 multiple-calendars.ics -.run,sha256=Cyeg9DMK6BibiCwkM8nW0ZtULUYSZFIgDvKRlSo_jTw,482
12
- ics_query/tests/runs/at 2019-03-04 one-event-twice.ics -.run,sha256=hc-0yJhWpnSVzPNB_0_tJfR6dskNMm9xdbHeAhsX1zI,452
13
- ics_query/tests/runs/at 2019-03-04 one-event.ics -.run,sha256=GVVmVpqzFjQLw2_RuhxnVTpCnwflNqeWbkFZ6u5WXxA,226
14
- ics_query/tests/runs/at 2019-03-07 multiple-calendars.ics -.run,sha256=ZlLXxPMIai7vvmQTL4NyXJwdCQzoU1scEn_FpjmkkUA,256
15
- ics_query/tests/runs/calendars/multiple-calendars.ics,sha256=lS1Q9eSPpzLs2TRDKUiwF9HmpnJMw8xqjLudA0-KtY4,1516
16
- ics_query/tests/runs/calendars/one-event-twice.ics,sha256=GZ5wE-U4kjO91N2nIaLsYZpSOLvQTjkoLPI6saMocOM,1450
17
- ics_query/tests/runs/calendars/one-event.ics,sha256=-uwohttEzg-jsTETNb6tQ5dO9PE3DXzlicwRiXJs1KQ,725
18
- ics_query-0.1.1a0.dist-info/METADATA,sha256=cgssIiEuCQItTb7_5Iap9KFcfV6f9-z4DUfy-gd6MsU,48066
19
- ics_query-0.1.1a0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
20
- ics_query-0.1.1a0.dist-info/entry_points.txt,sha256=Jq_39vCKVOkNZjL7Wngf_04V_n_QRszLgLT2CbJKiH4,49
21
- ics_query-0.1.1a0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
22
- ics_query-0.1.1a0.dist-info/RECORD,,