date_easter 0.0.1

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 (5) hide show
  1. data/README +29 -0
  2. data/lib/date_easter.rb +91 -0
  3. data/test/t01fast.rb +142 -0
  4. data/test/t02stress.rb +54 -0
  5. metadata +49 -0
data/README ADDED
@@ -0,0 +1,29 @@
1
+ = date_easter: calculate the day upon which Easter Sunday falls
2
+ -----
3
+
4
+
5
+ == OVERVIEW
6
+ -----
7
+ This module calculates the date upon which Easter falls, a date upon
8
+ which many holidays in the Western world depend. It extends the
9
+ Date class available in the Ruby standard library, adding the
10
+ class method Date::easter(year) and the instance method easter().
11
+
12
+
13
+ == BUGS
14
+ -----
15
+ Julian / Orthodox easter calculations are not yet implemented.
16
+
17
+
18
+ == LICENSE
19
+ -----
20
+ This program is free software! You can copy, modify, share and
21
+ distribute it under the same license as Ruby itself.
22
+
23
+
24
+ == AUTHOR
25
+ -----
26
+ Rick Scott
27
+ rick@shadowspar.dyndns.org
28
+
29
+ Patches, feature requests, and bug reports are welcome.
@@ -0,0 +1,91 @@
1
+ # date_easter: calculate the day upon which Easter Sunday falls
2
+ #
3
+ # This program is free software! You can copy, modify, share and
4
+ # distribute it under the same license as Ruby itself.
5
+ #
6
+ # Rick Scott
7
+ # rick@shadowspar.dyndns.org
8
+ #
9
+ # Tue Nov 28 22:57:01 EST 2006
10
+ #
11
+ #
12
+ # == Overview
13
+ #
14
+ # This module calculates the date upon which Easter falls, a date
15
+ # upon which many holidays in the Western world depend.
16
+ # It extends the Date class available in the Ruby standard library,
17
+ # adding the class method Date::easter(year) and the instance
18
+ # method easter(). It returns the correct date of Easter Sunday for
19
+ # the Gregorian calendar years 1583 to 4099.
20
+ #
21
+ # == Background
22
+ #
23
+ # Determining when Easter falls is a somewhat arcane process,
24
+ # largely due to the numerous adjustments that have been made to
25
+ # the Gregorian calendar in an attempt to `fit together' the
26
+ # cycles of the sun, moon, and earth. Detailed discussion here
27
+ # would be somewhat pointless in light of the far superior
28
+ # resources available online -- see 'References', below, for some
29
+ # starting points.
30
+ #
31
+ # == References
32
+ #
33
+ # http://en.wikipedia.org/wiki/Computus
34
+ # http://www.phys.uu.nl/~vgent/easter/easter_text2a.htm
35
+ # http://users.chariot.net.au/~gmarts/eastcalc.htm
36
+
37
+
38
+
39
+ require 'date'
40
+
41
+ class Date
42
+
43
+ # :call-seq:
44
+ # Date::easter(year) => easter_sunday_Date
45
+ #
46
+ # Return the Date upon which Easter Sunday falls in _year_.
47
+ # The Gregorian calendar is used.
48
+ def self.easter(year)
49
+ unless year.is_a? Numeric
50
+ raise TypeError, "year must be Numeric"
51
+ end
52
+
53
+ if year < 1583
54
+ raise ArgumentError, "Years before 1583 not supported"
55
+ elsif year > 4099
56
+ raise ArgumentError, "Years after 4099 not supported"
57
+ end
58
+
59
+ golden_number = (year % 19) + 1
60
+ century = (year / 100) + 1
61
+ julian_epact = (11 * (golden_number -1)) % 30
62
+ solar_correction = (3 * century) / 4
63
+ lunar_correction = ((8 * century) + 5) / 25
64
+
65
+ gregorian_epact =
66
+ (julian_epact - solar_correction + lunar_correction + 8) % 30
67
+
68
+ days_fm_ve_to_pfm = (23 - gregorian_epact) % 30
69
+
70
+ if gregorian_epact == 24 or gregorian_epact == 25 && golden_number > 11
71
+ days_fm_ve_to_pfm -= 1
72
+ end
73
+
74
+ vernal_equinox = Date.new(year, 3, 21)
75
+ paschal_full_moon = vernal_equinox + days_fm_ve_to_pfm
76
+
77
+ days_to_sunday = 7 - paschal_full_moon.wday
78
+
79
+ easter_sunday = paschal_full_moon + days_to_sunday
80
+ end
81
+
82
+
83
+ # :call-seq:
84
+ # ref.easter() => easter_sunday_Date
85
+ #
86
+ # Return the Date of Easter Sunday for the year in which _ref_
87
+ # falls. The Gregorian calendar is used.
88
+ def easter
89
+ Date::easter(self.year)
90
+ end
91
+ end
@@ -0,0 +1,142 @@
1
+ # t01fast.rb: abbreviated test suite for date_easter
2
+ #
3
+ # This program is free software! You can copy, modify, share and
4
+ # distribute it under the same license as Ruby itself.
5
+ #
6
+ # Rick Scott
7
+ # rick@shadowspar.dyndns.org
8
+ #
9
+ # Wed Nov 29 21:21:16 EST 2006
10
+ #
11
+ # for rationale on choosing these dates, have a look at:
12
+ # http://en.wikipedia.org/wiki/Epoch_%28reference_date%29
13
+ # http://www.theiet.org/publicaffairs/scs/problemdates.cfm
14
+
15
+ require 'test/unit'
16
+ require 'date_easter'
17
+
18
+
19
+ class TC_Correctness < Test::Unit::TestCase
20
+ def test_correctness
21
+ test_dates = %w{
22
+ 10 04 1583
23
+ 01 04 1584
24
+ 07 04 1602
25
+ 02 04 1752
26
+
27
+ 04 04 1858
28
+ 02 04 1899
29
+ 15 04 1900
30
+ 07 04 1901
31
+ 03 04 1904
32
+
33
+ 06 04 1969
34
+ 29 03 1970
35
+ 11 04 1971
36
+ 10 04 1977
37
+ 26 03 1978
38
+ 15 04 1979
39
+ 06 04 1980
40
+
41
+ 19 04 1981
42
+ 11 04 1982
43
+ 03 04 1983
44
+ 22 04 1984
45
+ 07 04 1985
46
+ 30 03 1986
47
+ 19 04 1987
48
+ 03 04 1988
49
+ 26 03 1989
50
+ 15 04 1990
51
+
52
+ 31 03 1991
53
+ 19 04 1992
54
+ 11 04 1993
55
+ 03 04 1994
56
+ 16 04 1995
57
+ 07 04 1996
58
+ 30 03 1997
59
+ 12 04 1998
60
+ 04 04 1999
61
+ 23 04 2000
62
+
63
+ 15 04 2001
64
+ 31 03 2002
65
+ 20 04 2003
66
+ 11 04 2004
67
+ 27 03 2005
68
+ 16 04 2006
69
+ 08 04 2007
70
+ 23 03 2008
71
+ 12 04 2009
72
+ 04 04 2010
73
+
74
+ 24 04 2011
75
+ 08 04 2012
76
+ 31 03 2013
77
+ 20 04 2014
78
+ 05 04 2015
79
+ 27 03 2016
80
+ 16 04 2017
81
+ 01 04 2018
82
+ 21 04 2019
83
+ 12 04 2020
84
+
85
+ 04 04 2021
86
+ 17 04 2022
87
+ 09 04 2023
88
+ 31 03 2024
89
+ 20 04 2025
90
+ 05 04 2026
91
+ 28 03 2027
92
+ 16 04 2028
93
+ 01 04 2029
94
+ 21 04 2030
95
+
96
+ 13 04 2031
97
+ 28 03 2032
98
+ 17 04 2033
99
+ 09 04 2034
100
+ 25 03 2035
101
+ 13 04 2036
102
+ 05 04 2037
103
+ 25 04 2038
104
+ 10 04 2039
105
+ 01 04 2040
106
+
107
+ 21 04 2041
108
+ 06 04 2042
109
+ 29 03 2043
110
+ 17 04 2044
111
+ 09 04 2045
112
+ 25 03 2046
113
+ 14 04 2047
114
+ 05 04 2048
115
+ 18 04 2049
116
+ 10 04 2050
117
+
118
+ 18 04 2060
119
+ 30 03 2070
120
+ 07 04 2080
121
+ 16 04 2090
122
+ 12 04 2099
123
+ 28 03 2100
124
+ 17 04 2101
125
+
126
+ 06 04 4098
127
+ 19 04 4099
128
+ }
129
+
130
+ until test_dates.empty?
131
+ day = test_dates.shift.to_i
132
+ month = test_dates.shift.to_i
133
+ year = test_dates.shift.to_i
134
+
135
+ easter_date = Date::easter(year)
136
+ assert_equal(year, easter_date.year, "Year of Easter #{year}" )
137
+ assert_equal(month, easter_date.month, "Month of Easter #{year}")
138
+ assert_equal(day, easter_date.day , "Day of Easter #{year}" )
139
+ end
140
+ end
141
+ end
142
+
@@ -0,0 +1,54 @@
1
+ # t02stress.rb: stress tests for date_easter
2
+ #
3
+ # This program is free software! You can copy, modify, share and
4
+ # distribute it under the same license as Ruby itself.
5
+ #
6
+ # Rick Scott
7
+ # rick@shadowspar.dyndns.org
8
+ #
9
+ # Wed Nov 29 21:21:16 EST 2006
10
+ #
11
+ # for rationale on choosing these dates, have a look at:
12
+ # http://en.wikipedia.org/wiki/Epoch_%28reference_date%29
13
+ # http://www.theiet.org/publicaffairs/scs/problemdates.cfm
14
+
15
+ require 'test/unit'
16
+ require 'date_easter'
17
+
18
+
19
+ class TC_Stress < Test::Unit::TestCase
20
+ def test_year_rubbish
21
+ assert_raise TypeError do
22
+ Date::easter(nil)
23
+ end
24
+
25
+ assert_raise TypeError do
26
+ Date::easter('asdf')
27
+ end
28
+ end
29
+
30
+ def test_year_toobig
31
+ assert_raise ArgumentError do
32
+ Date::easter(9999)
33
+ end
34
+
35
+ ridiculous_future_date = Date.new(12345, 12, 31)
36
+
37
+ assert_raise ArgumentError do
38
+ ridiculous_future_date.easter()
39
+ end
40
+ end
41
+
42
+ def test_year_toosmall
43
+ assert_raise ArgumentError do
44
+ Date::easter(1)
45
+ end
46
+
47
+ ridiculous_ancient_date = Date.new(-1234, 12, 31)
48
+
49
+ assert_raise ArgumentError do
50
+ ridiculous_ancient_date.easter()
51
+ end
52
+ end
53
+ end
54
+
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: date_easter
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.0.1
7
+ date: 2006-11-30 00:00:00 -05:00
8
+ summary: Calculate the date on which Easter falls.
9
+ require_paths:
10
+ - lib
11
+ email: rick@shadowspar.dyndns.org
12
+ homepage: http://shadowspar.dyndns.org/rick/
13
+ rubyforge_project: date_easter
14
+ description: "This module calculates the date upon which Easter falls, a date upon which many
15
+ holidays in the Western world depend. It extends the Date class available in
16
+ the Ruby standard library, adding the class method Date::easter(year) and the
17
+ instance method easter()."
18
+ autorequire:
19
+ default_executable:
20
+ bindir: bin
21
+ has_rdoc: true
22
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
23
+ requirements:
24
+ -
25
+ - ">"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.0.0
28
+ version:
29
+ platform: ruby
30
+ signing_key:
31
+ cert_chain:
32
+ post_install_message:
33
+ authors:
34
+ - Rick Scott
35
+ files:
36
+ - lib/date_easter.rb
37
+ - test/t01fast.rb
38
+ - test/t02stress.rb
39
+ - README
40
+ test_files:
41
+ - test/t01fast.rb
42
+ - test/t02stress.rb
43
+ rdoc_options: []
44
+ extra_rdoc_files:
45
+ - README
46
+ executables: []
47
+ extensions: []
48
+ requirements: []
49
+ dependencies: []