zmanim 0.1.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1f7a1368c46f18f412f39609c0d076d14e9786a5
4
- data.tar.gz: f74bde128ee6b5131e1f55ede44feff17ac853f3
2
+ SHA256:
3
+ metadata.gz: 60f1ce1f598d2bb45067fadbb609dca84e62e94da2144d6815c04a14083eeeb9
4
+ data.tar.gz: e83e26224f23d21216258f3e31ad65bafc18af91f250c09ab9e0a5941061aa34
5
5
  SHA512:
6
- metadata.gz: cc70992c4c514e0ba3b77126dace5f4f216c9714b84bd4b5dbf0e80e14a1a994544e708f70c2e650e9aac5d125c3fd391bac4524318d8607fefc6ea874f55c5d
7
- data.tar.gz: a85bc156410ea7493f1156e5f100b6a83e5cdb2fe99f90835c2f3c56b80d41c8727c791820ecc088743d05c31817bcc6fe21ff292014fd1f0a5c93590a9a5bb0
6
+ metadata.gz: '0868fb13463bc643a818c5faa9aad148659ea8597eceadbafbc4a544d8cc88f7b8ec069361939f860eb6c76c4c07b70f7e0100ab3b4e4ff2e19a73fb2dec9908'
7
+ data.tar.gz: 946ccd345d2fcb4612ff4b2b2782de1c78a822e97fd70b12b4c48569c51d98907aeb05dd9b97894fa0cc4a9397167e5af75e53492e625c9b2f425282ae9d8e08
@@ -0,0 +1,53 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
+ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [0.4.0] - 2020-10-13
8
+ ### Added
9
+ - `JewishCalendar#end_of_week` returns Shabbos for this week
10
+ - Parshas Hashavua modifier to return blank Limud if the standard Parsha is not read this Shabbos
11
+ - Daf Hashavua calculator
12
+ ### Changed
13
+ - Refactor kviah calculation logic to JewishDate
14
+ - Remove formatter dependency for Parsha calculator
15
+ ### Fixed
16
+ - Added Lag B'Omer as significant day / yom tov
17
+ - Fixed Lag B'Omer spelling for english formatted omer
18
+
19
+ ## [0.3.0] - 2018-09-17
20
+ ### Added
21
+ - Elevations used in shaos zmanios calculations if use_elevation property is set
22
+ - Hanetz and Shkia methods will use the appropriate calculation based on use_elevation setting
23
+ - Support Alos and Tzais offset using temporal minutes
24
+ - Various Assur Bemelacha related methods for calendar dates using JewishCalendar,
25
+ as well as point-in-time using ZmanimCalendar.
26
+ - Methods to determine Shabbos Mevorchim, first night of Vesein Tal Umatar,
27
+ and delayed candle lighting
28
+
29
+ ## [0.2.2] - 2018-08-31
30
+ ### Fixed
31
+ - Typo in formatted Masechtos
32
+ - Additional load sequence issues
33
+
34
+ ## [0.2.1] - 2018-04-30
35
+ ### Fixed
36
+ - Additional load sequence issues
37
+
38
+ ## [0.2.0] - 2018-04-22
39
+ ### Added
40
+ - Pirkei Avos limudim calculation
41
+ - Support for explicit skip_unit (used by DafYomiYerushalmi)
42
+ - CHANGELOG (this file :) )
43
+ ### Changed
44
+ - Refactored skip_interval to generic limud detection
45
+ ### Fixed
46
+ - Cycle detection falsely identifies dates between cycle windows as belonging to a prior cycle
47
+ - Load sequence can't find Zmanim module when loaded externally
48
+
49
+ ## [0.1.0] - 2018-01-09 (Original release)
50
+ ### Added
51
+ - Port of KosherJava/zmanim library, primary functionality
52
+ - Limudim calculation framework
53
+ - Weekly Parsha, Tehillim (Month cycle), Mishna Yomis limudim calculation
@@ -1,6 +1,6 @@
1
1
  require 'tzinfo'
2
- Dir[File.dirname(__FILE__) + "/**/*.rb"].each {|file| require file }
3
2
 
4
- module Zmanim
5
- # Your code goes here...
6
- end
3
+ module Zmanim; end
4
+ module Zmanim::Limudim; end
5
+
6
+ Dir[File.dirname(__FILE__) + "/**/*.rb"].each {|file| require file }
@@ -1,4 +1,8 @@
1
1
  # encoding: UTF-8
2
+ require 'zmanim/util/text_helper'
3
+ require 'zmanim/util/hebrew_numeric_formatter'
4
+ require_relative 'jewish_calendar'
5
+
2
6
  module Zmanim::HebrewCalendar
3
7
  class HebrewDateFormatter
4
8
  extend Zmanim::Util::TextHelper
@@ -42,7 +46,7 @@ module Zmanim::HebrewCalendar
42
46
  transliterated: Zmanim::HebrewCalendar::JewishCalendar::SIGNIFICANT_DAYS.each_with_object({}){|d, h|
43
47
  h[d] = titleize(d)
44
48
  }.merge(tzom_gedalyah: 'Fast of Gedalyah', tenth_of_teves: 'Tenth of Teves', tu_beshvat: "Tu B'Shvat",
45
- taanis_esther: 'Fast of Esther', seventeen_of_tammuz: 'Seventeenth of Tammuz',
49
+ taanis_esther: 'Fast of Esther', lag_baomer: "Lag B'Omer", seventeen_of_tammuz: 'Seventeenth of Tammuz',
46
50
  tisha_beav: "Tisha B'Av", tu_beav: "Tu B'Av", yom_hashoah: 'Yom HaShoah', yom_haatzmaut: "Yom Ha'atzmaut"),
47
51
  hebrew: {
48
52
  erev_rosh_hashana: 'ערב ראש השנה',
@@ -68,6 +72,7 @@ module Zmanim::HebrewCalendar
68
72
  pesach: 'פסח',
69
73
  chol_hamoed_pesach: 'חול המועד פסח',
70
74
  pesach_sheni: 'פסח שני',
75
+ lag_baomer: 'ל״ג בעומר',
71
76
  erev_shavuos: 'ערב שבועות',
72
77
  shavuos: 'שבועות',
73
78
  seventeen_of_tammuz: 'שבעה עשר בתמוז',
@@ -175,18 +180,15 @@ module Zmanim::HebrewCalendar
175
180
  if hebrew_format
176
181
  format_hebrew_number(number) + ' ' + hebrew_omer_prefix + 'עומר'
177
182
  else
178
- number == 33 ? 'Lag BaOmer' : "Omer #{number}"
183
+ number == 33 ? "Lag B'Omer" : "Omer #{number}"
179
184
  end
180
185
  end
181
186
 
182
187
  def format_kviah(year)
183
188
  date = year.is_a?(Numeric) ? Zmanim::HebrewCalendar::JewishDate.new(year, 7, 1) : year
184
- kviah = date.cheshvan_kislev_kviah
185
- rosh_hashana_day = date.day_of_week
186
- kviah_glyph = {chaseirim: 'ח', kesidran: 'כ', shelaimim: 'ש'}[kviah]
187
- date.jewish_month = 1
188
- pesach_day = date.day_of_week
189
- "#{format_hebrew_number(rosh_hashana_day)}#{kviah_glyph}#{format_hebrew_number(pesach_day)}".delete(GERESH)
189
+ kviah_values = date.kviah
190
+ kviah_glyph = {chaseirim: 'ח', kesidran: 'כ', shelaimim: 'ש'}[kviah_values[:kviah]]
191
+ "#{format_hebrew_number(kviah_values[:rosh_hashana])}#{kviah_glyph}#{format_hebrew_number(kviah_values[:pesach])}".delete(GERESH)
190
192
  end
191
193
 
192
194
  def format_tefilah_additions(calendar, customs={walled_city: false, nusach: :ashkenaz})
@@ -8,7 +8,7 @@ module Zmanim::HebrewCalendar
8
8
  erev_succos succos chol_hamoed_succos hoshana_rabbah shemini_atzeres simchas_torah
9
9
  chanukah tenth_of_teves tu_beshvat
10
10
  taanis_esther purim shushan_purim purim_katan shushan_purim_katan
11
- erev_pesach pesach chol_hamoed_pesach pesach_sheni erev_shavuos shavuos
11
+ erev_pesach pesach chol_hamoed_pesach pesach_sheni lag_baomer erev_shavuos shavuos
12
12
  seventeen_of_tammuz tisha_beav tu_beav
13
13
  yom_hashoah yom_hazikaron yom_haatzmaut yom_yerushalayim)
14
14
 
@@ -30,6 +30,22 @@ module Zmanim::HebrewCalendar
30
30
  send("#{jewish_month_name}_significant_day")
31
31
  end
32
32
 
33
+ def assur_bemelacha?
34
+ day_of_week == 7 || yom_tov_assur_bemelacha?
35
+ end
36
+
37
+ def tomorrow_assur_bemelacha?
38
+ day_of_week == 6 || erev_yom_tov? || erev_yom_tov_sheni?
39
+ end
40
+
41
+ def candle_lighting?
42
+ tomorrow_assur_bemelacha?
43
+ end
44
+
45
+ def delayed_candle_lighting?
46
+ day_of_week != 6 && candle_lighting? && assur_bemelacha?
47
+ end
48
+
33
49
  def yom_tov?
34
50
  sd = significant_day
35
51
  sd && !sd.to_s.start_with?('erev_') && (!taanis? || sd == :yom_kippur)
@@ -39,17 +55,31 @@ module Zmanim::HebrewCalendar
39
55
  %i(pesach shavuos rosh_hashana yom_kippur succos shemini_atzeres simchas_torah).include?(significant_day)
40
56
  end
41
57
 
42
- def chol_hamoed?
43
- sd = significant_day
44
- sd && (sd.to_s.start_with?('chol_hamoed_') || sd == :hoshana_rabbah)
45
- end
46
-
47
58
  def erev_yom_tov?
48
59
  return false unless sd = significant_day
49
60
  sd.to_s.start_with?('erev_') || sd == :hoshana_rabbah ||
50
61
  (sd == :chol_hamoed_pesach && jewish_day == 20)
51
62
  end
52
63
 
64
+ def yom_tov_sheni?
65
+ (jewish_month == 7 && jewish_day == 2) ||
66
+ (!in_israel && ((jewish_month == 7 && [16, 23].include?(jewish_day)) ||
67
+ (jewish_month == 1 && [16, 22].include?(jewish_day)) ||
68
+ (jewish_month == 3 && jewish_day == 7)))
69
+ end
70
+
71
+ def erev_yom_tov_sheni?
72
+ (jewish_month == 7 && jewish_day == 1) ||
73
+ (!in_israel && ((jewish_month == 7 && [15, 22].include?(jewish_day)) ||
74
+ (jewish_month == 1 && [15, 21].include?(jewish_day)) ||
75
+ (jewish_month == 3 && jewish_day == 6)))
76
+ end
77
+
78
+ def chol_hamoed?
79
+ sd = significant_day
80
+ sd && (sd.to_s.start_with?('chol_hamoed_') || sd == :hoshana_rabbah)
81
+ end
82
+
53
83
  def taanis?
54
84
  %i(seventeen_of_tammuz tisha_beav tzom_gedalyah yom_kippur tenth_of_teves taanis_esther).include?(significant_day)
55
85
  end
@@ -123,6 +153,10 @@ module Zmanim::HebrewCalendar
123
153
  molad_as_datetime + 15
124
154
  end
125
155
 
156
+ def end_of_week
157
+ self + (7 - day_of_week)
158
+ end
159
+
126
160
  def daf_yomi_bavli
127
161
  Zmanim::Limudim::Calculators::DafYomiBavli.new.limud(self)
128
162
  end
@@ -131,8 +165,14 @@ module Zmanim::HebrewCalendar
131
165
  Zmanim::Limudim::Calculators::DafYomiYerushalmi.new.limud(self)
132
166
  end
133
167
 
134
- def parshas_hashavua
135
- Zmanim::Limudim::Calculators::Parsha.new(in_israel: in_israel).limud(self)
168
+ def daf_hashavua_bavli
169
+ Zmanim::Limudim::Calculators::DafHashavuaBavli.new.limud(self)
170
+ end
171
+
172
+ def parshas_hashavua(current_week_only: false)
173
+ limud = Zmanim::Limudim::Calculators::Parsha.new(in_israel: in_israel).limud(self)
174
+ limud.clear! if current_week_only && limud.interval.end_date > end_of_week
175
+ limud
136
176
  end
137
177
 
138
178
  def tehillim_portion
@@ -143,6 +183,10 @@ module Zmanim::HebrewCalendar
143
183
  Zmanim::Limudim::Calculators::MishnaYomis.new.limud(self)
144
184
  end
145
185
 
186
+ def pirkei_avos
187
+ Zmanim::Limudim::Calculators::PirkeiAvos.new(in_israel: in_israel).limud(self)
188
+ end
189
+
146
190
  def tefilah_additions(walled_city: false, nusach: :ashkenaz)
147
191
  additions = []
148
192
  if mashiv_haruach_starts?
@@ -187,6 +231,12 @@ module Zmanim::HebrewCalendar
187
231
  end
188
232
  end
189
233
 
234
+ def shabbos_mevorchim?
235
+ day_of_week == 7 &&
236
+ jewish_month != 6 &&
237
+ (23..29).include?(jewish_day)
238
+ end
239
+
190
240
  def mashiv_haruach_starts?
191
241
  jewish_month == 7 && jewish_day == 22
192
242
  end
@@ -213,12 +263,18 @@ module Zmanim::HebrewCalendar
213
263
  # for the 20th and 21st century.
214
264
  def vesein_tal_umatar?
215
265
  return false if day_of_week == 7 || yom_tov_assur_bemelacha?
216
- start_date = JewishDate.new(jewish_year, 8, 7)
217
- start_date.set_gregorian_date(start_date.gregorian_year, 12, gregorian_leap_year?(start_date.gregorian_year+1) ? 6 : 5) unless in_israel
266
+ start_date = gregorian_vesein_tal_umatar_start
218
267
  end_date = JewishDate.new(jewish_year, 1, 15)
219
268
  self.between?(start_date, end_date)
220
269
  end
221
270
 
271
+ def vesein_tal_umatar_starts_tonight?
272
+ return false if day_of_week == 6
273
+ start_date = gregorian_vesein_tal_umatar_start
274
+ (day_of_week == 7 && self == start_date) ||
275
+ self == (start_date - 1)
276
+ end
277
+
222
278
  def vesein_beracha?
223
279
  return false if day_of_week == 7 || yom_tov_assur_bemelacha?
224
280
  !vesein_tal_umatar?
@@ -257,6 +313,8 @@ module Zmanim::HebrewCalendar
257
313
  def iyar_significant_day
258
314
  if jewish_day == 14
259
315
  :pesach_sheni
316
+ elsif jewish_day == 18
317
+ :lag_baomer
260
318
  elsif use_modern_holidays
261
319
  # Note that this logic follows the current rules, which were last revised in 5764.
262
320
  # The calculations for years prior may not reflect the actual dates observed at that time.
@@ -386,5 +444,13 @@ module Zmanim::HebrewCalendar
386
444
  :shushan_purim
387
445
  end
388
446
  end
