From 2b4537d737fe48df983c71d5d91959a57350a100 Mon Sep 17 00:00:00 2001 From: Ben Fortuna Date: Thu, 2 Jan 2025 12:14:10 +1100 Subject: [PATCH] Added strategy samples --- .../extensions/model/concept/IssueType.java | 1 - .../extensions/model/concept/NoteType.java | 2 + .../extensions/strategy/entity/Location.java | 12 +- .../extensions/strategy/event/Event.java | 13 + .../strategy/entity/LocationTest.groovy | 11 + .../strategy/event/EventTest.groovy | 18 ++ .../extensions/strategy/note/NoteTest.groovy | 18 ++ .../strategy/observance/ObservanceTest.groovy | 11 + .../strategy/entity/australian_gov.vcf | 223 ++++++++++++++++++ .../strategy/entity/egan_reserve.vcf | 7 + .../strategy/event/remembrance_day.ics | 9 + .../resources/strategy/note/acme_mapper.ics | 7 + src/test/resources/strategy/note/baeldung.ics | 11 + .../resources/strategy/note/david_guillot.ics | 9 + src/test/resources/strategy/note/github.ics | 9 + .../resources/strategy/note/hacker_news.ics | 8 + .../resources/strategy/note/healthline.ics | 10 + src/test/resources/strategy/note/iana.ics | 9 + .../strategy/note/ietf_datatracker.ics | 9 + .../resources/strategy/note/indie_hackers.ics | 8 + .../strategy/note/infrequently_noted.ics | 10 + .../resources/strategy/note/linus_coffee.ics | 9 + src/test/resources/strategy/note/medium.ics | 9 + .../resources/strategy/note/recipetineats.ics | 13 + src/test/resources/strategy/note/scaleway.ics | 9 + .../resources/strategy/note/schema_org.ics | 8 + .../resources/strategy/note/waranga_news.ics | 8 + .../resources/strategy/note/zen_habits.ics | 11 + .../strategy/observance/christmas_day.ics | 9 + .../strategy/observance/december_solstice.ics | 9 + .../strategy/observance/june_solstice.ics | 9 + .../strategy/observance/march_equinox.ics | 9 + .../strategy/observance/new_years_day.ics | 9 + .../strategy/observance/september_equinox.ics | 9 + 34 files changed, 532 insertions(+), 4 deletions(-) create mode 100644 src/main/java/net/fortuna/ical4j/extensions/strategy/event/Event.java create mode 100644 src/test/groovy/net/fortuna/ical4j/extensions/strategy/event/EventTest.groovy create mode 100644 src/test/groovy/net/fortuna/ical4j/extensions/strategy/note/NoteTest.groovy create mode 100644 src/test/resources/strategy/entity/australian_gov.vcf create mode 100644 src/test/resources/strategy/entity/egan_reserve.vcf create mode 100644 src/test/resources/strategy/event/remembrance_day.ics create mode 100644 src/test/resources/strategy/note/acme_mapper.ics create mode 100644 src/test/resources/strategy/note/baeldung.ics create mode 100644 src/test/resources/strategy/note/david_guillot.ics create mode 100644 src/test/resources/strategy/note/github.ics create mode 100644 src/test/resources/strategy/note/hacker_news.ics create mode 100644 src/test/resources/strategy/note/healthline.ics create mode 100644 src/test/resources/strategy/note/iana.ics create mode 100644 src/test/resources/strategy/note/ietf_datatracker.ics create mode 100644 src/test/resources/strategy/note/indie_hackers.ics create mode 100644 src/test/resources/strategy/note/infrequently_noted.ics create mode 100644 src/test/resources/strategy/note/linus_coffee.ics create mode 100644 src/test/resources/strategy/note/medium.ics create mode 100644 src/test/resources/strategy/note/recipetineats.ics create mode 100644 src/test/resources/strategy/note/scaleway.ics create mode 100644 src/test/resources/strategy/note/schema_org.ics create mode 100644 src/test/resources/strategy/note/waranga_news.ics create mode 100644 src/test/resources/strategy/note/zen_habits.ics create mode 100644 src/test/resources/strategy/observance/christmas_day.ics create mode 100644 src/test/resources/strategy/observance/december_solstice.ics create mode 100644 src/test/resources/strategy/observance/june_solstice.ics create mode 100644 src/test/resources/strategy/observance/march_equinox.ics create mode 100644 src/test/resources/strategy/observance/new_years_day.ics create mode 100644 src/test/resources/strategy/observance/september_equinox.ics diff --git a/src/main/java/net/fortuna/ical4j/extensions/model/concept/IssueType.java b/src/main/java/net/fortuna/ical4j/extensions/model/concept/IssueType.java index 1318c58..8a3c24c 100644 --- a/src/main/java/net/fortuna/ical4j/extensions/model/concept/IssueType.java +++ b/src/main/java/net/fortuna/ical4j/extensions/model/concept/IssueType.java @@ -28,7 +28,6 @@ public enum Id { Incident("semcal:concept:issue:incident"), - Problem("semcal:concept:issue:problem"); private final URI uri; diff --git a/src/main/java/net/fortuna/ical4j/extensions/model/concept/NoteType.java b/src/main/java/net/fortuna/ical4j/extensions/model/concept/NoteType.java index fbdaf61..0866409 100644 --- a/src/main/java/net/fortuna/ical4j/extensions/model/concept/NoteType.java +++ b/src/main/java/net/fortuna/ical4j/extensions/model/concept/NoteType.java @@ -18,6 +18,8 @@ public enum Id { DigitalDocument("semcal:concept:note:digital_document"), + WebSite("semcal:concept:note:web_site"), + Release("semcal:concept:note:release"), Assumption("semcal:concept:note:assumption"), diff --git a/src/main/java/net/fortuna/ical4j/extensions/strategy/entity/Location.java b/src/main/java/net/fortuna/ical4j/extensions/strategy/entity/Location.java index d06054e..d47afe8 100644 --- a/src/main/java/net/fortuna/ical4j/extensions/strategy/entity/Location.java +++ b/src/main/java/net/fortuna/ical4j/extensions/strategy/entity/Location.java @@ -11,6 +11,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; /** * A location represents a physical place. @@ -64,9 +66,13 @@ public Entity get() { Entity entity = newInstance(Entity::new); entity.with(GeneralPropertyModifiers.KIND, ImmutableKind.LOCATION); names.forEach(name -> entity.with(IdentificationPropertyModifiers.FN, new Fn(name))); - entity.with(GeographicalPropertyModifiers.GEO, new Geo(latitude, longitude)); - entity.with(AddressPropertyModifiers.ADR, new Address("", "", "", locality, - "", postalCode, country)); + if (latitude != null && longitude != null) { + entity.with(GeographicalPropertyModifiers.GEO, new Geo(latitude, longitude)); + } + if (Stream.of(locality, postalCode, country).anyMatch(s -> !Objects.isNull(s) && !s.isBlank())) { + entity.with(AddressPropertyModifiers.ADR, new Address("", "", "", locality, + "", postalCode, country)); + } return entity; } } diff --git a/src/main/java/net/fortuna/ical4j/extensions/strategy/event/Event.java b/src/main/java/net/fortuna/ical4j/extensions/strategy/event/Event.java new file mode 100644 index 0000000..13eaee2 --- /dev/null +++ b/src/main/java/net/fortuna/ical4j/extensions/strategy/event/Event.java @@ -0,0 +1,13 @@ +package net.fortuna.ical4j.extensions.strategy.event; + +import net.fortuna.ical4j.extensions.model.concept.EventType; +import net.fortuna.ical4j.extensions.strategy.AbstractStrategy; +import net.fortuna.ical4j.model.component.VEvent; + +public class Event extends AbstractStrategy { + + @Override + public VEvent get() { + return newInstance(VEvent::new).replace(EventType.EVENT); + } +} diff --git a/src/test/groovy/net/fortuna/ical4j/extensions/strategy/entity/LocationTest.groovy b/src/test/groovy/net/fortuna/ical4j/extensions/strategy/entity/LocationTest.groovy index 4fed178..a7ea847 100644 --- a/src/test/groovy/net/fortuna/ical4j/extensions/strategy/entity/LocationTest.groovy +++ b/src/test/groovy/net/fortuna/ical4j/extensions/strategy/entity/LocationTest.groovy @@ -1,6 +1,7 @@ package net.fortuna.ical4j.extensions.strategy.entity +import net.fortuna.ical4j.vcard.VCardBuilder import spock.lang.Specification class LocationTest extends Specification { @@ -20,4 +21,14 @@ GEO:51.5007292,-0.1272003\r ADR:;;;London;;SW1A 0AA;United Kingdom;\r END:VCARD\r\n''' } + + def 'test parsing equivalence'() { + expect: 'parsed model matches strategy' + new Location().withPrototype(prototype).get().propertyList == prototype.propertyList + + where: 'prototype loaded from samples' + prototype << new File('src/test/resources/strategy/entity').listFiles().collect { + return new VCardBuilder(new FileInputStream(it)).build().entities + }.flatten() + } } diff --git a/src/test/groovy/net/fortuna/ical4j/extensions/strategy/event/EventTest.groovy b/src/test/groovy/net/fortuna/ical4j/extensions/strategy/event/EventTest.groovy new file mode 100644 index 0000000..5ea1021 --- /dev/null +++ b/src/test/groovy/net/fortuna/ical4j/extensions/strategy/event/EventTest.groovy @@ -0,0 +1,18 @@ +package net.fortuna.ical4j.extensions.strategy.event + + +import net.fortuna.ical4j.util.Calendars +import spock.lang.Specification + +class EventTest extends Specification { + + def 'test parsing equivalence'() { + expect: 'parsed model matches strategy' + new Event().withPrototype(prototype).get().propertyList == prototype.propertyList + + where: 'prototype loaded from samples' + prototype << new File('src/test/resources/strategy/event').listFiles().collect { + return Calendars.load(it.absolutePath).components + }.flatten() + } +} diff --git a/src/test/groovy/net/fortuna/ical4j/extensions/strategy/note/NoteTest.groovy b/src/test/groovy/net/fortuna/ical4j/extensions/strategy/note/NoteTest.groovy new file mode 100644 index 0000000..b58f94e --- /dev/null +++ b/src/test/groovy/net/fortuna/ical4j/extensions/strategy/note/NoteTest.groovy @@ -0,0 +1,18 @@ +package net.fortuna.ical4j.extensions.strategy.note + + +import net.fortuna.ical4j.util.Calendars +import spock.lang.Specification + +class NoteTest extends Specification { + + def 'test parsing equivalence'() { + expect: 'parsed model matches strategy' + new Note().withPrototype(prototype).get().propertyList == prototype.propertyList + + where: 'prototype loaded from samples' + prototype << new File('src/test/resources/strategy/note').listFiles().collect { + return Calendars.load(it.absolutePath).components + }.flatten() + } +} diff --git a/src/test/groovy/net/fortuna/ical4j/extensions/strategy/observance/ObservanceTest.groovy b/src/test/groovy/net/fortuna/ical4j/extensions/strategy/observance/ObservanceTest.groovy index cca2899..f421105 100644 --- a/src/test/groovy/net/fortuna/ical4j/extensions/strategy/observance/ObservanceTest.groovy +++ b/src/test/groovy/net/fortuna/ical4j/extensions/strategy/observance/ObservanceTest.groovy @@ -2,6 +2,7 @@ package net.fortuna.ical4j.extensions.strategy.observance import net.fortuna.ical4j.extensions.model.property.Repeats import net.fortuna.ical4j.model.component.VEvent +import net.fortuna.ical4j.util.Calendars import org.threeten.extra.Years import spock.lang.Specification @@ -43,4 +44,14 @@ DTEND;VALUE=DATE:19881112\r RRULE:FREQ=YEARLY;INTERVAL=1\r END:VEVENT\r\n/ } + + def 'test parsing equivalence'() { + expect: 'parsed model matches strategy' + new Observance().withPrototype(prototype).get().propertyList == prototype.propertyList + + where: 'prototype loaded from samples' + prototype << new File('src/test/resources/strategy/observance').listFiles().collect { + return Calendars.load(it.absolutePath).components + }.flatten() + } } diff --git a/src/test/resources/strategy/entity/australian_gov.vcf b/src/test/resources/strategy/entity/australian_gov.vcf new file mode 100644 index 0000000..ee2f2d1 --- /dev/null +++ b/src/test/resources/strategy/entity/australian_gov.vcf @@ -0,0 +1,223 @@ +BEGIN:VCARD +VERSION:4.0 +FN:Australian Government Directory - Commonwealth entities and companies +KIND:GROUP +URL:https://www.directory.gov.au/commonwealth-entities-and-companies +CATEGORIES:Legal and Government +MEMBER:urn:uuid:1 +MEMBER:urn:uuid:2 +MEMBER:urn:uuid:3 +MEMBER:urn:uuid:4 +MEMBER:urn:uuid:5 +MEMBER:urn:uuid:6 +MEMBER:urn:uuid:7 +MEMBER:urn:uuid:8 +MEMBER:urn:uuid:9 +MEMBER:urn:uuid:10 +MEMBER:urn:uuid:11 +MEMBER:urn:uuid:12 +MEMBER:urn:uuid:13 +MEMBER:urn:uuid:14 +MEMBER:urn:uuid:15 +MEMBER:urn:uuid:16 +MEMBER:urn:uuid:17 +MEMBER:urn:uuid:18 +MEMBER:urn:uuid:19 +MEMBER:urn:uuid:20 +MEMBER:urn:uuid:21 +MEMBER:urn:uuid:22 +MEMBER:urn:uuid:23 +MEMBER:urn:uuid:24 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Broadcasting Corporation +KIND:ORG +URL:https://www.directory.gov.au/portfolios/infrastructure-transport-regional-development-communications-and-arts/australian-broadcasting-corporation +UID:1 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Bureau of Statistics +KIND:ORG +URL:https://www.directory.gov.au/portfolios/treasury/australian-bureau-statistics +UID:2 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Communications and Media Authority +KIND:ORG +URL:https://www.directory.gov.au/portfolios/infrastructure-transport-regional-development-communications-and-arts/australian-communications-and-media-authority +UID:3 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Competition and Consumer Commission +KIND:ORG +URL:https://www.directory.gov.au/portfolios/treasury/australian-competition-and-consumer-commission +UID:4 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Electoral Commission +KIND:ORG +URL:https://www.directory.gov.au/portfolios/finance/australian-electoral-commission +UID:5 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Federal Police +KIND:ORG +URL:https://www.directory.gov.au/portfolios/attorney-generals/australian-federal-police +UID:6 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Human Rights Commission +KIND:ORG +URL:https://www.directory.gov.au/portfolios/attorney-generals/australian-human-rights-commission +UID:7 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian National University +KIND:ORG +URL:https://www.directory.gov.au/portfolios/education/australian-national-university +UID:8 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Postal Corporation +KIND:ORG +URL:https://www.directory.gov.au/portfolios/infrastructure-transport-regional-development-communications-and-arts/australian-postal-corporation +UID:9 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Prudential Regulation Authority +KIND:ORG +URL:https://www.directory.gov.au/portfolios/treasury/australian-prudential-regulation-authority +UID:10 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Renewable Energy Agency +KIND:ORG +URL:https://www.directory.gov.au/portfolios/climate-change-energy-environment-and-water/australian-renewable-energy-agency +UID:11 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Research Council +KIND:ORG +URL:https://www.directory.gov.au/portfolios/education/australian-research-council +UID:12 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Secret Intelligence Service +KIND:ORG +URL:https://www.directory.gov.au/portfolios/foreign-affairs-and-trade/australian-secret-intelligence-service +UID:13 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Securities and Investments Commission +KIND:ORG +URL:https://www.directory.gov.au/portfolios/treasury/australian-securities-and-investments-commission +UID:14 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Security Intelligence Organisation +KIND:ORG +URL:https://www.directory.gov.au/portfolios/attorney-generals/australian-security-intelligence-organisation +UID:15 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Signals Directorate +KIND:ORG +URL:https://www.directory.gov.au/portfolios/defence/australian-signals-directorate +UID:16 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Sports Commission +KIND:ORG +URL:https://www.directory.gov.au/portfolios/health-and-aged-care/australian-sports-commission +UID:17 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian Taxation Office +KIND:ORG +URL:https://www.directory.gov.au/portfolios/treasury/australian-taxation-office +UID:18 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Australian War Memorial +KIND:ORG +URL:https://www.directory.gov.au/portfolios/veterans-affairs-part-defence-portfolio/australian-war-memorial +UID:19 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Bureau of Meteorology +KIND:ORG +URL:https://www.directory.gov.au/portfolios/climate-change-energy-environment-and-water/bureau-meteorology +UID:20 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Climate Change Authority +KIND:ORG +URL:https://www.directory.gov.au/portfolios/climate-change-energy-environment-and-water/climate-change-authority +UID:21 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Department of Agriculture, Fisheries and Forestry +KIND:ORG +URL:https://www.directory.gov.au/portfolios/agriculture-fisheries-and-forestry/department-agriculture-fisheries-and-forestry +UID:22 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Department of Defence +KIND:ORG +URL:https://www.directory.gov.au/portfolios/defence/department-defence +UID:23 +END:VCARD + +BEGIN:VCARD +VERSION:4.0 +FN:Department of Education +KIND:ORG +URL:https://www.directory.gov.au/portfolios/education/department-education +UID:24 +END:VCARD diff --git a/src/test/resources/strategy/entity/egan_reserve.vcf b/src/test/resources/strategy/entity/egan_reserve.vcf new file mode 100644 index 0000000..9a15e4b --- /dev/null +++ b/src/test/resources/strategy/entity/egan_reserve.vcf @@ -0,0 +1,7 @@ +BEGIN:VCARD +FN:Egan Reserve +KIND:LOCATION +GEO:-37.7514239,144.9819331 +URL;X-LABEL=Egan Reserve (Google Maps):https://maps.app.goo.gl/56ZEfL3g1Uy4uKa39 +CATEGORIES:Lifestyle +END:VCARD diff --git a/src/test/resources/strategy/event/remembrance_day.ics b/src/test/resources/strategy/event/remembrance_day.ics new file mode 100644 index 0000000..378e5c9 --- /dev/null +++ b/src/test/resources/strategy/event/remembrance_day.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +CONCEPT:semcal:concept:event +SUMMARY:Remembrance Day +DTSTART:19191111T110000 +DTEND:19191111T110100 +RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11 +END:VEVENT +END:VCALENDAR diff --git a/src/test/resources/strategy/note/acme_mapper.ics b/src/test/resources/strategy/note/acme_mapper.ics new file mode 100644 index 0000000..b386dfa --- /dev/null +++ b/src/test/resources/strategy/note/acme_mapper.ics @@ -0,0 +1,7 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:ACME Mapper +LINK;VALUE=URI;LINKREL=bookmark:https://mapper.acme.com/ +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/baeldung.ics b/src/test/resources/strategy/note/baeldung.ics new file mode 100644 index 0000000..2833da7 --- /dev/null +++ b/src/test/resources/strategy/note/baeldung.ics @@ -0,0 +1,11 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:Baeldung +LINK;VALUE=URI;LINKREL=bookmark:https://www.baeldung.com/ +LINK;VALUE=URI;LINKREL=alternate;LABEL=Baeldung (RSS):https://www.baeldung.com/feed +LINK;VALUE=URI;LINKREL=related;LABEL=Handling Daylight Savings:https://www.baeldung.com/java-daylight-savings +LINK;VALUE=URI;LINKREL=related;LABEL=Why There Is No Sorted List in Java?:https://www.baeldung.com/java-sorted-list +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/david_guillot.ics b/src/test/resources/strategy/note/david_guillot.ics new file mode 100644 index 0000000..cad3b18 --- /dev/null +++ b/src/test/resources/strategy/note/david_guillot.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:David Guillot +LINK;VALUE=URI;LINKREL=bookmark:https://david.guillot.me/en/ +LINK;VALUE=URI;LINKREL=related;LABEL=Following up "Mother of all htmx demos":https://david.guillot.me/en/posts/tech/following-up-mother-of-all-htmx-demos/ +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/github.ics b/src/test/resources/strategy/note/github.ics new file mode 100644 index 0000000..7d19daa --- /dev/null +++ b/src/test/resources/strategy/note/github.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:GitHub +LINK;VALUE=URI;LINKREL=bookmark:https://github.com/ +LINK;VALUE=URI;LINKREL=related;LABEL=iCal4j (GitHub):https://github.com/ical4j +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/hacker_news.ics b/src/test/resources/strategy/note/hacker_news.ics new file mode 100644 index 0000000..ad55982 --- /dev/null +++ b/src/test/resources/strategy/note/hacker_news.ics @@ -0,0 +1,8 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:Hacker News +LINK;VALUE=URI;LINKREL=bookmark:https://news.ycombinator.com/ +LINK;VALUE=URI;LINKREL=related;LABEL=If not React, then what?:https://news.ycombinator.com/item?id=42279172 +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/healthline.ics b/src/test/resources/strategy/note/healthline.ics new file mode 100644 index 0000000..cedde3f --- /dev/null +++ b/src/test/resources/strategy/note/healthline.ics @@ -0,0 +1,10 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:healthline +LINK;VALUE=URI;LINKREL=bookmark:https://www.healthline.com/ +LINK;VALUE=URI;LINKREL=alternate;LABEL=Healthline (YouTube):https://www.youtube.com/channel/UC7snF15Idi7px6XujWe_h9A +LINK;VALUE=URI;LINKREL=related;LABEL="Pilates for Men: It’s Not Just for Ballerinas Anymore":https://www.healthline.com/nutrition/pilates-for-men +CATEGORIES:Health and Wellbeing +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/iana.ics b/src/test/resources/strategy/note/iana.ics new file mode 100644 index 0000000..26a5e35 --- /dev/null +++ b/src/test/resources/strategy/note/iana.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:Internet Assigned Numbers Authority +LINK;VALUE=URI;LINKREL=bookmark:https://www.iana.org/ +LINK;VALUE=URI;LINKREL=related;LABEL=Message Headers:https://www.iana.org/assignments/message-headers/message-headers.xhtml +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/ietf_datatracker.ics b/src/test/resources/strategy/note/ietf_datatracker.ics new file mode 100644 index 0000000..4eb57e6 --- /dev/null +++ b/src/test/resources/strategy/note/ietf_datatracker.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:IETF Datatracker +LINK;VALUE=URI;LINKREL=bookmark:https://datatracker.ietf.org/ +LINK;VALUE=URI;LINKREL=related;LABEL=Support for iCalendar Relationships (RFC 9253):https://datatracker.ietf.org/doc/rfc9253/ +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/indie_hackers.ics b/src/test/resources/strategy/note/indie_hackers.ics new file mode 100644 index 0000000..dc91fe7 --- /dev/null +++ b/src/test/resources/strategy/note/indie_hackers.ics @@ -0,0 +1,8 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:Indie Hackers +LINK;VALUE=URI;LINKREL=bookmark:https://www.indiehackers.com/ +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/infrequently_noted.ics b/src/test/resources/strategy/note/infrequently_noted.ics new file mode 100644 index 0000000..14c19f4 --- /dev/null +++ b/src/test/resources/strategy/note/infrequently_noted.ics @@ -0,0 +1,10 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:Infrequently Noted +LINK;VALUE=URI;LINKREL=bookmark:https://infrequently.org/ +LINK;VALUE=URI;LINKREL=author;LABEL=Alex Russell:https://toot.cafe/@slightlyoff +LINK;VALUE=URI;LINKREL=related;LABEL=If Not React, Then What?:https://infrequently.org/2024/11/if-not-react-then-what/ +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/linus_coffee.ics b/src/test/resources/strategy/note/linus_coffee.ics new file mode 100644 index 0000000..c7c092e --- /dev/null +++ b/src/test/resources/strategy/note/linus_coffee.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:linus.coffee +LINK;VALUE=URI;LINKREL=bookmark:https://linus.coffee/ +LINK;VALUE=URI;LINKREL=related;LABEL=Thoughts on the software industry:https://linus.coffee/note/software-industry/ +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/medium.ics b/src/test/resources/strategy/note/medium.ics new file mode 100644 index 0000000..2f83145 --- /dev/null +++ b/src/test/resources/strategy/note/medium.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:Medium +LINK;VALUE=URI;LINKREL=bookmark:https://medium.com/ +LINK;VALUE=URI;LINKREL=related;LABEL=Software Architecture is Hard:https://medium.com/@ozanani/software-architecture-is-hard-71fe3ddafb60 +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/recipetineats.ics b/src/test/resources/strategy/note/recipetineats.ics new file mode 100644 index 0000000..b77ea8e --- /dev/null +++ b/src/test/resources/strategy/note/recipetineats.ics @@ -0,0 +1,13 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:RecipeTin Eats +LINK;VALUE=URI;LINKREL=bookmark:https://www.recipetineats.com/ +LINK;VALUE=URI;LINKREL=alternate;LABEL=RecipeTin Eats (YouTube):https://www.youtube.com/c/recipetineats +LINK;VALUE=URI;LINKREL=related;LABEL=Slow Cooker Roast Lamb Leg:https://www.recipetineats.com/slow-cooker-roast-lamb-leg/ +LINK;VALUE=URI;LINKREL=related;LABEL=Pork Roast with Crispy Crackling:https://www.recipetineats.com/pork-shoulder-roast-with-crispy-crackling/ +LINK;VALUE=URI;LINKREL=related;LABEL=Incredible BBQ Grilled Vegetables – marinated!:https://www.recipetineats.com/marinated-bbq-vegetables/ +LINK;VALUE=URI;LINKREL=related;LABEL=One-pan baked sausage and lentils:https://www.recipetineats.com/one-pan-baked-sausage-and-lentils/ +CATEGORIES:Lifestyle +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/scaleway.ics b/src/test/resources/strategy/note/scaleway.ics new file mode 100644 index 0000000..113ea2f --- /dev/null +++ b/src/test/resources/strategy/note/scaleway.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:Scaleway Blog +LINK;VALUE=URI;LINKREL=bookmark:https://www.scaleway.com/en/blog/ +LINK;VALUE=URI;LINKREL=related;LABEL=How to monetize your open source project (and pay your developers):https://www.scaleway.com/en/blog/how-to-monetize-your-open-source-project/ +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/schema_org.ics b/src/test/resources/strategy/note/schema_org.ics new file mode 100644 index 0000000..f70db84 --- /dev/null +++ b/src/test/resources/strategy/note/schema_org.ics @@ -0,0 +1,8 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:Schema.org +LINK;VALUE=URI;LINKREL=bookmark:https://schema.org/ +CATEGORIES:Education and Employment +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/waranga_news.ics b/src/test/resources/strategy/note/waranga_news.ics new file mode 100644 index 0000000..ea7d095 --- /dev/null +++ b/src/test/resources/strategy/note/waranga_news.ics @@ -0,0 +1,8 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:Waranga News +LINK;VALUE=URI;LINKREL=bookmark:https://www.wnews.org.au/ +CATEGORIES:Lifestyle +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/note/zen_habits.ics b/src/test/resources/strategy/note/zen_habits.ics new file mode 100644 index 0000000..5b538f0 --- /dev/null +++ b/src/test/resources/strategy/note/zen_habits.ics @@ -0,0 +1,11 @@ +BEGIN:VCALENDAR +BEGIN:VJOURNAL +CONCEPT:semcal:concept:note:web_site +SUMMARY:zen habits +LINK;VALUE=URI;LINKREL=bookmark:https://zenhabits.net/ +LINK;VALUE=URI;LINKREL=alternate;LABEL=Zen Habits (YouTube):https://www.youtube.com/@zenhabitsofficial +LINK;VALUE=URI;LINKREL=alternate;LABEL=Zen Habits Podcast:https://link.chtbl.com/ZenHabits +LINK;VALUE=URI;LINKREL=related;LABEL=The Joys of Getting Organized:https://zenhabits.net/joy/ +CATEGORIES:Health and Wellbeing +END:VJOURNAL +END:VCALENDAR diff --git a/src/test/resources/strategy/observance/christmas_day.ics b/src/test/resources/strategy/observance/christmas_day.ics new file mode 100644 index 0000000..9df33b2 --- /dev/null +++ b/src/test/resources/strategy/observance/christmas_day.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +CONCEPT:semcal:concept:observance +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:03361225 +RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/src/test/resources/strategy/observance/december_solstice.ics b/src/test/resources/strategy/observance/december_solstice.ics new file mode 100644 index 0000000..bd4220f --- /dev/null +++ b/src/test/resources/strategy/observance/december_solstice.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +CONCEPT:semcal:concept:observance +SUMMARY:December Solstice +DTSTART:20251221T092000Z +LINK;VALUE=URI;LINKREL=related;LABEL=December Solstice (timeanddate):https://www.timeanddate.com/calendar/december-solstice.html +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/src/test/resources/strategy/observance/june_solstice.ics b/src/test/resources/strategy/observance/june_solstice.ics new file mode 100644 index 0000000..9511c7e --- /dev/null +++ b/src/test/resources/strategy/observance/june_solstice.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +CONCEPT:semcal:concept:observance +SUMMARY:June Solstice +DTSTART:20250621T124200Z +LINK;VALUE=URI;LINKREL=related;LABEL=June Solstice (timeanddate):https://www.timeanddate.com/calendar/june-solstice.html +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/src/test/resources/strategy/observance/march_equinox.ics b/src/test/resources/strategy/observance/march_equinox.ics new file mode 100644 index 0000000..db26eaf --- /dev/null +++ b/src/test/resources/strategy/observance/march_equinox.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +CONCEPT:semcal:concept:observance +SUMMARY:March Equinox +DTSTART:20250320T090100Z +LINK;VALUE=URI;LINKREL=related;LABEL=March Equinox (timeanddate):https://www.timeanddate.com/calendar/march-equinox.html +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/src/test/resources/strategy/observance/new_years_day.ics b/src/test/resources/strategy/observance/new_years_day.ics new file mode 100644 index 0000000..cc41366 --- /dev/null +++ b/src/test/resources/strategy/observance/new_years_day.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +CONCEPT:semcal:concept:observance +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:00010101 +RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/src/test/resources/strategy/observance/september_equinox.ics b/src/test/resources/strategy/observance/september_equinox.ics new file mode 100644 index 0000000..2ad88a8 --- /dev/null +++ b/src/test/resources/strategy/observance/september_equinox.ics @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +CONCEPT:semcal:concept:observance +SUMMARY:September Equinox +DTSTART:20250922T181900Z +LINK;VALUE=URI;LINKREL=related;LABEL=September Equinox (timeanddate):https://www.timeanddate.com/calendar/september-equinox.html +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR