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.
- ics_query/__init__.py +3 -2
- ics_query/_version.py +2 -2
- ics_query/cli.py +406 -23
- ics_query/parse.py +26 -4
- ics_query/query.py +54 -0
- ics_query/tests/runs/all --tz Singapore one-event.ics -.run +9 -0
- ics_query/tests/runs/all three-events.ics -.run +33 -0
- ics_query/tests/runs/at 2024-08-20 Berlin-Los-Angeles.ics -.run +23 -0
- ics_query/tests/runs/between 20240823 4d recurring-work-events.ics -.run +24 -0
- ics_query/tests/runs/calendars/Berlin-Los-Angeles.ics +381 -0
- ics_query/tests/runs/calendars/empty-calendar.ics +7 -0
- ics_query/tests/runs/calendars/empty-file.ics +0 -0
- ics_query/tests/runs/calendars/recurring-work-events.ics +223 -0
- ics_query/tests/runs/calendars/simple-journal.ics +15 -0
- ics_query/tests/runs/calendars/simple-todo.ics +15 -0
- ics_query/tests/runs/calendars/three-events.ics +37 -0
- ics_query/tests/runs/first -c VJOURNAL -c VEVENT one-event.ics -.run +9 -0
- ics_query/tests/runs/first -c VJOURNAL one-event.ics -.run +0 -0
- ics_query/tests/runs/first -c VJOURNAL simple-journal.ics -.run +12 -0
- ics_query/tests/runs/first -c VTODO -c VJOURNAL simple-todo.ics -.run +10 -0
- ics_query/tests/runs/first -c VTODO simple-todo.ics -.run +10 -0
- ics_query/tests/runs/first empty-calendar.ics -.run +0 -0
- ics_query/tests/runs/first empty-file.ics -.run +0 -0
- ics_query/tests/runs/first recurring-work-events.ics -.run +12 -0
- ics_query/tests/test_command_line.py +11 -0
- ics_query/tests/test_parse_date.py +8 -5
- ics_query/tests/test_parse_timedelta.py +25 -0
- ics_query/version.py +19 -0
- {ics_query-0.1.1a0.dist-info → ics_query-0.3.0b0.dist-info}/METADATA +194 -44
- ics_query-0.3.0b0.dist-info/RECORD +43 -0
- ics_query-0.1.1a0.dist-info/RECORD +0 -22
- {ics_query-0.1.1a0.dist-info → ics_query-0.3.0b0.dist-info}/WHEEL +0 -0
- {ics_query-0.1.1a0.dist-info → ics_query-0.3.0b0.dist-info}/entry_points.txt +0 -0
- {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
|
|
File without changes
|
|
@@ -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
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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/
|
|
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 ::
|
|
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.
|
|
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
|
|
784
|
+
ics-query at TIME calendar.ics -
|
|
776
785
|
```
|
|
777
786
|
|
|
778
|
-
|
|
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
|
|
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
|
|
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
|
|
821
|
+
ics-query at --components VTODO 2029-12-24 calendar.ics
|
|
809
822
|
```
|
|
810
823
|
|
|
811
|
-
###
|
|
824
|
+
### Events within a Time Span
|
|
812
825
|
|
|
826
|
+
You can query which events happen between certain times:
|
|
813
827
|
|
|
814
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
830
|
-
ics-query between dt duration
|
|
890
|
+
ics-query all calendar.ics
|
|
831
891
|
```
|
|
832
892
|
|
|
833
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
908
|
+
This example returns the first event of a calendar.
|
|
840
909
|
|
|
841
|
-
|
|
910
|
+
```shell
|
|
911
|
+
ics-query first -c VEVENT calendar.ics -
|
|
912
|
+
```
|
|
842
913
|
|
|
843
|
-
|
|
914
|
+
This is also available as `ICS_QUERY_COMPONENT` variable.
|
|
844
915
|
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
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
|
-
|
|
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
|
-
|
|
930
|
+
ics-query at 2000-01-01 calendar.ics
|
|
855
931
|
```
|
|
856
932
|
|
|
857
|
-
|
|
933
|
+
The first event at New Year 2000 in **your local time**:
|
|
858
934
|
|
|
859
|
-
|
|
935
|
+
```shell
|
|
936
|
+
ics-query at --tz=localtime 2000-01-01 calendar.ics
|
|
937
|
+
```
|
|
860
938
|
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
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
|
-
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|