447
+
448
+ def gregorian_vesein_tal_umatar_start
449
+ start_date = JewishDate.new(jewish_year, 8, 7)
450
+ unless in_israel
451
+ start_date.set_gregorian_date(start_date.gregorian_year, 12, gregorian_leap_year?(start_date.gregorian_year + 1) ? 6 : 5)
452
+ end
453
+ start_date
454
+ end
389
455
  end
390
456
  end
@@ -157,6 +157,40 @@ module Zmanim::HebrewCalendar
157
157
  end
158
158
  end
159
159
 
160
+ def succ
161
+ self + 1
162
+ end
163
+
164
+ def step(limit, step=1, &block)
165
+ if step < 0
166
+ downto(limit, -step, &block)
167
+ else
168
+ upto(limit, step, &block)
169
+ end
170
+ end
171
+
172
+ def downto(limit, step=1)
173
+ raise ArgumentError, 'step argument must be greater than 0' if step <= 0
174
+ return to_enum(__method__, limit, step) unless block_given?
175
+ c = self
176
+ while c >= limit
177
+ yield c
178
+ c -= step
179
+ end
180
+ self
181
+ end
182
+
183
+ def upto(limit, step=1)
184
+ raise ArgumentError, 'step argument must be greater than 0' if step <= 0
185
+ return to_enum(__method__, limit, step) unless block_given?
186
+ c = self
187
+ while c <= limit
188
+ yield c
189
+ c += step
190
+ end
191
+ self
192
+ end
193
+
160
194
  def gregorian_year=(year)
161
195
  set_gregorian_date(year, gregorian_month, gregorian_day)
162
196
  end
@@ -275,6 +309,17 @@ module Zmanim::HebrewCalendar
275
309
  CHESHVAN_KISLEV_KEVIAH[(days_in_jewish_year(year) % 10) - 3]
276
310
  end
277
311
 
312
+ def kviah(year=jewish_year)
313
+ date = year.is_a?(Numeric) ? Zmanim::HebrewCalendar::JewishDate.new(year, 7, 1) : year
314
+ kviah = date.cheshvan_kislev_kviah
315
+ rosh_hashana_day = date.day_of_week
316
+ date.jewish_month = 1
317
+ pesach_day = date.day_of_week
318
+ {rosh_hashana: rosh_hashana_day,
319
+ kviah: kviah,
320
+ pesach: pesach_day}
321
+ end
322
+
278
323
  # Returns a new JewishDate as the molad for given month
279
324
  def molad(month=jewish_month, year=jewish_year)
280
325
  self.class.from_molad(chalakim_since_molad_tohu(year, month))
@@ -0,0 +1,23 @@
1
+ require 'zmanim/limudim/calculators/daf_yomi_bavli'
2
+
3
+ module Zmanim::Limudim::Calculators
4
+ class DafHashavuaBavli < DafYomiBavli
5
+ def initial_cycle_date
6
+ jewish_date(Date.parse('2005-03-02'))
7
+ end
8
+
9
+ def cycle_end_calculation
10
+ ->(start_date, iteration){ start_date + ((2711*7) - start_date.day_of_week) } # 2711 pages except first week * 7 days
11
+ end
12
+
13
+ def interval_end_calculation
14
+ ->(cycle, start_date){ start_date + (7 - start_date.day_of_week) }
15
+ end
16
+
17
+ def cycle_units_calculation
18
+ ->(cycle){ default_units }
19
+ end
20
+ end
21
+ end
22
+
23
+
@@ -33,12 +33,8 @@ module Zmanim::Limudim::Calculators
33
33
  end
34
34
  end
35
35
 
36
- def unit_for_interval(units, interval)
37
- if matches_skip_day?(interval.start_date)
38
- Zmanim::Limudim::Unit.new('no_daf_today')
39
- else
40
- super
41
- end
36
+ def skip_unit
37
+ Zmanim::Limudim::Unit.new('no_daf_today')
42
38
  end
43
39
 
44
40
  def skip_interval?(interval)
@@ -40,7 +40,7 @@ module Zmanim::Limudim::Calculators
40
40
  meilah: [4,9,8,6,5,6], tamid: [4,5,9,3,6,4,3], midos: [9,6,8,7,4], kinnim: [4,5,6],
41
41
  keilim: [9,8,8,4,11,4,6,11,8,8,9,8,8,8,6,8,17,9,10,7,3,10,5,17,9,9,12,10,8,4], ohalos: [8,7,7,3,7,7,6,6,16,7,9,8,6,7,10,5,5,10],
42
42
  negaim: [6,5,8,11,5,8,5,10,3,10,12,7,12,13], parah: [4,5,11,4,9,5,12,11,9,6,9,11], taharos: [9,8,8,13,9,10,9,9,9,8],
43
- mikvaos: [8,10,4,5,6,11,7,5,7,8], niddah: [7,7,7,7,9,14,5,4,11,8], machshirim: [6,11,8,10,11,8], zavim: [6,4,3,7,12],
43
+ mikvaos: [8,10,4,5,6,11,7,5,7,8], niddah: [7,7,7,7,9,14,5,4,11,8], machshirin: [6,11,8,10,11,8], zavim: [6,4,3,7,12],
44
44
  tevul_yom: [5,8,6,7], yadayim: [5,4,5,8], uktzin: [6,10,12]
45
45
  }.map{|k, v| [k, Hash[v.map.with_index{|m, p| [p+1, m]}]]}]
46
46
  end
