prayer_times 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -4
- data/lib/prayer_times/calculation.rb +101 -79
- data/lib/prayer_times/calculation_method.rb +23 -22
- data/lib/prayer_times/calculation_methods.rb +19 -19
- data/lib/prayer_times/calculator.rb +9 -9
- data/lib/prayer_times/constants.rb +20 -20
- data/lib/prayer_times/math_helpers.rb +1 -1
- data/lib/prayer_times/setters.rb +13 -12
- data/lib/prayer_times/version.rb +2 -2
- data/lib/prayer_times.rb +3 -3
- data/prayer_times.gemspec +1 -0
- data/test/lib/prayer_times/calculation_method_test.rb +16 -16
- data/test/lib/prayer_times/calculation_methods_test.rb +3 -3
- data/test/lib/prayer_times/calculation_test.rb +128 -93
- data/test/lib/prayer_times/calculator_test.rb +11 -11
- data/test/lib/prayer_times/math_helpers_test.rb +7 -7
- data/test/lib/prayer_times/prayer_times_test.rb +2 -2
- data/test/lib/prayer_times/setters_test.rb +7 -7
- data/test/lib/prayer_times/version_test.rb +1 -1
- data/test/test_helper.rb +3 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e89b6c2230b659b3b2fd707ba5a3c194d65033b
|
4
|
+
data.tar.gz: faa3a09be325715ae026b46db68843e541621e28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e9e13fe01d692a5cd75b7ee19f3a88073828a2a434c3968bb3db95412dac5b043e8f972cee7090440ce93f5dd2c4e981f8050b766376ff654bb615d2e978c6d
|
7
|
+
data.tar.gz: c8a69236937c91491578b4f27d54e7807c106c6ac1603dfa7512a959407e09d5100a0ec9f029a4082ebe1e162494757f22580624f3173273f133bb59db7c22ce
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
PrayerTimes [![Build Status](https://travis-ci.org/Startappz/prayer_times.png?branch=master)](https://travis-ci.org/Startappz/prayer_times) [![Dependency Status](https://gemnasium.com/Startappz/prayer_times.png)](https://gemnasium.com/Startappz/prayer_times) [![Coverage Status](https://coveralls.io/repos/Startappz/prayer_times/badge.png)](https://coveralls.io/r/Startappz/prayer_times)
|
2
|
+
===
|
2
3
|
|
3
4
|
Flexible and configurable calculation for Muslim prayers times.
|
4
5
|
|
@@ -22,9 +23,9 @@ Or install it yourself as:
|
|
22
23
|
|
23
24
|
```ruby
|
24
25
|
require 'prayer_times'
|
25
|
-
pt = PrayerTimes.new("Makkah")
|
26
|
-
times = pt.get_times(Date.today
|
27
|
-
|
26
|
+
pt = PrayerTimes.new("Makkah") # there are several calculation methods, check adding more methods
|
27
|
+
times = pt.get_times(Date.today, [31,36], 3)
|
28
|
+
p times
|
28
29
|
```
|
29
30
|
|
30
31
|
### Global configuration
|
@@ -5,8 +5,13 @@ module PrayerTimes
|
|
5
5
|
extend Forwardable
|
6
6
|
include MathHelpers
|
7
7
|
|
8
|
+
SunPosition = Struct.new(:declination, :equation)
|
9
|
+
|
10
|
+
MINUTE = 60
|
11
|
+
DEGREES_PER_HOUR = 15.0
|
12
|
+
|
8
13
|
def_delegators :@calculator, :time_suffixes, :time_format, :invalid_time, :iterations_count, :times_offsets
|
9
|
-
|
14
|
+
|
10
15
|
# Gets the prayers times
|
11
16
|
# @param [PrayTime] calculator parent class
|
12
17
|
# @param [Date] date the desired date
|
@@ -19,45 +24,45 @@ module PrayerTimes
|
|
19
24
|
self.lng = coords[1]
|
20
25
|
self.elv = coords.size > 2 ? coords[2] : 0
|
21
26
|
self.time_zone = time_zone
|
22
|
-
|
23
|
-
self.
|
24
|
-
|
27
|
+
self.jdate = julian_date(date) - lng / (360.0)
|
28
|
+
self.times = {
|
29
|
+
imsak: 5, fajr: 5, sunrise: 6, dhuhr: 12, asr: 13,
|
30
|
+
sunset: 18, maghrib: 18, isha: 18
|
31
|
+
}
|
32
|
+
end
|
25
33
|
|
26
34
|
# Compute prayer times
|
27
35
|
# @return [Hash] times
|
28
36
|
def compute
|
29
|
-
times = {
|
30
|
-
imsak: 5, fajr: 5, sunrise: 6, dhuhr: 12,
|
31
|
-
asr: 13, sunset: 18, maghrib: 18, isha: 18
|
32
|
-
}
|
33
37
|
# main iterations
|
34
|
-
iterations_count.times{
|
35
|
-
times = adjust_times(times)
|
38
|
+
iterations_count.times{compute_prayer_times}
|
36
39
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
40
|
+
adjust_times
|
41
|
+
|
42
|
+
tune_times
|
43
|
+
|
44
|
+
modify_formats
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
-
set_names(times)
|
47
|
-
end
|
46
|
+
set_names
|
47
|
+
end
|
48
48
|
|
49
|
-
private
|
49
|
+
private
|
50
50
|
|
51
|
-
attr_accessor :calculator, :time_zone, :lat, :lng, :elv, :jdate
|
51
|
+
attr_accessor :calculator, :time_zone, :lat, :lng, :elv, :jdate, :times
|
52
52
|
|
53
|
+
# get julian date of date object or array
|
54
|
+
def julian_date(date)
|
55
|
+
date_obj = date.is_a?(Date) ? date : Date.new(date[0], date[1], date[2])
|
56
|
+
date_obj.ajd.to_f
|
57
|
+
end
|
53
58
|
|
54
59
|
# convert float time to the given format (see time_formats)
|
55
60
|
def get_formatted_time(time)
|
56
61
|
return invalid_time if time.nan?
|
57
62
|
return time if time_format == 'Float'
|
58
|
-
time = fix_hour(time + 0.5 /
|
63
|
+
time = fix_hour(time + 0.5 / self.class::MINUTE) # add 0.5 minutes to round
|
59
64
|
hours = time.floor
|
60
|
-
minutes = ((time - hours) *
|
65
|
+
minutes = ((time - hours) * self.class::MINUTE).floor
|
61
66
|
suffix = time_format == '12h' ? time_suffixes[hours < 12 ? :am : :pm ] : ''
|
62
67
|
formatted_time = (time_format == "24h") ? ("%02d:%02d" % [hours, minutes]) : "%d:%02d" % [((hours + 11) % 12)+1, minutes]
|
63
68
|
formatted_time + suffix
|
@@ -65,15 +70,15 @@ module PrayerTimes
|
|
65
70
|
|
66
71
|
# compute mid-day time
|
67
72
|
def mid_day(time)
|
68
|
-
eqt = sun_position(jdate + time)
|
69
|
-
|
73
|
+
eqt = sun_position(jdate + time).equation
|
74
|
+
fix_hour(12 - eqt)
|
70
75
|
end
|
71
|
-
|
72
|
-
# compute the time at which sun reaches a specific angle below horizon
|
76
|
+
|
77
|
+
# compute the time at which sun reaches a specific angle below horizon
|
73
78
|
def sun_angle_time(angle, time, direction = nil)
|
74
|
-
decl = sun_position(jdate + time)
|
79
|
+
decl = sun_position(jdate + time).declination
|
75
80
|
noon = mid_day(time)
|
76
|
-
t = 1
|
81
|
+
t = 1.0 / self.class::DEGREES_PER_HOUR * darccos((-rsin(angle)- rsin(decl)* rsin(lat))/
|
77
82
|
(rcos(decl) * rcos(lat)))
|
78
83
|
return noon + (direction == 'ccw' ? -t : t)
|
79
84
|
rescue
|
@@ -81,16 +86,16 @@ module PrayerTimes
|
|
81
86
|
end
|
82
87
|
|
83
88
|
# compute asr time
|
84
|
-
def asr_time(factor, time)
|
85
|
-
decl = sun_position(jdate + time)
|
89
|
+
def asr_time(factor, time)
|
90
|
+
decl = sun_position(jdate + time).declination
|
86
91
|
angle = -darccot(factor + rtan(lat - decl).abs)
|
87
|
-
|
92
|
+
sun_angle_time(angle, time)
|
88
93
|
end
|
89
94
|
|
90
95
|
# compute declination angle of sun and equation of time
|
91
96
|
# Ref: http://aa.usno.navy.mil/faq/docs/SunApprox.php
|
92
|
-
def sun_position(
|
93
|
-
d =
|
97
|
+
def sun_position(julian_date)
|
98
|
+
d = julian_date - 2451545.0
|
94
99
|
g = fix_angle(357.529 + 0.98560028 * d)
|
95
100
|
q = fix_angle(280.459 + 0.98564736 * d)
|
96
101
|
l = fix_angle(q + 1.915* rsin(g) + 0.020* rsin(2*g))
|
@@ -98,51 +103,71 @@ module PrayerTimes
|
|
98
103
|
#r = 1.00014 - 0.01671 * cos(g) - 0.00014 * cos(2*g)
|
99
104
|
e = 23.439 - 0.00000036 * d
|
100
105
|
|
101
|
-
ra = darctan2(rcos(e)* rsin(l), rcos(l))/
|
102
|
-
|
103
|
-
|
106
|
+
ra = darctan2(rcos(e)* rsin(l), rcos(l))/ self.class::DEGREES_PER_HOUR
|
107
|
+
equation = q / self.class::DEGREES_PER_HOUR - fix_hour(ra) # equation of time
|
108
|
+
declination = darcsin(rsin(e)* rsin(l)) # declination of the Sun
|
104
109
|
|
105
|
-
|
110
|
+
SunPosition.new(declination,equation)
|
106
111
|
end
|
107
112
|
|
108
113
|
|
109
114
|
# compute prayer times at given julian date
|
110
|
-
def compute_prayer_times
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
115
|
+
def compute_prayer_times
|
116
|
+
day_portion
|
117
|
+
|
118
|
+
initial_computation
|
119
|
+
end
|
120
|
+
|
121
|
+
# make the primary calculations
|
122
|
+
def initial_computation
|
123
|
+
times.merge!(
|
124
|
+
imsak: sun_angle_time(method_settings[:imsak].to_f, times[:imsak], 'ccw'),
|
125
|
+
fajr: sun_angle_time(method_settings[:fajr].to_f, times[:fajr], 'ccw'),
|
126
|
+
sunrise: sun_angle_time(rise_set_angle(elv), times[:sunrise], 'ccw'),
|
127
|
+
dhuhr: mid_day(times[:dhuhr]),
|
128
|
+
asr: asr_time(asr_factor(method_settings[:asr]), times[:asr]),
|
129
|
+
sunset: sun_angle_time(rise_set_angle(elv), times[:sunset]),
|
130
|
+
maghrib: sun_angle_time(method_settings[:maghrib].to_f, times[:maghrib]),
|
131
|
+
isha: sun_angle_time(method_settings[:isha].to_f, times[:isha])
|
132
|
+
)
|
122
133
|
end
|
123
134
|
|
124
135
|
# adjust times in a prayer time array
|
125
|
-
def adjust_times
|
126
|
-
|
127
|
-
|
136
|
+
def adjust_times
|
137
|
+
|
138
|
+
adjust_time_zones
|
139
|
+
|
128
140
|
if !method_settings[:high_lats].nil?
|
129
|
-
|
141
|
+
adjust_high_lats
|
130
142
|
end
|
131
143
|
|
132
144
|
if minute?(method_settings[:imsak])
|
133
|
-
times[:imsak] = times[:fajr] - method_settings[:imsak].to_f /
|
145
|
+
times[:imsak] = times[:fajr] - method_settings[:imsak].to_f / self.class::MINUTE
|
134
146
|
end
|
147
|
+
|
135
148
|
# need to ask about 'min' settings
|
136
149
|
if minute?(method_settings[:maghrib])
|
137
|
-
times[:maghrib] = times[:sunset] + method_settings[:maghrib].to_f /
|
150
|
+
times[:maghrib] = times[:sunset] + method_settings[:maghrib].to_f / self.class::MINUTE
|
138
151
|
end
|
152
|
+
|
139
153
|
if minute?(method_settings[:isha])
|
140
|
-
times[:isha] = times[:maghrib] + method_settings[:isha].to_f /
|
154
|
+
times[:isha] = times[:maghrib] + method_settings[:isha].to_f / self.class::MINUTE
|
141
155
|
end
|
142
156
|
|
143
|
-
times[:dhuhr] += method_settings[:dhuhr].to_f /
|
157
|
+
times[:dhuhr] += method_settings[:dhuhr].to_f / self.class::MINUTE
|
144
158
|
|
145
|
-
|
159
|
+
# add midnight time
|
160
|
+
if method_settings[:midnight] == 'Jafari'
|
161
|
+
times[:midnight] = times[:sunset] + time_diff(times[:sunset], times[:fajr]) / 2
|
162
|
+
else
|
163
|
+
times[:midnight] = times[:sunset] + time_diff(times[:sunset], times[:sunrise]) / 2
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# adjust time zones
|
168
|
+
def adjust_time_zones
|
169
|
+
tz_adjust = time_zone - lng / self.class::DEGREES_PER_HOUR
|
170
|
+
times.keys.each{|k| times[k] += tz_adjust}
|
146
171
|
end
|
147
172
|
|
148
173
|
# get asr shadow factor
|
@@ -157,29 +182,28 @@ module PrayerTimes
|
|
157
182
|
end
|
158
183
|
|
159
184
|
# apply offsets to the times
|
160
|
-
def tune_times
|
161
|
-
times.each{|k,_| times[k] += (method_offsets[k] + times_offsets[k]) /
|
185
|
+
def tune_times
|
186
|
+
times.each{|k,_| times[k] += (method_offsets[k] + times_offsets[k]).to_f / self.class::MINUTE}
|
162
187
|
end
|
163
188
|
|
164
189
|
# convert times to given time format
|
165
|
-
def modify_formats
|
190
|
+
def modify_formats
|
166
191
|
times.each{|k,_| times[k] = get_formatted_time(times[k])}
|
167
192
|
end
|
168
|
-
|
169
|
-
def set_names
|
193
|
+
|
194
|
+
def set_names
|
170
195
|
res = {}
|
171
196
|
calculator.times_names.each{|k,v| res[v] = times[k]}
|
172
197
|
res
|
173
198
|
end
|
174
199
|
|
175
200
|
# adjust times for locations in higher latitudes
|
176
|
-
def adjust_high_lats
|
201
|
+
def adjust_high_lats
|
177
202
|
night_time = time_diff(times[:sunset], times[:sunrise]) # sunset to sunrise
|
178
203
|
times[:imsak] = adjust_hl_time(times[:imsak], times[:sunrise], method_settings[:imsak].to_f, night_time, 'ccw')
|
179
204
|
times[:fajr] = adjust_hl_time(times[:fajr], times[:sunrise], method_settings[:fajr].to_f, night_time, 'ccw')
|
180
205
|
times[:isha] = adjust_hl_time(times[:isha], times[:sunset], method_settings[:isha].to_f, night_time)
|
181
206
|
times[:maghrib] = adjust_hl_time(times[:maghrib], times[:sunset], method_settings[:maghrib].to_f, night_time)
|
182
|
-
times
|
183
207
|
end
|
184
208
|
|
185
209
|
# adjust a time for higher latitudes
|
@@ -195,27 +219,25 @@ module PrayerTimes
|
|
195
219
|
# the night portion used for adjusting times in higher latitudes
|
196
220
|
def night_portion(angle, night)
|
197
221
|
hl_method = method_settings[:high_lats]
|
198
|
-
portion = 1/2
|
199
|
-
portion = 1
|
200
|
-
portion = 1
|
201
|
-
|
202
|
-
|
222
|
+
portion = 1.0 / 2 # midnight
|
223
|
+
portion = 1.0 / self.class::MINUTE * angle if hl_method == 'AngleBased'
|
224
|
+
portion = 1.0 / 7 if hl_method == 'OneSeventh'
|
225
|
+
portion * night
|
226
|
+
end
|
203
227
|
|
204
228
|
# convert hours to day portions
|
205
|
-
def day_portion
|
229
|
+
def day_portion
|
206
230
|
times.each{|k,v| times[k] = times[k] / 24.0}
|
207
231
|
end
|
208
|
-
|
232
|
+
|
209
233
|
# compute the difference between two times
|
210
234
|
def time_diff(time1, time2); fix_hour(time2 - time1); end
|
211
235
|
|
212
|
-
|
213
236
|
# detect if input contains 'min'
|
214
237
|
def minute?(arg); arg.to_s.include? "min"; end
|
215
238
|
|
216
239
|
def fix_hour(hour); fix(hour, 24.0) ; end
|
217
240
|
|
218
|
-
|
219
241
|
def fix_angle(angle); fix(angle, 360.0) ; end
|
220
242
|
|
221
243
|
def fix(a, mode)
|
@@ -223,15 +245,15 @@ module PrayerTimes
|
|
223
245
|
a = a - mode * (a / mode).floor
|
224
246
|
a < 0 ? a + mode : a
|
225
247
|
end
|
226
|
-
|
248
|
+
|
227
249
|
def method_settings
|
228
250
|
@m_settings ||= calculator.calculation_method.settings
|
229
251
|
end
|
230
|
-
|
252
|
+
|
231
253
|
def method_offsets
|
232
254
|
@m_offsets ||= calculator.calculation_method.offsets
|
233
255
|
end
|
234
256
|
|
235
257
|
end
|
236
258
|
|
237
|
-
end
|
259
|
+
end
|
@@ -4,7 +4,7 @@ module PrayerTimes
|
|
4
4
|
class CalculationMethod
|
5
5
|
attr_reader :name, :description, :settings, :offsets
|
6
6
|
attr_writer :description
|
7
|
-
|
7
|
+
|
8
8
|
# Default settings
|
9
9
|
def self.default_settings
|
10
10
|
{
|
@@ -16,28 +16,28 @@ module PrayerTimes
|
|
16
16
|
high_lats: 'NightMiddle'
|
17
17
|
}
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
# Initializer
|
21
21
|
# @param [String] name
|
22
|
-
# @param [String] description
|
23
|
-
# @param [Hash] settings
|
22
|
+
# @param [String] description
|
23
|
+
# @param [Hash] settings
|
24
24
|
# @option settings [String] :imsak
|
25
25
|
# @option settings [String] :fajr
|
26
26
|
# @option settings [String] :sunrise
|
27
27
|
# @option settings [String] :dhuhr
|
28
28
|
# @option settings [String] :asr Asr Juristic Methods:
|
29
|
-
# 'Standard': Shafi`i, Maliki, Ja`fari and Hanbali,
|
29
|
+
# 'Standard': Shafi`i, Maliki, Ja`fari and Hanbali,
|
30
30
|
# 'Hanafi': Hanafi
|
31
31
|
# @option settings [String] :sunset
|
32
32
|
# @option settings [String] :maghrib
|
33
33
|
# @option settings [String] :isha
|
34
34
|
# @option settings [String] :midnight Midnight Mode:
|
35
|
-
# 'Standard': Mid Sunset to Sunrise,
|
36
|
-
# 'Jafari': Mid Sunset to Fajr
|
35
|
+
# 'Standard': Mid Sunset to Sunrise,
|
36
|
+
# 'Jafari': Mid Sunset to Fajr
|
37
37
|
# @option settings [String] :high_lights Adjust Methods for Higher Latitudes:
|
38
|
-
# 'NightMiddle': middle of night,
|
39
|
-
# 'AngleBased': angle/60th of night,
|
40
|
-
# 'OneSeventh': 1/7th of night,
|
38
|
+
# 'NightMiddle': middle of night,
|
39
|
+
# 'AngleBased': angle/60th of night,
|
40
|
+
# 'OneSeventh': 1/7th of night,
|
41
41
|
# 'None'
|
42
42
|
# @param [Hash] offsets
|
43
43
|
# @option offsets [String] :imsak
|
@@ -55,32 +55,33 @@ module PrayerTimes
|
|
55
55
|
self.settings = settings
|
56
56
|
self.offsets = offsets
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
# Sets times settings
|
60
60
|
# @param [Hash] settings
|
61
|
-
# Check the initializer
|
61
|
+
# Check the initializer
|
62
62
|
def settings=(settings)
|
63
63
|
s = settings.reject{|k,v| !(Constants.times_names.key?(k))} rescue {}
|
64
|
-
@settings = self.class.default_settings.merge(s)
|
64
|
+
@settings = self.class.default_settings.merge(s)
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
# Sets times offsets
|
68
68
|
# @param [Hash] offsets
|
69
|
-
# Check the initializer
|
69
|
+
# Check the initializer
|
70
70
|
def offsets=(offsets)
|
71
71
|
s = offsets.reject{|k,v| !(Constants.times_offsets.key?(k) and v.is_a?(Numeric))} rescue {}
|
72
|
-
|
72
|
+
s[:sunset] = s[:maghrib] if s[:maghrib]
|
73
|
+
@offsets = Constants.times_offsets.merge(s)
|
73
74
|
end
|
74
|
-
|
75
|
-
|
75
|
+
|
76
|
+
|
76
77
|
# @return readable representation of this object
|
77
78
|
def to_s
|
78
79
|
name
|
79
80
|
end
|
80
|
-
|
81
|
+
|
81
82
|
private
|
82
|
-
|
83
|
+
|
83
84
|
attr_writer :name
|
84
|
-
|
85
|
+
|
85
86
|
end
|
86
|
-
end
|
87
|
+
end
|
@@ -4,7 +4,7 @@ module PrayerTimes
|
|
4
4
|
class CalculationMethods
|
5
5
|
extend Forwardable
|
6
6
|
def_delegators :@hash, :[], :length, :each, :key?, :keys, :delete, :to_s
|
7
|
-
|
7
|
+
|
8
8
|
# default methods defined in this gem
|
9
9
|
# Methods MWL, ISNA, Egypt, Makkah, Karachi, Tehran and Jafari are accurate
|
10
10
|
# Other methods need validation. Your help is appreciated.
|
@@ -14,7 +14,7 @@ module PrayerTimes
|
|
14
14
|
desc: 'Muslim World League',
|
15
15
|
settings: {fajr: 18, isha: 17}
|
16
16
|
},
|
17
|
-
'ISNA' => {
|
17
|
+
'ISNA' => {
|
18
18
|
desc: 'Islamic Society of North America (ISNA)',
|
19
19
|
settings: {fajr: 15, isha: 15}
|
20
20
|
},
|
@@ -23,24 +23,24 @@ module PrayerTimes
|
|
23
23
|
settings: {fajr: 19.5, isha: 17.5}
|
24
24
|
},
|
25
25
|
'Makkah' => {
|
26
|
-
|
27
|
-
|
26
|
+
desc: 'Umm Al-Qura University, Makkah',
|
27
|
+
settings: {fajr: 18.5, isha: '90 min'} # fajr was 19 degrees before 1430 hijri
|
28
28
|
},
|
29
29
|
'Karachi' => {
|
30
30
|
desc: 'University of Islamic Sciences, Karachi',
|
31
|
-
settings: {fajr: 18, isha: 18}
|
31
|
+
settings: {fajr: 18, asr: 'Hanafi', isha: 18}
|
32
32
|
},
|
33
33
|
'Tehran' => {
|
34
34
|
desc: 'Institute of Geophysics, University of Tehran',
|
35
35
|
settings: {fajr: 17.7, maghrib: 4.5, isha: 14, midnight: 'Jafari'} # isha is not explicitly specified in this method
|
36
36
|
},
|
37
|
-
|
37
|
+
'Jafari' => {
|
38
38
|
desc: 'Shia Ithna-Ashari, Leva Institute, Qum',
|
39
39
|
settings: {fajr: 16, maghrib: 4, isha: 14, midnight: 'Jafari'}
|
40
40
|
},
|
41
|
-
|
41
|
+
'UOIF' =>{
|
42
42
|
desc: "UNION DES ORGANISATIONS ISLAMIQUES DE FRANCE",
|
43
|
-
settings: {fajr: 19, maghrib: '0 min', isha: 17}
|
43
|
+
settings: {fajr: 19, maghrib: '0 min', isha: 17}
|
44
44
|
},
|
45
45
|
'Algeria' =>{
|
46
46
|
desc: "Algeria",
|
@@ -63,11 +63,11 @@ module PrayerTimes
|
|
63
63
|
},
|
64
64
|
'Jordan' =>{
|
65
65
|
desc: "General Iftaa' Department, The Hashemite Kingdom of Jordan",
|
66
|
-
settings: {fajr: 18, maghrib: '0 min', isha: 18}
|
66
|
+
settings: {fajr: 18, maghrib: '0 min', isha: 18}
|
67
67
|
},
|
68
68
|
'Kuwait' =>{
|
69
69
|
desc: "Kuwait",
|
70
|
-
settings: {fajr: 18, maghrib: '0 min', isha: 17.5}
|
70
|
+
settings: {fajr: 18, maghrib: '0 min', isha: 17.5}
|
71
71
|
},
|
72
72
|
'Libya' =>{
|
73
73
|
desc: "Libya",
|
@@ -110,14 +110,14 @@ module PrayerTimes
|
|
110
110
|
}
|
111
111
|
}
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
# Initializer
|
115
115
|
# it populates a hash with predefined set of methods
|
116
116
|
def initialize
|
117
117
|
self.hash = {}
|
118
118
|
populate
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
# @param [String] name
|
122
122
|
# @param [String] description
|
123
123
|
# @param [Hash] settings
|
@@ -126,20 +126,20 @@ module PrayerTimes
|
|
126
126
|
def add(name, description, settings={}, offsets={})
|
127
127
|
hash[name] = CalculationMethod.new(name, description, settings, offsets)
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
# Names of the available methods
|
131
131
|
# @return [Array] list of names
|
132
132
|
def names
|
133
133
|
keys
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
private
|
137
|
-
|
137
|
+
|
138
138
|
attr_accessor :hash
|
139
|
-
|
139
|
+
|
140
140
|
def populate
|
141
141
|
self.class.default_methods.each {|k,v| add(k, v[:desc], v[:settings], v[:offsets])}
|
142
|
-
end
|
143
|
-
|
142
|
+
end
|
143
|
+
|
144
144
|
end
|
145
|
-
end
|
145
|
+
end
|
@@ -3,9 +3,9 @@ module PrayerTimes
|
|
3
3
|
# This is main interface class
|
4
4
|
class Calculator
|
5
5
|
include Setters
|
6
|
-
|
6
|
+
|
7
7
|
attr_reader :calculation_method, :time_format, :times_names, :time_suffixes, :invalid_time, :iterations_count, :times_offsets
|
8
|
-
|
8
|
+
|
9
9
|
# Initializer
|
10
10
|
# @param [String] calc_method the calculation method to use
|
11
11
|
# @param [Hash] opts formatting options
|
@@ -32,7 +32,7 @@ module PrayerTimes
|
|
32
32
|
self.iterations_count = opts[:iterations_count]
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
|
36
36
|
|
37
37
|
# Gets the prayers times
|
38
38
|
# @param [Date] date the date
|
@@ -42,17 +42,17 @@ module PrayerTimes
|
|
42
42
|
# @return [Hash] times
|
43
43
|
def get_times(date, coords, time_zone, dst = nil)
|
44
44
|
Calculation.new(self,
|
45
|
-
|
46
|
-
|
45
|
+
date,
|
46
|
+
coords,
|
47
47
|
time_zone + (dst.nil? ? 0 : 1)).
|
48
|
-
|
48
|
+
compute
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
private
|
52
|
-
|
52
|
+
|
53
53
|
def const_class
|
54
54
|
PrayerTimes
|
55
55
|
end
|
56
56
|
|
57
57
|
end
|
58
|
-
end
|
58
|
+
end
|
@@ -1,28 +1,28 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
module PrayerTimes
|
3
3
|
# General constants. Don't try to change their values.
|
4
|
-
# You have flexible general and instance configurations.
|
4
|
+
# You have flexible general and instance configurations.
|
5
5
|
module Constants
|
6
6
|
# Used internally in the algorithm. Don't change unless you know
|
7
7
|
# What you are doing
|
8
8
|
# 0 < iterations_count < 6
|
9
9
|
@iterations_count = 1
|
10
|
-
|
11
|
-
# Determines the accepted values for iterations count
|
10
|
+
|
11
|
+
# Determines the accepted values for iterations count
|
12
12
|
@accepted_iterations_count_range = 1..5
|
13
13
|
|
14
14
|
# Times names to be displayed
|
15
15
|
@times_names = {
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
imsak: 'Imsak',
|
17
|
+
fajr: 'Fajr',
|
18
|
+
sunrise: 'Sunrise',
|
19
|
+
dhuhr: 'Dhuhr',
|
20
|
+
asr: 'Asr',
|
21
|
+
sunset: 'Sunset',
|
22
|
+
maghrib: 'Maghrib',
|
23
|
+
isha: 'Isha',
|
24
|
+
midnight: 'Midnight'
|
25
|
+
}
|
26
26
|
|
27
27
|
# The option time_format takes the following values:
|
28
28
|
# '24h': 24-hour format,
|
@@ -30,8 +30,8 @@ module PrayerTimes
|
|
30
30
|
# '12hNS': 12-hour format with no suffix,
|
31
31
|
# 'Float': floating point number
|
32
32
|
@time_format = '24h'
|
33
|
-
|
34
|
-
# Determines the accepted time format values
|
33
|
+
|
34
|
+
# Determines the accepted time format values
|
35
35
|
@accepted_time_formats = ['12h','24h','12hNS','Float']
|
36
36
|
|
37
37
|
# Times suffixes names to be displayed
|
@@ -42,11 +42,11 @@ module PrayerTimes
|
|
42
42
|
|
43
43
|
# Time offsets
|
44
44
|
@times_offsets = @times_names.keys.inject({}){ |h,k| h.merge!(k => 0)}
|
45
|
-
|
45
|
+
|
46
46
|
class << self
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
attr_reader :iterations_count, :times_names,
|
48
|
+
:time_format, :time_suffixes,:times_offsets,:invalid_time,
|
49
|
+
:accepted_iterations_count_range, :accepted_time_formats
|
50
50
|
end
|
51
51
|
end
|
52
|
-
end
|
52
|
+
end
|
data/lib/prayer_times/setters.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
module PrayerTimes
|
3
|
-
# General setters
|
3
|
+
# General setters
|
4
4
|
module Setters
|
5
|
-
|
5
|
+
|
6
6
|
# Sets iterations c
|
7
7
|
# @param [Integer] num
|
8
8
|
# 0 < num < 6
|
9
9
|
def iterations_count=(num)
|
10
10
|
@iterations_count = if (Constants.accepted_iterations_count_range).include?(num)
|
11
11
|
num
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
else
|
13
|
+
const_class.iterations_count
|
14
|
+
end
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# Sets time format
|
18
18
|
# @param [String] format
|
19
19
|
# '24h': 24-hour format,
|
@@ -23,7 +23,7 @@ module PrayerTimes
|
|
23
23
|
def time_format=(format)
|
24
24
|
@time_format = if Constants.accepted_time_formats.include?(format)
|
25
25
|
format
|
26
|
-
else
|
26
|
+
else
|
27
27
|
const_class.time_format
|
28
28
|
end
|
29
29
|
end
|
@@ -52,7 +52,7 @@ module PrayerTimes
|
|
52
52
|
# @param [Hash] offsets
|
53
53
|
def times_offsets=(offsets)
|
54
54
|
s = offsets.reject{|k,v| !(const_class.times_offsets.key?(k) and v.is_a?(Numeric))} rescue {}
|
55
|
-
@times_offsets = const_class.times_offsets.merge(s)
|
55
|
+
@times_offsets = const_class.times_offsets.merge(s)
|
56
56
|
end
|
57
57
|
|
58
58
|
# Sets calculation method and the corresponding settings
|
@@ -63,10 +63,11 @@ module PrayerTimes
|
|
63
63
|
else
|
64
64
|
PrayerTimes.calculation_method
|
65
65
|
end
|
66
|
-
end
|
67
|
-
|
66
|
+
end
|
67
|
+
|
68
68
|
def const_class #:nodoc:
|
69
|
-
raise
|
69
|
+
raise NotImplementedError,
|
70
|
+
"You must implement #const_class to define which class to get the default attributes from"
|
70
71
|
end
|
71
72
|
end
|
72
|
-
end
|
73
|
+
end
|
data/lib/prayer_times/version.rb
CHANGED
data/lib/prayer_times.rb
CHANGED
@@ -15,8 +15,8 @@ module PrayerTimes #:nodoc:
|
|
15
15
|
include Setters
|
16
16
|
|
17
17
|
attr_reader :iterations_count, :times_names, :calculation_methods,
|
18
|
-
|
19
|
-
|
18
|
+
:calculation_method,:time_format, :time_suffixes,:times_offsets,
|
19
|
+
:invalid_time
|
20
20
|
# @see Calculator initializer
|
21
21
|
def new(calc_method=@calucation_method,opts={})
|
22
22
|
PrayerTimes::Calculator.new(calc_method, opts)
|
@@ -28,7 +28,7 @@ module PrayerTimes #:nodoc:
|
|
28
28
|
|
29
29
|
def set_attributes
|
30
30
|
attrs = [:iterations_count, :times_names, :time_format,
|
31
|
-
|
31
|
+
:time_suffixes,:times_offsets, :invalid_time]
|
32
32
|
attrs.each {|attr| self.send "#{attr}=", nil}
|
33
33
|
|
34
34
|
@calculation_methods = CalculationMethods.new
|
data/prayer_times.gemspec
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
require_relative '../../test_helper'
|
3
3
|
|
4
4
|
describe PrayerTimes::CalculationMethod do
|
5
|
-
|
5
|
+
|
6
6
|
let(:method_name){"Medina"}
|
7
7
|
let(:description){"Medina testing methods"}
|
8
|
-
|
8
|
+
|
9
9
|
describe "Object" do
|
10
10
|
subject{PrayerTimes::CalculationMethod.new(method_name, description,{})}
|
11
11
|
it {subject.must_respond_to :description}
|
@@ -15,44 +15,44 @@ describe PrayerTimes::CalculationMethod do
|
|
15
15
|
it {subject.must_respond_to :offsets}
|
16
16
|
it {subject.must_respond_to :offsets=}
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
describe "#initialize" do
|
20
20
|
context "when method_name and description are provided" do
|
21
21
|
subject{PrayerTimes::CalculationMethod.new(method_name, description)}
|
22
22
|
it {subject.name.must_equal(method_name)}
|
23
23
|
it {subject.description.must_equal(description)}
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
context "when settings are not provided" do
|
27
27
|
subject{PrayerTimes::CalculationMethod.new(method_name, description, {})}
|
28
28
|
it {subject.settings.must_equal(PrayerTimes::CalculationMethod.default_settings)}
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
context "when settings are provided" do
|
32
32
|
let(:opts){{
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
fajr: 18,
|
34
|
+
asr: 'Hanafi',
|
35
|
+
isha: 18
|
36
36
|
}}
|
37
37
|
subject{PrayerTimes::CalculationMethod.new(method_name, description,opts)}
|
38
38
|
it {subject.settings.must_equal(PrayerTimes::CalculationMethod.default_settings.merge opts)}
|
39
|
-
end
|
40
|
-
|
39
|
+
end
|
40
|
+
|
41
41
|
context "when offsets are not provided" do
|
42
42
|
subject{PrayerTimes::CalculationMethod.new(method_name, description, {}, {})}
|
43
43
|
it {subject.offsets.must_equal(PrayerTimes::Constants.times_offsets)}
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
context "when offsets are provided" do
|
47
47
|
let(:opts){{
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
fajr: 3,
|
49
|
+
asr: -1,
|
50
|
+
isha: 6
|
51
51
|
}}
|
52
52
|
subject{PrayerTimes::CalculationMethod.new(method_name, description,{},opts)}
|
53
53
|
it {subject.offsets.must_equal(PrayerTimes::Constants.times_offsets.merge opts)}
|
54
|
-
end
|
55
|
-
|
54
|
+
end
|
55
|
+
|
56
56
|
end
|
57
57
|
|
58
58
|
end
|
@@ -12,9 +12,9 @@ describe PrayerTimes::CalculationMethods do
|
|
12
12
|
it {subject.must_respond_to :key?}
|
13
13
|
it {subject.must_respond_to :delete}
|
14
14
|
end
|
15
|
-
|
16
15
|
|
17
|
-
|
16
|
+
|
17
|
+
|
18
18
|
describe "#add" do
|
19
19
|
before do
|
20
20
|
@subject = PrayerTimes::CalculationMethods.new
|
@@ -32,7 +32,7 @@ describe PrayerTimes::CalculationMethods do
|
|
32
32
|
it {@subject["Test"].offsets[:asr].must_equal -1}
|
33
33
|
it {@subject["Test"].offsets[:isha].must_equal 3}
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
describe "#names" do
|
37
37
|
subject{PrayerTimes::CalculationMethods.new}
|
38
38
|
it{subject.names.must_equal subject.keys}
|
@@ -7,118 +7,153 @@ describe PrayerTimes::Calculation do
|
|
7
7
|
describe '#compute' do
|
8
8
|
context 'when method is MWL' do
|
9
9
|
context 'when date is 2011/2/9, location is Waterloo/Canada and timezone -5' do
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
10
|
+
let(:pt){PrayerTimes.new}
|
11
|
+
subject{pt.get_times([2011,2,9], [43, -80], -5)}
|
12
|
+
let(:expected){{
|
13
|
+
'Imsak' => '05:40',
|
14
|
+
'Fajr' => '05:50',
|
15
|
+
'Sunrise' => '07:26',
|
16
|
+
'Dhuhr' => '12:34',
|
17
|
+
'Asr' => '15:18' ,
|
18
|
+
'Sunset' => '17:43' ,
|
19
|
+
'Maghrib' => '17:43' ,
|
20
|
+
'Isha' => '19:14' ,
|
21
|
+
'Midnight' => '00:35' }}
|
22
|
+
it{subject.must_equal expected}
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
context 'when method is Makkah' do
|
27
27
|
let(:method_name){'Makkah'}
|
28
|
-
|
29
|
-
|
28
|
+
|
29
|
+
context 'time format is 24h and other settings are default' do
|
30
30
|
context 'when date is 2013/12/16, location is Amman/Jordan and timezone 3' do
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
31
|
+
let(:pt){PrayerTimes.new method_name}
|
32
|
+
subject{pt.get_times([2013,12,16], [31,36], 3)}
|
33
|
+
let(:expected){{
|
34
|
+
'Imsak' => '05:48',
|
35
|
+
'Fajr' => '05:58',
|
36
|
+
'Sunrise' => '07:27',
|
37
|
+
'Dhuhr' => '12:32',
|
38
|
+
'Asr' => '15:18' ,
|
39
|
+
'Sunset' => '17:36' ,
|
40
|
+
'Maghrib' => '17:36' ,
|
41
|
+
'Isha' => '19:06' ,
|
42
|
+
'Midnight' => '00:32' }}
|
43
|
+
it{subject.must_equal expected}
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
47
|
-
context 'time format is 24h, offsets are custom and other settings are default' do
|
46
|
+
|
47
|
+
context 'time format is 24h, offsets are custom and other settings are default' do
|
48
48
|
context 'when date is 2013/12/16, location is Amman/Jordan and timezone 3' do
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
49
|
+
let(:pt){PrayerTimes.new method_name, times_offsets: {fajr: 4, dhuhr: 2, midnight: 1}}
|
50
|
+
subject{pt.get_times([2013,12,16], [31,36], 3)}
|
51
|
+
let(:expected){{
|
52
|
+
'Imsak' => '05:48',
|
53
|
+
'Fajr' => '06:02',
|
54
|
+
'Sunrise' => '07:27',
|
55
|
+
'Dhuhr' => '12:34',
|
56
|
+
'Asr' => '15:18' ,
|
57
|
+
'Sunset' => '17:36' ,
|
58
|
+
'Maghrib' => '17:36' ,
|
59
|
+
'Isha' => '19:06' ,
|
60
|
+
'Midnight' => '00:33' }}
|
61
|
+
it{subject.must_equal expected}
|
62
62
|
end
|
63
63
|
end
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
context 'time format is 24h, times names are custom and settings are default' do
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
context 'time format is 24h, times names are custom and settings are default' do
|
68
68
|
context 'when date is 2013/12/16, location is Amman/Jordan and timezone 3' do
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
69
|
+
let(:pt){PrayerTimes.new method_name, times_names: {asr: "Aser", isha: "Ishaa"}}
|
70
|
+
subject{pt.get_times([2013,12,16], [31,36], 3)}
|
71
|
+
let(:expected){{
|
72
|
+
'Imsak' => '05:48',
|
73
|
+
'Fajr' => '05:58',
|
74
|
+
'Sunrise' => '07:27',
|
75
|
+
'Dhuhr' => '12:32',
|
76
|
+
'Aser' => '15:18' ,
|
77
|
+
'Sunset' => '17:36' ,
|
78
|
+
'Maghrib' => '17:36' ,
|
79
|
+
'Ishaa' => '19:06' ,
|
80
|
+
'Midnight' => '00:32' }}
|
81
|
+
it{subject.must_equal expected}
|
82
82
|
end
|
83
83
|
end
|
84
|
-
|
85
|
-
context 'time format is 12h, suffixes are custom and other settings are default' do
|
84
|
+
|
85
|
+
context 'time format is 12h, suffixes are custom and other settings are default' do
|
86
86
|
context 'when date is 2013/12/16, location is Amman/Jordan and timezone 3' do
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
87
|
+
let(:pt){PrayerTimes.new method_name, time_format: '12h', time_suffixes: {:am => ' صباحا', :pm => ' مساءا'}}
|
88
|
+
subject{pt.get_times([2013,12,16], [31,36], 3)}
|
89
|
+
let(:expected){{
|
90
|
+
'Imsak' => '5:48 صباحا',
|
91
|
+
'Fajr' => '5:58 صباحا',
|
92
|
+
'Sunrise' => '7:27 صباحا',
|
93
|
+
'Dhuhr' => '12:32 مساءا',
|
94
|
+
'Asr' => '3:18 مساءا' ,
|
95
|
+
'Sunset' => '5:36 مساءا' ,
|
96
|
+
'Maghrib' => '5:36 مساءا' ,
|
97
|
+
'Isha' => '7:06 مساءا' ,
|
98
|
+
'Midnight' => '12:32 صباحا' }}
|
99
|
+
it{subject.must_equal expected}
|
100
100
|
end
|
101
101
|
end
|
102
102
|
end
|
103
|
-
|
104
|
-
|
103
|
+
|
104
|
+
context 'when method is Turkey' do
|
105
105
|
context 'when date is 2013/12/17, location is Fatih/Istanbul/Turkey and timezone +2' do
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
106
|
+
let(:pt){PrayerTimes.new "Turkey", time_format: '12h'}
|
107
|
+
subject{pt.get_times([2013,12,17], [41.02,28.94], 2)}
|
108
|
+
let(:expected){{
|
109
|
+
'Imsak' => '5:34AM',
|
110
|
+
'Fajr' => '5:42AM',
|
111
|
+
'Sunrise' => '7:16AM',
|
112
|
+
'Dhuhr' => '12:06PM',
|
113
|
+
'Asr' => '2:24PM' ,
|
114
|
+
'Sunset' => '4:37PM' ,
|
115
|
+
'Maghrib' => '4:46PM' ,
|
116
|
+
'Isha' => '6:13PM' ,
|
117
|
+
'Midnight' => '12:00AM' }}
|
118
|
+
it{subject.must_equal expected}
|
119
119
|
end
|
120
120
|
end
|
121
|
-
|
122
|
-
|
121
|
+
|
122
|
+
context 'when method is Karachi' do
|
123
|
+
context 'when date is 2013/12/17, location is Islamabad, timezone +5 and format is 12h' do
|
124
|
+
let(:pt){PrayerTimes.new "Karachi", time_format: '12h'}
|
125
|
+
subject{pt.get_times([2014,1,23], [33.73,73.06], 5)}
|
126
|
+
let(:expected){{
|
127
|
+
'Imsak' => '5:33AM',
|
128
|
+
'Fajr' => '5:43AM',
|
129
|
+
'Sunrise' => '7:10AM',
|
130
|
+
'Dhuhr' => '12:20PM',
|
131
|
+
'Asr' => '3:52PM' ,
|
132
|
+
'Sunset' => '5:30PM' ,
|
133
|
+
'Maghrib' => '5:30PM' ,
|
134
|
+
'Isha' => '6:56PM' ,
|
135
|
+
'Midnight' => '12:20AM' }}
|
136
|
+
it{subject.must_equal expected}
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context 'when method is Kula Malaysia' do
|
141
|
+
context 'when date is 2013/12/17, location is Kula Lumpur, timezone +8 and format is 12h' do
|
142
|
+
let(:pt){PrayerTimes.new "Malaysia", time_format: '12h'}
|
143
|
+
subject{pt.get_times([2014,1,23], [3.15,101.69], 8)}
|
144
|
+
let(:expected){{
|
145
|
+
'Imsak' => '5:54AM',
|
146
|
+
'Fajr' => '6:07AM',
|
147
|
+
'Sunrise' => '7:28AM',
|
148
|
+
'Dhuhr' => '1:26PM',
|
149
|
+
'Asr' => '4:50PM' ,
|
150
|
+
'Sunset' => '7:25PM' ,
|
151
|
+
'Maghrib' => '7:25PM' ,
|
152
|
+
'Isha' => '8:36PM' ,
|
153
|
+
'Midnight' => '1:25AM' }}
|
154
|
+
it{subject.must_equal expected}
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
123
158
|
end
|
124
159
|
end
|
@@ -3,15 +3,15 @@ require_relative '../../test_helper'
|
|
3
3
|
|
4
4
|
describe PrayerTimes::Calculator do
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
6
|
+
subject{PrayerTimes::Calculator.new "MWL",{}}
|
7
|
+
it{subject.must_respond_to :calculation_method}
|
8
|
+
it{subject.must_respond_to :time_format}
|
9
|
+
it{subject.must_respond_to :times_names}
|
10
|
+
it{subject.must_respond_to :time_suffixes}
|
11
|
+
it{subject.must_respond_to :invalid_time}
|
12
|
+
it{subject.must_respond_to :iterations_count}
|
13
|
+
it{subject.must_respond_to :times_offsets}
|
14
|
+
it{subject.must_respond_to :get_times}
|
15
|
+
it{subject.must_be_kind_of PrayerTimes::Setters}
|
16
|
+
|
17
17
|
end
|
@@ -16,31 +16,31 @@ describe PrayerTimes::MathHelpers do
|
|
16
16
|
describe "#rsin" do
|
17
17
|
it {subject.must_respond_to(:rsin)}
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
describe "#rcos" do
|
21
21
|
it {subject.must_respond_to(:rcos)}
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
describe "#rtan" do
|
25
25
|
it {subject.must_respond_to(:rtan)}
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
describe "#darcsin" do
|
29
29
|
it {subject.must_respond_to(:darcsin)}
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
describe "#darccos" do
|
33
33
|
it {subject.must_respond_to(:darccos)}
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
describe "#darctan" do
|
37
37
|
it {subject.must_respond_to(:darctan)}
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
describe "#darccot" do
|
41
41
|
it {subject.must_respond_to(:darccot)}
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
describe "#darctan2" do
|
45
45
|
it {subject.must_respond_to(:darctan2)}
|
46
46
|
end
|
@@ -15,10 +15,10 @@ describe PrayerTimes do
|
|
15
15
|
it{subject.must_respond_to :times_offsets}
|
16
16
|
it{subject.must_be_kind_of PrayerTimes::Setters}
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
describe ".new" do
|
20
20
|
subject{PrayerTimes.new}
|
21
21
|
it{subject.must_be_kind_of PrayerTimes::Calculator}
|
22
22
|
end
|
23
23
|
|
24
|
-
end
|
24
|
+
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
require_relative '../../test_helper'
|
3
3
|
|
4
4
|
describe PrayerTimes::Setters do
|
5
|
-
|
5
|
+
|
6
6
|
subject{PrayerTimes::Calculator.new "MWL",{}}
|
7
7
|
describe "#iteration_count=" do
|
8
8
|
context "when number not number or out of range" do
|
@@ -33,7 +33,7 @@ describe PrayerTimes::Setters do
|
|
33
33
|
it{result.must_equal time_format}
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
describe "#invalid_time=" do
|
38
38
|
context "when nil" do
|
39
39
|
let(:invalid_time){nil}
|
@@ -47,7 +47,7 @@ describe PrayerTimes::Setters do
|
|
47
47
|
it{result.must_equal invalid_time}
|
48
48
|
end
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
describe "#time_suffixes=" do
|
52
52
|
context "when wrong value" do
|
53
53
|
let(:time_suffixes){{:amz => "صباحا", :pm => "مساءا"}}
|
@@ -61,7 +61,7 @@ describe PrayerTimes::Setters do
|
|
61
61
|
it{result.must_equal PrayerTimes.time_suffixes.merge(time_suffixes)}
|
62
62
|
end
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
describe "#times_names=" do
|
66
66
|
context "when wrong value" do
|
67
67
|
let(:times_names){{:aser => "Aser", :koko => "Dano", :isha => "Ishaa"}}
|
@@ -75,7 +75,7 @@ describe PrayerTimes::Setters do
|
|
75
75
|
it{result.must_equal PrayerTimes.times_names.merge(times_names)}
|
76
76
|
end
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
describe "#times_offsets=" do
|
80
80
|
context "when wrong value" do
|
81
81
|
let(:times_offsets){{:aser => 10, :dhuhr => "Dano", :isha => 3.6}}
|
@@ -89,7 +89,7 @@ describe PrayerTimes::Setters do
|
|
89
89
|
it{result.must_equal PrayerTimes.times_offsets.merge(times_offsets)}
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
describe "#calculation_method=" do
|
94
94
|
context "when wrong value" do
|
95
95
|
let(:calculation_method){'K@mp'}
|
@@ -103,4 +103,4 @@ describe PrayerTimes::Setters do
|
|
103
103
|
it{result.must_equal PrayerTimes.calculation_methods['Makkah']}
|
104
104
|
end
|
105
105
|
end
|
106
|
-
end
|
106
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'minitest/autorun'
|
3
3
|
require 'minitest/pride'
|
4
|
+
require 'coveralls'
|
5
|
+
Coveralls.wear!
|
4
6
|
require File.expand_path('../../lib/prayer_times.rb', __FILE__)
|
5
7
|
class MiniTest::Spec
|
6
8
|
class << self
|
7
9
|
alias :context :describe
|
8
10
|
end
|
9
|
-
end
|
11
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prayer_times
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Khaled alHabache
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: coveralls
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: Calculates Muslim prayers times in given settings
|
56
70
|
email:
|
57
71
|
- khellls@gmail.com
|