make_a_calendar_toolkit 0.1.0

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +27 -0
  5. data/.ruby-version +1 -0
  6. data/CHANGELOG.md +6 -0
  7. data/CODE_OF_CONDUCT.md +7 -0
  8. data/CONTRIBUTING.md +7 -0
  9. data/Gemfile +4 -0
  10. data/Gemfile.lock +21 -0
  11. data/LICENSE +21 -0
  12. data/README.md +154 -0
  13. data/Rakefile +11 -0
  14. data/SECURITY.md +5 -0
  15. data/docs/README.md +19 -0
  16. data/docs/advanced-examples.md +28 -0
  17. data/docs/api-reference.md +15 -0
  18. data/docs/architecture.md +5 -0
  19. data/docs/business-days.md +7 -0
  20. data/docs/calendar-rendering.md +5 -0
  21. data/docs/date-converters.md +5 -0
  22. data/docs/date-semantics.md +21 -0
  23. data/docs/fiscal-445.md +11 -0
  24. data/docs/getting-started.md +12 -0
  25. data/docs/holidays.md +7 -0
  26. data/docs/ics-export.md +5 -0
  27. data/docs/online-resources.md +12 -0
  28. data/docs/payroll-schedules.md +5 -0
  29. data/docs/printable-calendars.md +11 -0
  30. data/docs/recurring-dates.md +7 -0
  31. data/examples/01-monthly-printable.rb +3 -0
  32. data/examples/02-yearly-svg.rb +3 -0
  33. data/examples/03-federal-holidays.rb +4 -0
  34. data/examples/04-business-deadline.rb +4 -0
  35. data/examples/05-biweekly-payroll.rb +4 -0
  36. data/examples/06-rotating-shifts.rb +4 -0
  37. data/examples/07-fiscal-445.rb +4 -0
  38. data/examples/08-excel-serial.rb +3 -0
  39. data/examples/09-windows-filetime.rb +3 -0
  40. data/examples/10-holidays-ics.rb +4 -0
  41. data/examples/11-rails-style-service.rb +8 -0
  42. data/examples/12-ink-saver-planner.rb +3 -0
  43. data/exe/make-calendar +156 -0
  44. data/lib/make_a_calendar/calendar.rb +187 -0
  45. data/lib/make_a_calendar/converters.rb +90 -0
  46. data/lib/make_a_calendar/core/date_math.rb +86 -0
  47. data/lib/make_a_calendar/errors.rb +7 -0
  48. data/lib/make_a_calendar/export/ics.rb +52 -0
  49. data/lib/make_a_calendar/scheduling/business_days.rb +72 -0
  50. data/lib/make_a_calendar/scheduling/fiscal.rb +67 -0
  51. data/lib/make_a_calendar/scheduling/holidays.rb +60 -0
  52. data/lib/make_a_calendar/scheduling/recurring.rb +100 -0
  53. data/lib/make_a_calendar/version.rb +5 -0
  54. data/lib/make_a_calendar.rb +52 -0
  55. data/samples/calendar-2027.svg +982 -0
  56. data/samples/october-2027-ink-saver.svg +103 -0
  57. data/samples/october-2027.svg +103 -0
  58. data/samples/us-federal-holidays-2027.ics +83 -0
  59. data/samples/us-federal-holidays-2027.json +57 -0
  60. metadata +139 -0