@@ -47,40 +47,40 @@ module Zmanim::Limudim::Calculators
47
47
 
48
48
  def cycle_units_calculation
49
49
  ->(cycle) do
50
- kviah = Zmanim::HebrewCalendar::HebrewDateFormatter.new.format_kviah(cycle.start_date.jewish_year)
50
+ kviah_values = cycle.start_date.kviah.values
51
51
  modifications = in_israel ?
52
52
  {
53
- 'בחה' => [%i(matos masei), %i(nitzavim vayeilech)],
54
- 'בשז' => [],
55
- 'גכז' => [],
56
- 'החא' => [],
57
- 'השג' => [%i(nitzavim vayeilech)],
58
- 'זחג' => [%i(matos masei), %i(nitzavim vayeilech)],
59
- 'זשה' => [%i(matos masei), %i(nitzavim vayeilech)],
60
- 'בחג' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
61
- 'בשה' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
62
- 'גכה' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
63
- 'הכז' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(matos masei)],
64
- 'השא' => [%i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
65
- 'זחא' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
66
- 'זשג' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
67
- }[kviah] :
53
+ [2,:chaseirim,5] => [%i(matos masei), %i(nitzavim vayeilech)],
54
+ [2,:shelaimim,7] => [],
55
+ [3,:kesidran,7] => [],
56
+ [5,:chaseirim,1] => [],
57
+ [5,:shelaimim,3] => [%i(nitzavim vayeilech)],
58
+ [7,:chaseirim,3] => [%i(matos masei), %i(nitzavim vayeilech)],
59
+ [7,:shelaimim,5] => [%i(matos masei), %i(nitzavim vayeilech)],
60
+ [2,:chaseirim,3] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
61
+ [2,:shelaimim,5] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
62
+ [3,:kesidran,5] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
63
+ [5,:kesidran,7] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(matos masei)],
64
+ [5,:shelaimim,1] => [%i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
65
+ [7,:chaseirim,1] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
66
+ [7,:shelaimim,3] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
67
+ }[kviah_values] :
68
68
  {
69
- 'בחה' => [%i(chukas balak), %i(matos masei), %i(nitzavim vayeilech)],
70
- 'בשז' => [%i(matos masei)],
71
- 'גכז' => [%i(matos masei)],
72
- 'החא' => [],
73
- 'השג' => [%i(nitzavim vayeilech)],
74
- 'זחג' => [%i(matos masei), %i(nitzavim vayeilech)],
75
- 'זשה' => [%i(chukas balak), %i(matos masei), %i(nitzavim vayeilech)],
76
- 'בחג' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
77
- 'בשה' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(chukas balak), %i(matos masei), %i(nitzavim vayeilech)],
78
- 'גכה' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(chukas balak), %i(matos masei), %i(nitzavim vayeilech)],
79
- 'הכז' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
80
- 'השא' => [%i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
81
- 'זחא' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
82
- 'זשג' => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
83
- }[kviah]
69
+ [2,:chaseirim,5] => [%i(chukas balak), %i(matos masei), %i(nitzavim vayeilech)],
70
+ [2,:shelaimim,7] => [%i(matos masei)],
71
+ [3,:kesidran,7] => [%i(matos masei)],
72
+ [5,:chaseirim,1] => [],
73
+ [5,:shelaimim,3] => [%i(nitzavim vayeilech)],
74
+ [7,:chaseirim,3] => [%i(matos masei), %i(nitzavim vayeilech)],
75
+ [7,:shelaimim,5] => [%i(chukas balak), %i(matos masei), %i(nitzavim vayeilech)],
76
+ [2,:chaseirim,3] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
77
+ [2,:shelaimim,5] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(chukas balak), %i(matos masei), %i(nitzavim vayeilech)],
78
+ [3,:kesidran,5] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(chukas balak), %i(matos masei), %i(nitzavim vayeilech)],
79
+ [5,:kesidran,7] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
80
+ [5,:shelaimim,1] => [%i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
81
+ [7,:chaseirim,1] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei)],
82
+ [7,:shelaimim,3] => [%i(vayakheil pikudei), %i(tazria metzora), %i(acharei kedoshim), %i(behar bechukosai), %i(matos masei), %i(nitzavim vayeilech)],
83
+ }[kviah_values]
84
84
  modifications.inject(default_units) do |transitioned_units, parsha_pair|
85
85
  index = transitioned_units.index(parsha_pair.first)
86
86
  transitioned_units[0...index] + [parsha_pair] + transitioned_units[(index + 2)..-1]
@@ -0,0 +1,54 @@
1
+ require 'zmanim/limudim/limud_calculator'
2
+
3
+ module Zmanim::Limudim::Calculators
4
+ class PirkeiAvos
5
+ include Zmanim::Limudim::LimudCalculator
6
+
7
+ attr_reader :in_israel
8
+
9
+ def initialize(in_israel:false)
10
+ @in_israel = in_israel
11
+ end
12
+
13
+ def tiered_units?
14
+ false
15
+ end
16
+
17
+ def perpetual_cycle_anchor
18
+ Zmanim::Limudim::Anchor::DayOfYearAnchor.new(1, in_israel ? 22 : 23) # Day after Pesach
19
+ end
20
+
21
+ def default_units
22
+ @default_units ||= (1..6).to_a * 4 # 4 sub-cycles of 6 perakim, with the last sub-cycle being compressed as needed
23
+ end
24
+
25
+ def cycle_end_calculation
26
+ ->(start_date, _iteration) do
27
+ rosh_hashana = Zmanim::HebrewCalendar::JewishDate.new(start_date.jewish_year + 1, 7, 1)
28
+ rosh_hashana - rosh_hashana.day_of_week # last Shabbos before Rosh Hashanah
29
+ end
30
+ end
31
+
32
+ def interval_end_calculation
33
+ ->(cycle, start_date) do
34
+ start_date + (7 - start_date.day_of_week)
35
+ end
36
+ end
37
+
38
+ def skip_interval?(interval)
39
+ !in_israel && [interval.end_date.jewish_month, interval.end_date.jewish_day] == [3,7]
40
+ end
41
+
42
+ def cycle_units_calculation
43
+ ->(cycle) do
44
+ cycle_weeks = ((cycle.end_date - cycle.start_date + 1) / 7.0).ceil
45
+ # If the cycle starts on a Friday, outside of israel the 2nd day of Shavuos will fall on Shabbos
46
+ # and we lose one week in the pirkei avos cycle
47
+ cycle_weeks -=1 if !in_israel && cycle.start_date.day_of_week == 6
48
+ unit_count = default_units.length
49
+ compress_weeks = (unit_count - cycle_weeks) * 2
50
+ default_units.first(unit_count - compress_weeks) + default_units.last(compress_weeks).each_slice(2).to_a
51
+ end
52
+ end
53
+ end
54
+ end
@@ -32,9 +32,5 @@ module Zmanim::Limudim
32
32
  new_end_date = cycle_end_calculation.(new_start_date, new_iteration)
33
33
  Cycle.new(new_start_date, new_end_date, new_iteration)
34
34
  end
35
-
36
- def first_interval(interval_end_calculation)
37
- Interval.first_for_cycle(self, interval_end_calculation)
38
- end
39
35
  end
40
36
  end
@@ -7,6 +7,10 @@ module Zmanim::Limudim
7
7
  @unit = unit
8
8
  end
9
9
 
10
+ def clear!
11
+ @unit = nil
12
+ end
13
+
10
14
  def cycle
11
15
  interval.cycle
12
16
  end
@@ -5,14 +5,15 @@ module Zmanim::Limudim
5
5
  def limud(date)
6
6
  jewish_date = jewish_date(date)
7
7
  cycle = find_cycle(jewish_date)
8
- return nil unless cycle
8
+ return nil unless cycle && cycle.end_date >= date
9
9
  units = cycle_units_calculation.(cycle)
10
- interval = cycle.first_interval(interval_end_calculation)
10
+ interval = Interval.first_for_cycle(cycle, interval_end_calculation)
11
11
  while !jewish_date.between?(interval.start_date, interval.end_date) do
12
- interval = interval.next(interval_end_calculation)
13
- while !jewish_date.between?(interval.start_date, interval.end_date) && skip_interval?(interval)
14
- interval = interval.skip(interval_end_calculation)
15
- end
12
+ interval = if skip_interval?(interval)
13
+ interval.skip(interval_end_calculation)
14
+ else
15
+ interval.next(interval_end_calculation)
16
+ end
16
17
  end
17
18
  unit = unit_for_interval(units, interval)
18
19
  Zmanim::Limudim::Limud.new(interval, unit)
@@ -79,10 +80,15 @@ module Zmanim::Limudim
79
80
  end
80
81
 
81
82
  def unit_for_interval(units, interval)
83
+ return skip_unit if skip_interval?(interval)
82
84
  return tiered_units_for_interval(units, interval) if tiered_units?
83
85
  Unit.new(*units[interval.iteration-1])
84
86
  end
85
87
 
88
+ def skip_unit
89
+ nil
90
+ end
91
+
86
92
  def skip_interval?(interval)
87
93
  false
88
94
  end
@@ -1,4 +1,7 @@
1
1
  # encoding: UTF-8
2
+ require 'zmanim/util/text_helper'
3
+ require 'zmanim/util/hebrew_numeric_formatter'
4
+
2
5
  module Zmanim::Limudim
3
6
  class LimudimFormatter
4
7
  include Zmanim::Util::TextHelper
@@ -70,7 +73,7 @@ module Zmanim::Limudim
70
73
  sheviis: 'שביעית',
71
74
  terumos: 'תרומות',
72
75
  maasros: 'מעשרות',
73
- maaser_sheni: 'מעזר שני',
76
+ maaser_sheni: 'מעשר שני',
74
77
  chalah: 'חלה',
75
78
  orlah: 'ערלה',
76
79
  bikurim: 'בכורים',
@@ -121,7 +124,7 @@ module Zmanim::Limudim
121
124
  taharos: 'טהרות',
122
125
  mikvaos: 'מקואות',
123
126
  niddah: 'נדה',
124
- machshirim: 'מכשירין',
127
+ machshirin: 'מכשירין',
125
128
  zavim: 'זבים',
126
129
  tevul_yom: 'טבול יום',
127
130
  yadayim: 'ידים',
@@ -135,6 +138,7 @@ module Zmanim::Limudim
135
138
  end