@@ -0,0 +1,103 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc" viewBox="0 0 842 595">
2
+ <title id="title">October 2027</title><desc id="desc">Monthly calendar, October 2027</desc>
3
+ <rect width="100%" height="100%" fill="#ffffff"/>
4
+ <text x="40.0" y="72.0" font-family="Arial,sans-serif" font-size="28" font-weight="700" fill="#000000">October 2027</text>
5
+ <rect x="40.0" y="118.0" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
6
+ <text x="94.42857142857143" y="154.21428571428572" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Mo</text>
7
+ <rect x="148.85714285714286" y="118.0" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
8
+ <text x="203.28571428571428" y="154.21428571428572" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Tu</text>
9
+ <rect x="257.7142857142857" y="118.0" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
10
+ <text x="312.14285714285717" y="154.21428571428572" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">We</text>
11
+ <rect x="366.57142857142856" y="118.0" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
12
+ <text x="421.0" y="154.21428571428572" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Th</text>
13
+ <rect x="475.42857142857144" y="118.0" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
14
+ <text x="529.8571428571429" y="154.21428571428572" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Fr</text>
15
+ <rect x="584.2857142857143" y="118.0" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
16
+ <text x="638.7142857142858" y="154.21428571428572" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Sa</text>
17
+ <rect x="693.1428571428571" y="118.0" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
18
+ <text x="747.5714285714286" y="154.21428571428572" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Su</text>
19
+ <rect x="40.0" y="180.42857142857144" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
20
+ <text x="49.0" y="200.42857142857144" font-family="Arial,sans-serif" font-size="13" fill="#000000">27</text>
21
+ <rect x="148.85714285714286" y="180.42857142857144" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
22
+ <text x="157.85714285714286" y="200.42857142857144" font-family="Arial,sans-serif" font-size="13" fill="#000000">28</text>
23
+ <rect x="257.7142857142857" y="180.42857142857144" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
24
+ <text x="266.7142857142857" y="200.42857142857144" font-family="Arial,sans-serif" font-size="13" fill="#000000">29</text>
25
+ <rect x="366.57142857142856" y="180.42857142857144" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
26
+ <text x="375.57142857142856" y="200.42857142857144" font-family="Arial,sans-serif" font-size="13" fill="#000000">30</text>
27
+ <rect x="475.42857142857144" y="180.42857142857144" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
28
+ <text x="484.42857142857144" y="200.42857142857144" font-family="Arial,sans-serif" font-size="13" fill="#000000">1</text>
29
+ <rect x="584.2857142857143" y="180.42857142857144" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
30
+ <text x="593.2857142857143" y="200.42857142857144" font-family="Arial,sans-serif" font-size="13" fill="#000000">2</text>
31
+ <rect x="693.1428571428571" y="180.42857142857144" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
32
+ <text x="702.1428571428571" y="200.42857142857144" font-family="Arial,sans-serif" font-size="13" fill="#000000">3</text>
33
+ <rect x="40.0" y="242.85714285714286" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
34
+ <text x="49.0" y="262.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">4</text>
35
+ <rect x="148.85714285714286" y="242.85714285714286" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
36
+ <text x="157.85714285714286" y="262.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">5</text>
37
+ <rect x="257.7142857142857" y="242.85714285714286" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
38
+ <text x="266.7142857142857" y="262.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">6</text>
39
+ <rect x="366.57142857142856" y="242.85714285714286" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
40
+ <text x="375.57142857142856" y="262.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">7</text>
41
+ <rect x="475.42857142857144" y="242.85714285714286" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
42
+ <text x="484.42857142857144" y="262.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">8</text>
43
+ <rect x="584.2857142857143" y="242.85714285714286" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
44
+ <text x="593.2857142857143" y="262.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">9</text>
45
+ <rect x="693.1428571428571" y="242.85714285714286" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
46
+ <text x="702.1428571428571" y="262.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">10</text>
47
+ <rect x="40.0" y="305.2857142857143" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
48
+ <text x="49.0" y="325.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">11</text>
49
+ <rect x="148.85714285714286" y="305.2857142857143" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
50
+ <text x="157.85714285714286" y="325.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">12</text>
51
+ <rect x="257.7142857142857" y="305.2857142857143" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
52
+ <text x="266.7142857142857" y="325.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">13</text>
53
+ <rect x="366.57142857142856" y="305.2857142857143" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
54
+ <text x="375.57142857142856" y="325.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">14</text>
55
+ <rect x="475.42857142857144" y="305.2857142857143" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
56
+ <text x="484.42857142857144" y="325.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">15</text>
57
+ <rect x="584.2857142857143" y="305.2857142857143" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
58
+ <text x="593.2857142857143" y="325.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">16</text>
59
+ <rect x="693.1428571428571" y="305.2857142857143" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
60
+ <text x="702.1428571428571" y="325.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">17</text>
61
+ <rect x="40.0" y="367.7142857142857" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
62
+ <text x="49.0" y="387.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">18</text>
63
+ <rect x="148.85714285714286" y="367.7142857142857" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
64
+ <text x="157.85714285714286" y="387.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">19</text>
65
+ <rect x="257.7142857142857" y="367.7142857142857" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
66
+ <text x="266.7142857142857" y="387.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">20</text>
67
+ <rect x="366.57142857142856" y="367.7142857142857" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
68
+ <text x="375.57142857142856" y="387.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">21</text>
69
+ <rect x="475.42857142857144" y="367.7142857142857" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
70
+ <text x="484.42857142857144" y="387.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">22</text>
71
+ <rect x="584.2857142857143" y="367.7142857142857" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
72
+ <text x="593.2857142857143" y="387.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">23</text>
73
+ <rect x="693.1428571428571" y="367.7142857142857" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
74
+ <text x="702.1428571428571" y="387.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">24</text>
75
+ <rect x="40.0" y="430.14285714285717" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
76
+ <text x="49.0" y="450.14285714285717" font-family="Arial,sans-serif" font-size="13" fill="#000000">25</text>
77
+ <rect x="148.85714285714286" y="430.14285714285717" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
78
+ <text x="157.85714285714286" y="450.14285714285717" font-family="Arial,sans-serif" font-size="13" fill="#000000">26</text>
79
+ <rect x="257.7142857142857" y="430.14285714285717" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
80
+ <text x="266.7142857142857" y="450.14285714285717" font-family="Arial,sans-serif" font-size="13" fill="#000000">27</text>
81
+ <rect x="366.57142857142856" y="430.14285714285717" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
82
+ <text x="375.57142857142856" y="450.14285714285717" font-family="Arial,sans-serif" font-size="13" fill="#000000">28</text>
83
+ <rect x="475.42857142857144" y="430.14285714285717" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
84
+ <text x="484.42857142857144" y="450.14285714285717" font-family="Arial,sans-serif" font-size="13" fill="#000000">29</text>
85
+ <rect x="584.2857142857143" y="430.14285714285717" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
86
+ <text x="593.2857142857143" y="450.14285714285717" font-family="Arial,sans-serif" font-size="13" fill="#000000">30</text>
87
+ <rect x="693.1428571428571" y="430.14285714285717" width="108.85714285714286" height="62.42857142857143" fill="#ffffff" stroke="#555555"/>
88
+ <text x="702.1428571428571" y="450.14285714285717" font-family="Arial,sans-serif" font-size="13" fill="#000000">31</text>
89
+ <rect x="40.0" y="492.57142857142856" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
90
+ <text x="49.0" y="512.5714285714286" font-family="Arial,sans-serif" font-size="13" fill="#000000">1</text>
91
+ <rect x="148.85714285714286" y="492.57142857142856" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
92
+ <text x="157.85714285714286" y="512.5714285714286" font-family="Arial,sans-serif" font-size="13" fill="#000000">2</text>
93
+ <rect x="257.7142857142857" y="492.57142857142856" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
94
+ <text x="266.7142857142857" y="512.5714285714286" font-family="Arial,sans-serif" font-size="13" fill="#000000">3</text>
95
+ <rect x="366.57142857142856" y="492.57142857142856" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
96
+ <text x="375.57142857142856" y="512.5714285714286" font-family="Arial,sans-serif" font-size="13" fill="#000000">4</text>
97
+ <rect x="475.42857142857144" y="492.57142857142856" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
98
+ <text x="484.42857142857144" y="512.5714285714286" font-family="Arial,sans-serif" font-size="13" fill="#000000">5</text>
99
+ <rect x="584.2857142857143" y="492.57142857142856" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
100
+ <text x="593.2857142857143" y="512.5714285714286" font-family="Arial,sans-serif" font-size="13" fill="#000000">6</text>
101
+ <rect x="693.1428571428571" y="492.57142857142856" width="108.85714285714286" height="62.42857142857143" fill="#f1f1f1" stroke="#555555"/>
102
+ <text x="702.1428571428571" y="512.5714285714286" font-family="Arial,sans-serif" font-size="13" fill="#000000">7</text>
103
+ </svg>
@@ -0,0 +1,103 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc" viewBox="0 0 612 792">
2
+ <title id="title">October 2027</title><desc id="desc">Monthly calendar, October 2027</desc>
3
+ <rect width="100%" height="100%" fill="#ffffff"/>
4
+ <text x="40.0" y="72.0" font-family="Arial,sans-serif" font-size="28" font-weight="700" fill="#000000">October 2027</text>
5
+ <rect x="40.0" y="118.0" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
6
+ <text x="78.0" y="168.28571428571428" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Su</text>
7
+ <rect x="116.0" y="118.0" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
8
+ <text x="154.0" y="168.28571428571428" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Mo</text>
9
+ <rect x="192.0" y="118.0" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
10
+ <text x="230.0" y="168.28571428571428" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Tu</text>
11
+ <rect x="268.0" y="118.0" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
12
+ <text x="306.0" y="168.28571428571428" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">We</text>
13
+ <rect x="344.0" y="118.0" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
14
+ <text x="382.0" y="168.28571428571428" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Th</text>
15
+ <rect x="420.0" y="118.0" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
16
+ <text x="458.0" y="168.28571428571428" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Fr</text>
17
+ <rect x="496.0" y="118.0" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
18
+ <text x="534.0" y="168.28571428571428" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" font-weight="700" fill="#000000">Sa</text>
19
+ <rect x="40.0" y="208.57142857142856" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
20
+ <text x="49.0" y="228.57142857142856" font-family="Arial,sans-serif" font-size="13" fill="#000000">26</text>
21
+ <rect x="116.0" y="208.57142857142856" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
22
+ <text x="125.0" y="228.57142857142856" font-family="Arial,sans-serif" font-size="13" fill="#000000">27</text>
23
+ <rect x="192.0" y="208.57142857142856" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
24
+ <text x="201.0" y="228.57142857142856" font-family="Arial,sans-serif" font-size="13" fill="#000000">28</text>
25
+ <rect x="268.0" y="208.57142857142856" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
26
+ <text x="277.0" y="228.57142857142856" font-family="Arial,sans-serif" font-size="13" fill="#000000">29</text>
27
+ <rect x="344.0" y="208.57142857142856" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
28
+ <text x="353.0" y="228.57142857142856" font-family="Arial,sans-serif" font-size="13" fill="#000000">30</text>
29
+ <rect x="420.0" y="208.57142857142856" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
30
+ <text x="429.0" y="228.57142857142856" font-family="Arial,sans-serif" font-size="13" fill="#000000">1</text>
31
+ <rect x="496.0" y="208.57142857142856" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
32
+ <text x="505.0" y="228.57142857142856" font-family="Arial,sans-serif" font-size="13" fill="#000000">2</text>
33
+ <rect x="40.0" y="299.1428571428571" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
34
+ <text x="49.0" y="319.1428571428571" font-family="Arial,sans-serif" font-size="13" fill="#000000">3</text>
35
+ <rect x="116.0" y="299.1428571428571" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
36
+ <text x="125.0" y="319.1428571428571" font-family="Arial,sans-serif" font-size="13" fill="#000000">4</text>
37
+ <rect x="192.0" y="299.1428571428571" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
38
+ <text x="201.0" y="319.1428571428571" font-family="Arial,sans-serif" font-size="13" fill="#000000">5</text>
39
+ <rect x="268.0" y="299.1428571428571" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
40
+ <text x="277.0" y="319.1428571428571" font-family="Arial,sans-serif" font-size="13" fill="#000000">6</text>
41
+ <rect x="344.0" y="299.1428571428571" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
42
+ <text x="353.0" y="319.1428571428571" font-family="Arial,sans-serif" font-size="13" fill="#000000">7</text>
43
+ <rect x="420.0" y="299.1428571428571" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
44
+ <text x="429.0" y="319.1428571428571" font-family="Arial,sans-serif" font-size="13" fill="#000000">8</text>
45
+ <rect x="496.0" y="299.1428571428571" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
46
+ <text x="505.0" y="319.1428571428571" font-family="Arial,sans-serif" font-size="13" fill="#000000">9</text>
47
+ <rect x="40.0" y="389.7142857142857" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
48
+ <text x="49.0" y="409.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">10</text>
49
+ <rect x="116.0" y="389.7142857142857" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
50
+ <text x="125.0" y="409.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">11</text>
51
+ <rect x="192.0" y="389.7142857142857" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
52
+ <text x="201.0" y="409.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">12</text>
53
+ <rect x="268.0" y="389.7142857142857" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
54
+ <text x="277.0" y="409.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">13</text>
55
+ <rect x="344.0" y="389.7142857142857" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
56
+ <text x="353.0" y="409.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">14</text>
57
+ <rect x="420.0" y="389.7142857142857" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
58
+ <text x="429.0" y="409.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">15</text>
59
+ <rect x="496.0" y="389.7142857142857" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
60
+ <text x="505.0" y="409.7142857142857" font-family="Arial,sans-serif" font-size="13" fill="#000000">16</text>
61
+ <rect x="40.0" y="480.2857142857143" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
62
+ <text x="49.0" y="500.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">17</text>
63
+ <rect x="116.0" y="480.2857142857143" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
64
+ <text x="125.0" y="500.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">18</text>
65
+ <rect x="192.0" y="480.2857142857143" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
66
+ <text x="201.0" y="500.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">19</text>
67
+ <rect x="268.0" y="480.2857142857143" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
68
+ <text x="277.0" y="500.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">20</text>
69
+ <rect x="344.0" y="480.2857142857143" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
70
+ <text x="353.0" y="500.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">21</text>
71
+ <rect x="420.0" y="480.2857142857143" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
72
+ <text x="429.0" y="500.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">22</text>
73
+ <rect x="496.0" y="480.2857142857143" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
74
+ <text x="505.0" y="500.2857142857143" font-family="Arial,sans-serif" font-size="13" fill="#000000">23</text>
75
+ <rect x="40.0" y="570.8571428571429" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
76
+ <text x="49.0" y="590.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">24</text>
77
+ <rect x="116.0" y="570.8571428571429" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
78
+ <text x="125.0" y="590.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">25</text>
79
+ <rect x="192.0" y="570.8571428571429" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
80
+ <text x="201.0" y="590.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">26</text>
81
+ <rect x="268.0" y="570.8571428571429" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
82
+ <text x="277.0" y="590.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">27</text>
83
+ <rect x="344.0" y="570.8571428571429" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
84
+ <text x="353.0" y="590.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">28</text>
85
+ <rect x="420.0" y="570.8571428571429" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
86
+ <text x="429.0" y="590.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">29</text>
87
+ <rect x="496.0" y="570.8571428571429" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
88
+ <text x="505.0" y="590.8571428571429" font-family="Arial,sans-serif" font-size="13" fill="#000000">30</text>
89
+ <rect x="40.0" y="661.4285714285714" width="76.0" height="90.57142857142857" fill="#ffffff" stroke="#555555"/>
90
+ <text x="49.0" y="681.4285714285714" font-family="Arial,sans-serif" font-size="13" fill="#000000">31</text>
91
+ <rect x="116.0" y="661.4285714285714" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
92
+ <text x="125.0" y="681.4285714285714" font-family="Arial,sans-serif" font-size="13" fill="#000000">1</text>
93
+ <rect x="192.0" y="661.4285714285714" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
94
+ <text x="201.0" y="681.4285714285714" font-family="Arial,sans-serif" font-size="13" fill="#000000">2</text>
95
+ <rect x="268.0" y="661.4285714285714" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
96
+ <text x="277.0" y="681.4285714285714" font-family="Arial,sans-serif" font-size="13" fill="#000000">3</text>
97
+ <rect x="344.0" y="661.4285714285714" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
98
+ <text x="353.0" y="681.4285714285714" font-family="Arial,sans-serif" font-size="13" fill="#000000">4</text>
99
+ <rect x="420.0" y="661.4285714285714" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
100
+ <text x="429.0" y="681.4285714285714" font-family="Arial,sans-serif" font-size="13" fill="#000000">5</text>
101
+ <rect x="496.0" y="661.4285714285714" width="76.0" height="90.57142857142857" fill="#f1f1f1" stroke="#555555"/>
102
+ <text x="505.0" y="681.4285714285714" font-family="Arial,sans-serif" font-size="13" fill="#000000">6</text>
103
+ </svg>
@@ -0,0 +1,83 @@
1
+ BEGIN:VCALENDAR
2
+ VERSION:2.0
3
+ PRODID:-//Make a Calendar Toolkit//EN
4
+ CALSCALE:GREGORIAN
5
+ X-WR-CALNAME:US Federal Holidays 2027
6
+ BEGIN:VEVENT
7
+ UID:20270101-1@make-a-calendar-toolkit
8
+ DTSTAMP:20261012T114039Z
9
+ DTSTART;VALUE=DATE:20270101
10
+ DTEND;VALUE=DATE:20270102
11
+ SUMMARY:New Year's Day
12
+ END:VEVENT
13
+ BEGIN:VEVENT
14
+ UID:20270118-2@make-a-calendar-toolkit
15
+ DTSTAMP:20261012T114039Z
16
+ DTSTART;VALUE=DATE:20270118
17
+ DTEND;VALUE=DATE:20270119
18
+ SUMMARY:Birthday of Martin Luther King\, Jr.
19
+ END:VEVENT
20
+ BEGIN:VEVENT
21
+ UID:20270215-3@make-a-calendar-toolkit
22
+ DTSTAMP:20261012T114039Z
23
+ DTSTART;VALUE=DATE:20270215
24
+ DTEND;VALUE=DATE:20270216
25
+ SUMMARY:Washington's Birthday
26
+ END:VEVENT
27
+ BEGIN:VEVENT
28
+ UID:20270531-4@make-a-calendar-toolkit
29
+ DTSTAMP:20261012T114039Z
30
+ DTSTART;VALUE=DATE:20270531
31
+ DTEND;VALUE=DATE:20270601
32
+ SUMMARY:Memorial Day
33
+ END:VEVENT
34
+ BEGIN:VEVENT
35
+ UID:20270618-5@make-a-calendar-toolkit
36
+ DTSTAMP:20261012T114039Z
37
+ DTSTART;VALUE=DATE:20270618
38
+ DTEND;VALUE=DATE:20270619
39
+ SUMMARY:Juneteenth National Independence Day
40
+ END:VEVENT
41
+ BEGIN:VEVENT
42
+ UID:20270705-6@make-a-calendar-toolkit
43
+ DTSTAMP:20261012T114039Z
44
+ DTSTART;VALUE=DATE:20270705
45
+ DTEND;VALUE=DATE:20270706
46
+ SUMMARY:Independence Day
47
+ END:VEVENT
48
+ BEGIN:VEVENT
49
+ UID:20270906-7@make-a-calendar-toolkit
50
+ DTSTAMP:20261012T114039Z
51
+ DTSTART;VALUE=DATE:20270906
52
+ DTEND;VALUE=DATE:20270907
53
+ SUMMARY:Labor Day
54
+ END:VEVENT
55
+ BEGIN:VEVENT
56
+ UID:20271011-8@make-a-calendar-toolkit
57
+ DTSTAMP:20261012T114039Z
58
+ DTSTART;VALUE=DATE:20271011
59
+ DTEND;VALUE=DATE:20271012
60
+ SUMMARY:Columbus Day
61
+ END:VEVENT
62
+ BEGIN:VEVENT
63
+ UID:20271111-9@make-a-calendar-toolkit
64
+ DTSTAMP:20261012T114039Z
65
+ DTSTART;VALUE=DATE:20271111
66
+ DTEND;VALUE=DATE:20271112
67
+ SUMMARY:Veterans Day
68
+ END:VEVENT
69
+ BEGIN:VEVENT
70
+ UID:20271125-10@make-a-calendar-toolkit
71
+ DTSTAMP:20261012T114039Z
72
+ DTSTART;VALUE=DATE:20271125
73
+ DTEND;VALUE=DATE:20271126
74
+ SUMMARY:Thanksgiving Day
75
+ END:VEVENT
76
+ BEGIN:VEVENT
77
+ UID:20271224-11@make-a-calendar-toolkit
78
+ DTSTAMP:20261012T114039Z
79
+ DTSTART;VALUE=DATE:20271224
80
+ DTEND;VALUE=DATE:20271225
81
+ SUMMARY:Christmas Day
82
+ END:VEVENT
83
+ END:VCALENDAR
@@ -0,0 +1,57 @@
1
+ [
2
+ {
3
+ "name": "New Year's Day",
4
+ "date": "2027-01-01",
5
+ "observed_date": "2027-01-01"
6
+ },
7
+ {
8
+ "name": "Birthday of Martin Luther King, Jr.",
9
+ "date": "2027-01-18",
10
+ "observed_date": "2027-01-18"
11
+ },
12
+ {
13
+ "name": "Washington's Birthday",
14
+ "date": "2027-02-15",
15
+ "observed_date": "2027-02-15"
16
+ },
17
+ {
18
+ "name": "Memorial Day",
19
+ "date": "2027-05-31",
20
+ "observed_date": "2027-05-31"
21
+ },
22
+ {
23
+ "name": "Juneteenth National Independence Day",
24
+ "date": "2027-06-19",
25
+ "observed_date": "2027-06-18"
26
+ },
27
+ {
28
+ "name": "Independence Day",
29
+ "date": "2027-07-04",
30
+ "observed_date": "2027-07-05"
31
+ },
32
+ {
33
+ "name": "Labor Day",
34
+ "date": "2027-09-06",
35
+ "observed_date": "2027-09-06"
36
+ },
37
+ {
38
+ "name": "Columbus Day",
39
+ "date": "2027-10-11",
40
+ "observed_date": "2027-10-11"
41
+ },
42
+ {
43
+ "name": "Veterans Day",
44
+ "date": "2027-11-11",
45
+ "observed_date": "2027-11-11"
46
+ },
47
+ {
48
+ "name": "Thanksgiving Day",
49
+ "date": "2027-11-25",
50
+ "observed_date": "2027-11-25"
51
+ },
52
+ {
53
+ "name": "Christmas Day",
54
+ "date": "2027-12-25",
55
+ "observed_date": "2027-12-24"
56
+ }
57
+ ]
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: make_a_calendar_toolkit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ethan
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rake
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '12.0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '12.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: minitest
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
40
+ description: |
41
+ Make a Calendar Toolkit is an offline Ruby library and command-line tool for calendar grids,
42
+ US federal holiday dates, business-day arithmetic, recurring pay schedules, rotating shifts,
43
+ NRF-style retail fiscal calendars, date conversions, SVG and HTML calendars, JSON and CSV
44
+ data, and date-only iCalendar exports. It is original Ruby code inspired by practical date
45
+ workflows; it does not call or reproduce the private implementation of Make a Calendar.
46
+ Created by Ethan, the developer behind https://make-a-calendar.com/.
47
+ email:
48
+ - makeacalendarcom@gmail.com
49
+ executables:
50
+ - make-calendar
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - ".gitignore"
55
+ - ".rspec"
56
+ - ".rubocop.yml"
57
+ - ".ruby-version"
58
+ - CHANGELOG.md
59
+ - CODE_OF_CONDUCT.md
60
+ - CONTRIBUTING.md
61
+ - Gemfile
62
+ - Gemfile.lock
63
+ - LICENSE
64
+ - README.md
65
+ - Rakefile
66
+ - SECURITY.md
67
+ - docs/README.md
68
+ - docs/advanced-examples.md
69
+ - docs/api-reference.md
70
+ - docs/architecture.md
71
+ - docs/business-days.md
72
+ - docs/calendar-rendering.md
73
+ - docs/date-converters.md
74
+ - docs/date-semantics.md
75
+ - docs/fiscal-445.md
76
+ - docs/getting-started.md
77
+ - docs/holidays.md
78
+ - docs/ics-export.md
79
+ - docs/online-resources.md
80
+ - docs/payroll-schedules.md
81
+ - docs/printable-calendars.md
82
+ - docs/recurring-dates.md
83
+ - examples/01-monthly-printable.rb
84
+ - examples/02-yearly-svg.rb
85
+ - examples/03-federal-holidays.rb
86
+ - examples/04-business-deadline.rb
87
+ - examples/05-biweekly-payroll.rb
88
+ - examples/06-rotating-shifts.rb
89
+ - examples/07-fiscal-445.rb
90
+ - examples/08-excel-serial.rb
91
+ - examples/09-windows-filetime.rb
92
+ - examples/10-holidays-ics.rb
93
+ - examples/11-rails-style-service.rb
94
+ - examples/12-ink-saver-planner.rb
95
+ - exe/make-calendar
96
+ - lib/make_a_calendar.rb
97
+ - lib/make_a_calendar/calendar.rb
98
+ - lib/make_a_calendar/converters.rb
99
+ - lib/make_a_calendar/core/date_math.rb
100
+ - lib/make_a_calendar/errors.rb
101
+ - lib/make_a_calendar/export/ics.rb
102
+ - lib/make_a_calendar/scheduling/business_days.rb
103
+ - lib/make_a_calendar/scheduling/fiscal.rb
104
+ - lib/make_a_calendar/scheduling/holidays.rb
105
+ - lib/make_a_calendar/scheduling/recurring.rb
106
+ - lib/make_a_calendar/version.rb
107
+ - samples/calendar-2027.svg
108
+ - samples/october-2027-ink-saver.svg
109
+ - samples/october-2027.svg
110
+ - samples/us-federal-holidays-2027.ics
111
+ - samples/us-federal-holidays-2027.json
112
+ homepage: https://make-a-calendar.com/
113
+ licenses:
114
+ - MIT
115
+ metadata:
116
+ homepage_uri: https://make-a-calendar.com/
117
+ source_code_uri: https://github.com/makeacalendar/make-a-calendar-ruby
118
+ documentation_uri: https://github.com/makeacalendar/make-a-calendar-ruby/tree/main/docs
119
+ changelog_uri: https://github.com/makeacalendar/make-a-calendar-ruby/blob/main/CHANGELOG.md
120
+ bug_tracker_uri: https://github.com/makeacalendar/make-a-calendar-ruby/issues
121
+ rdoc_options: []
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '2.6'
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubygems_version: 3.6.9
136
+ specification_version: 4
137
+ summary: Ruby toolkit for printable calendars, business schedules, holidays, fiscal
138
+ planning, and date conversions.
139
+ test_files: []