136
139
 
137
140
  def format_parsha(limud)
141
+ return '' unless limud && limud.unit
138
142
  prefix = hebrew_format ? 'פרשת ' : 'Parshas '
139
143
  prefix + limud.unit.render do |parsha|
140
144
  hebrew_format ? PARSHIYOS[parsha] : titleize(parsha)
@@ -159,6 +163,12 @@ module Zmanim::Limudim
159
163
  prefix + limud.unit.render {|e| format_number(e) }
160
164
  end
161
165
 
166
+ def format_avos(limud)
167
+ return '' unless unit = (limud && limud.unit)
168
+ prefix = hebrew_format ? 'פרקי אבות ' : 'Pirkei Avos '
169
+ prefix + unit.render {|e| format_number(e) }
170
+ end
171
+
162
172
  private
163
173
 
164
174
  def format_number(number)
@@ -1,3 +1,3 @@
1
1
  module Zmanim
2
- VERSION = "0.1.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -1,6 +1,10 @@
1
+ require_relative 'astronomical_calendar'
2
+ require_relative 'hebrew_calendar/jewish_calendar'
3
+
1
4
  module Zmanim
2
5
  class ZmanimCalendar < AstronomicalCalendar
3
6
  attr_accessor :candle_lighting_offset
7
+ attr_writer :use_elevation
4
8
 
5
9
  ZENITH_16_POINT_1 = GEOMETRIC_ZENITH + 16.1
6
10
  ZENITH_8_POINT_5 = GEOMETRIC_ZENITH + 8.5
@@ -8,11 +12,31 @@ module Zmanim
8
12
  def initialize(opts={})
9
13
  super
10
14
  @candle_lighting_offset = opts[:candle_lighting_offset] || 18
15
+ @use_elevation = false
16
+ end
17
+
18
+ def use_elevation?
19
+ !!@use_elevation
20
+ end
21
+
22
+ def elevation_adjusted_sunrise
23
+ use_elevation? ? sunrise : sea_level_sunrise
24
+ end
25
+ alias_method :hanetz, :elevation_adjusted_sunrise
26
+
27
+ def elevation_adjusted_sunset
28
+ use_elevation? ? sunset : sea_level_sunset
11
29
  end
30
+ alias_method :shkia, :elevation_adjusted_sunset
12
31
 
13
32
  def tzais(opts={degrees: 8.5})
14
- degrees, offset = extract_degrees_offset(opts)
15
- offset_by_minutes(sunset_offset_by_degrees(GEOMETRIC_ZENITH + degrees), offset)
33
+ degrees, offset, zmanis_offset = extract_degrees_offset(opts)
34
+ sunset_for_degrees = degrees == 0 ? elevation_adjusted_sunset : sunset_offset_by_degrees(GEOMETRIC_ZENITH + degrees)
35
+ if zmanis_offset != 0
36
+ offset_by_minutes_zmanis(sunset_for_degrees, zmanis_offset)
37
+ else
38
+ offset_by_minutes(sunset_for_degrees, offset)
39
+ end
16
40
  end
17
41
 
18
42
  def tzais_72
@@ -20,12 +44,17 @@ module Zmanim
20
44
  end
21
45
 
22
46
  def alos(opts={degrees: 16.1})
23
- degrees, offset = extract_degrees_offset(opts)
24
- offset_by_minutes(sunrise_offset_by_degrees(GEOMETRIC_ZENITH + degrees), offset)
47
+ degrees, offset, zmanis_offset = extract_degrees_offset(opts)
48
+ sunrise_for_degrees = degrees == 0 ? elevation_adjusted_sunrise : sunrise_offset_by_degrees(GEOMETRIC_ZENITH + degrees)
49
+ if zmanis_offset != 0
50
+ offset_by_minutes_zmanis(sunrise_for_degrees, -zmanis_offset)
51
+ else
52
+ offset_by_minutes(sunrise_for_degrees, -offset)
53
+ end
25
54
  end
26
55
 
27
56
  def alos_72
28
- alos(offset: -72)
57
+ alos(offset: 72)
29
58
  end
30
59
 
31
60
  alias_method :chatzos, :sun_transit
@@ -35,7 +64,7 @@ module Zmanim
35
64
  end
36
65
 
37
66
  def sof_zman_shma_gra
38
- sof_zman_shma(sea_level_sunrise, sea_level_sunset)
67
+ sof_zman_shma(elevation_adjusted_sunrise, elevation_adjusted_sunset)
39
68
  end
40
69
 
41
70
  def sof_zman_shma_mga
@@ -51,22 +80,22 @@ module Zmanim
51
80
  end
52
81
 
53
82
  def sof_zman_tfila_gra
54
- sof_zman_tfila(sea_level_sunrise, sea_level_sunset)
83
+ sof_zman_tfila(elevation_adjusted_sunrise, elevation_adjusted_sunset)
55
84
  end
56
85
 
57
86
  def sof_zman_tfila_mga
58
87
  sof_zman_tfila(alos_72, tzais_72)
59
88
  end
60
89
 
61
- def mincha_gedola(day_start=sea_level_sunrise, day_end=sea_level_sunset)
90
+ def mincha_gedola(day_start=elevation_adjusted_sunrise, day_end=elevation_adjusted_sunset)
62
91
  shaos_into_day(day_start, day_end, 6.5)
63
92
  end
64
93
 
65
- def mincha_ketana(day_start=sea_level_sunrise, day_end=sea_level_sunset)
94
+ def mincha_ketana(day_start=elevation_adjusted_sunrise, day_end=elevation_adjusted_sunset)
66
95
  shaos_into_day(day_start, day_end, 9.5)
67
96
  end
68
97
 
69
- def plag_hamincha(day_start=sea_level_sunrise, day_end=sea_level_sunset)
98
+ def plag_hamincha(day_start=elevation_adjusted_sunrise, day_end=elevation_adjusted_sunset)
70
99
  shaos_into_day(day_start, day_end, 10.75)
71
100
  end
72
101
 
@@ -75,7 +104,7 @@ module Zmanim
75
104
  end
76
105
 
77
106
  def shaah_zmanis_gra
78
- shaah_zmanis(sea_level_sunrise, sea_level_sunset)
107
+ shaah_zmanis(elevation_adjusted_sunrise, elevation_adjusted_sunset)
79
108
  end
80
109
 
81
110
  def shaah_zmanis_mga
@@ -84,7 +113,15 @@ module Zmanim
84
113
 
85
114
  def shaah_zmanis_by_degrees_and_offset(degrees, offset)
86
115
  opts = {degrees: degrees, offset: offset}
87
- shaah_zmanis(alos(opts.merge(offset: -offset)), tzais(opts))
116
+ shaah_zmanis(alos(opts), tzais(opts))
117
+ end
118
+
119
+ def assur_bemelacha?(current_time, tzais: tzais(), in_israel: false)
120
+ tzais_time = tzais.is_a?(Hash) ? self.tzais(tzais) : tzais
121
+ jewish_calendar = HebrewCalendar::JewishCalendar.new(current_time.to_date)
122
+ jewish_calendar.in_israel = in_israel
123
+ (current_time.to_datetime <= tzais_time && jewish_calendar.assur_bemelacha?) ||
124
+ (current_time.to_datetime >= elevation_adjusted_sunset && jewish_calendar.tomorrow_assur_bemelacha?)
88
125
  end
89
126
 
90
127
  private
@@ -95,12 +132,18 @@ module Zmanim
95
132
  end
96
133
 
97
134
  def extract_degrees_offset(opts)
98
- [opts[:degrees] || 0.0, opts[:offset] || 0]
135
+ [opts[:degrees] || 0.0, opts[:offset] || 0, opts[:zmanis_offset] || 0]
99
136
  end
100
137
 
101
138
  def offset_by_minutes(time, minutes)
102
139
  return unless time
103
140
  time + (minutes / (60 * 24).to_f)
104
141
  end
142
+
143
+ def offset_by_minutes_zmanis(time, minutes)
144
+ return unless time
145
+ shaah_zmanis_skew = shaah_zmanis_gra / HOUR_MILLIS
146
+ time + (minutes * shaah_zmanis_skew / (60 * 24).to_f)
147
+ end
105
148
  end
106
149
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zmanim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pinny Markowitz
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-09 00:00:00.000000000 Z
11
+ date: 2020-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tzinfo
@@ -90,6 +90,7 @@ extra_rdoc_files: []
90
90
  files:
91
91
  - ".gitignore"
92
92
  - ".rspec"
93
+ - CHANGELOG.md
93
94
  - Gemfile
94
95
  - LICENSE
95
96
  - README.md
@@ -104,10 +105,12 @@ files:
104
105
  - lib/zmanim/limudim/anchor/day_of_month_anchor.rb
105
106
  - lib/zmanim/limudim/anchor/day_of_week_anchor.rb
106
107
  - lib/zmanim/limudim/anchor/day_of_year_anchor.rb
108
+ - lib/zmanim/limudim/calculators/daf_hashavua_bavli.rb
107
109
  - lib/zmanim/limudim/calculators/daf_yomi_bavli.rb
108
110
  - lib/zmanim/limudim/calculators/daf_yomi_yerushalmi.rb
109
111
  - lib/zmanim/limudim/calculators/mishna_yomis.rb
110
112
  - lib/zmanim/limudim/calculators/parsha.rb
113
+ - lib/zmanim/limudim/calculators/pirkei_avos.rb
111
114
  - lib/zmanim/limudim/calculators/tehillim_monthly.rb
112
115
  - lib/zmanim/limudim/cycle.rb
113
116
  - lib/zmanim/limudim/interval.rb
@@ -130,7 +133,7 @@ homepage: https://github.com/pinnymz/ruby-zmanim
130
133
  licenses: []
131
134
  metadata:
132
135
  allowed_push_host: https://rubygems.org
133
- post_install_message:
136
+ post_install_message:
134
137
  rdoc_options: []
135
138
  require_paths:
136
139
  - lib
@@ -145,9 +148,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
148
  - !ruby/object:Gem::Version
146
149
  version: '0'
147
150
  requirements: []
148
- rubyforge_project:
149
- rubygems_version: 2.6.12
150
- signing_key:
151
+ rubygems_version: 3.1.4
152
+ signing_key:
151
153
  specification_version: 4
152
154
  summary: A Zmanim library for Ruby
153
155
  test_files: []