prayertimes 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 56620c9087706a7cf2587e61a8c3520ccb59f3fb
4
+ data.tar.gz: aa161d67cf5d43364f47387be41d8495afb68a37
5
+ SHA512:
6
+ metadata.gz: f2bdec48edae509663daa91c5cc10bd6631e338d29bc5afd2eb2583084c9710b0ae6439d552acfbe1f6f6603e52a6e280e51d06513c0658691e8489f9046f654
7
+ data.tar.gz: 80fe5afe07e86af212fa51954a0a1f6ca7f76292559a0632e3a5bcfc9873f3bb02851e4009cf70b88d3755499e4628e105d47b45c3e1f3660101a4ba7a979f65
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in prayertimes.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Mohamed El Mahallawy
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Prayertimes
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'prayertimes'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install prayertimes
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/prayertimes/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,3 @@
1
+ module Prayertimes
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,442 @@
1
+ require "prayertimes/version"
2
+ require "date"
3
+ module Prayertimes
4
+ class Prayertimes
5
+
6
+
7
+ # Names of the times
8
+
9
+ @@timeNames = {
10
+ 'imsak' => 'Imsak',
11
+ 'fajr' => 'Fajr',
12
+ 'sunrise' => 'Sunrise',
13
+ 'dhuhr' => 'Dhuhr',
14
+ 'asr' => 'Asr',
15
+ 'sunset' => 'Sunset',
16
+ 'maghrib' => 'Maghrib',
17
+ 'isha' => 'Isha',
18
+ 'midnight' => 'Midnight'
19
+ }
20
+
21
+
22
+
23
+ # Calculation Methods
24
+
25
+ @@methods = {
26
+ 'MWL'=> {
27
+ 'name'=> 'Muslim World League',
28
+ 'params'=> { 'fajr'=> 18, 'isha'=> 17 } },
29
+ 'ISNA'=> {
30
+ 'name'=> 'Islamic Society of North America (ISNA)',
31
+ 'params'=> { 'fajr'=> 15, 'isha'=> 15 } },
32
+ 'Egypt'=> {
33
+ 'name'=> 'Egyptian General Authority of Survey',
34
+ 'params'=> { 'fajr'=> 19.5, 'isha'=> 17.5 } },
35
+ 'Makkah'=> {
36
+ 'name'=> 'Umm Al-Qura University, Makkah',
37
+ 'params'=> { 'fajr'=> 18.5, 'isha'=> '90 min' } }, # fajr was 19 degrees before 1430 hijri
38
+ 'Karachi'=> {
39
+ 'name'=> 'University of Islamic Sciences, Karachi',
40
+ 'params'=> { 'fajr'=> 18, 'isha'=> 18 } },
41
+ 'Tehran'=> {
42
+ 'name'=> 'Institute of Geophysics, University of Tehran',
43
+ 'params'=> { 'fajr'=> 17.7, 'isha'=> 14, 'maghrib'=> 4.5, 'midnight'=> 'Jafari' } }, # isha is not explicitly specified in this method
44
+ 'Jafari'=> {
45
+ 'name'=> 'Shia Ithna-Ashari, Leva Institute, Qum',
46
+ 'params'=> { 'fajr'=> 16, 'isha'=> 14, 'maghrib'=> 4, 'midnight'=> 'Jafari' } }
47
+ }
48
+
49
+
50
+ # Default Parameters in Calculation Methods
51
+
52
+ @@defaultParams = {
53
+ 'maghrib'=> '0 min', 'midnight'=> 'Standard'
54
+ }
55
+
56
+
57
+
58
+ #---------------------- Default Settings --------------------
59
+
60
+
61
+ @@calcMethod = 'MWL'
62
+
63
+
64
+ # do not change anything here; use adjust method instead
65
+
66
+ @@settings = {
67
+ "imsak" => '10 min',
68
+ "dhuhr" => '0 min',
69
+ "asr" => 'Standard',
70
+ "highLats" => 'NightMiddle'
71
+ }
72
+
73
+
74
+
75
+ @@timeFormat = '24h'
76
+
77
+
78
+
79
+ @@timeSuffixes = ['am', 'pm']
80
+
81
+
82
+
83
+ @@invalidTime = '-----'
84
+
85
+
86
+
87
+ @@numIterations = 1
88
+
89
+
90
+
91
+ @@offset = {}
92
+
93
+
94
+
95
+ #---------------------- Initialization -----------------------
96
+
97
+ def initialize(method = "MWL")
98
+ @@methods.each do |method, config|
99
+ @@defaultParams.each do |name, value|
100
+ # if name in config['params'] || config['params'][name] != nil
101
+ config['params'][name] = value
102
+ # end
103
+ end
104
+ end
105
+
106
+ @@calcMethod = method #if method in @@methods else 'MWL'
107
+
108
+ params = @@methods[@@calcMethod]['params']
109
+ params.each do |name, value|
110
+ @@settings[name] = value
111
+ end
112
+
113
+ @@timeNames.each do |name, value|
114
+ @@offset[name] = 0
115
+ end
116
+
117
+ end
118
+
119
+
120
+ #-------------------- Interface Functions --------------------
121
+
122
+ def setMethod(method)
123
+ if @@methods[method]
124
+ self.adjust(@@methods[method].params)
125
+ self.calcMethod = method
126
+ end
127
+ end
128
+
129
+ def adjust(params)
130
+ @@settings.update(params)
131
+ end
132
+
133
+ def tune(timeOffsets)
134
+ @@offset.update(timeOffsets)
135
+ end
136
+
137
+ def getMethod
138
+ return @@calcMethod
139
+ end
140
+
141
+ def getSettings
142
+ return @@settings
143
+ end
144
+
145
+ def getOffsets
146
+ return @@offset
147
+ end
148
+
149
+ def getDefaults
150
+ return @@methods
151
+ end
152
+
153
+ # return prayer times for a given date
154
+ def getTimes(date, coords, timezone, dst = 0, format = nil)
155
+ @lat = coords[0]
156
+ @lng = coords[1]
157
+ @elv = coords.length >2 ? coords[2] : 0
158
+
159
+ if format != nil
160
+ @@timeFormat = format
161
+ end
162
+
163
+ if Date.parse(date)
164
+ date = Date.parse(date)
165
+ date = [date.year, date.month, date.day]
166
+ end
167
+
168
+ @timeZone = timezone + (dst ? 1 : 0)
169
+ @jDate = self.julian(date[0], date[1], date[2]) - @lng / (15 * 24.0)
170
+ return self.computeTimes
171
+ end
172
+
173
+ # convert float time to the given format (see timeFormats)
174
+ def getFormattedTime(time, format, suffixes = nil)
175
+
176
+ return self.invalidTime if time.nan?
177
+
178
+ return time if format == 'Float'
179
+
180
+ suffixes = @@timeSuffixes if suffixes == nil
181
+
182
+ time = self.fixhour(time+ 0.5/ 60) # add 0.5 minutes to round
183
+ hours = time.floor
184
+
185
+ minutes = ((time - hours)* 60).floor
186
+ suffix = format == '12h' ? suffixes[ hours < 12 ? 0 : 1 ] : ''
187
+ # formattedTime = "%02d:%02d" % (hours, minutes) if format == "24h" else "%d:%02d" % ((hours+11)%12+1, minutes)
188
+ formattedTime = "#{hours}:#{minutes}"
189
+ return formattedTime + suffix
190
+
191
+ end
192
+
193
+ #---------------------- Calculation Functions -----------------------
194
+
195
+ # compute mid-day time
196
+ def midDay(time)
197
+ eqt = self.sunPosition(@jDate + time)[1]
198
+ return self.fixhour(12 - eqt)
199
+ end
200
+
201
+ # compute the time at which sun reaches a specific angle below horizon
202
+ def sunAngleTime(angle, time, direction = nil)
203
+ angle
204
+ time
205
+ begin
206
+ decl = self.sunPosition(@jDate + time)[0]
207
+ noon = self.midDay(time)
208
+ t = 1/15.0* self.arccos((-self.sin(angle)- self.sin(decl)* self.sin(@lat))/ (self.cos(decl)* self.cos(@lat)))
209
+
210
+ return noon + (direction == 'ccw' ? -t : t)
211
+ rescue
212
+ return ('nan').to_f
213
+ end
214
+ end
215
+
216
+ # compute asr time
217
+ def asrTime(factor, time)
218
+ decl = self.sunPosition(@jDate + time)[0]
219
+ angle = -self.arccot(factor + self.tan((@lat - decl).abs))
220
+ return self.sunAngleTime(angle, time)
221
+ end
222
+
223
+ # compute declination angle of sun and equation of time
224
+ # Ref: http://aa.usno.navy.mil/faq/docs/SunApprox.php
225
+ def sunPosition(jd)
226
+ d = jd - 2451545.0
227
+ g = self.fixangle(357.529 + 0.98560028* d)
228
+ q = self.fixangle(280.459 + 0.98564736* d)
229
+ l = self.fixangle(q + 1.915* self.sin(g) + 0.020* self.sin(2*g))
230
+
231
+ r = 1.00014 - 0.01671*self.cos(g) - 0.00014*self.cos(2*g)
232
+ e = 23.439 - 0.00000036* d
233
+
234
+ ra = self.arctan2(self.cos(e)* self.sin(l), self.cos(l))/ 15.0
235
+ eqt = q/15.0 - self.fixhour(ra)
236
+ decl = self.arcsin(self.sin(e)* self.sin(l))
237
+
238
+ return [decl, eqt]
239
+ end
240
+
241
+ # convert Gregorian date to Julian day
242
+ # Ref: Astronomical Algorithms by Jean Meeus
243
+ def julian(year, month, day)
244
+ if month <= 2
245
+ year -= 1
246
+ month += 12
247
+ end
248
+ a = (year / 100).floor
249
+ b = 2 - a + (a / 4).floor
250
+ return (365.25 * (year + 4716)).floor + (30.6001 * (month + 1)).floor + day + b - 1524.5
251
+ end
252
+
253
+ #---------------------- Compute Prayer Times -----------------------
254
+
255
+ # compute prayer times at given julian date
256
+ def computePrayerTimes(times)
257
+ times = self.dayPortion(times)
258
+ params = @@settings
259
+
260
+ imsak = self.sunAngleTime(self.eval(params['imsak']), times['imsak'], 'ccw')
261
+ fajr = self.sunAngleTime(self.eval(params['fajr']), times['fajr'], 'ccw')
262
+ sunrise = self.sunAngleTime(self.riseSetAngle(@elv), times['sunrise'], 'ccw')
263
+ dhuhr = self.midDay(times['dhuhr'])
264
+ asr = self.asrTime(self.asrFactor(params['asr']), times['asr'])
265
+ sunset = self.sunAngleTime(self.riseSetAngle(@elv), times['sunset'])
266
+ maghrib = self.sunAngleTime(self.eval(params['maghrib']), times['maghrib'])
267
+ isha = self.sunAngleTime(self.eval(params['isha']), times['isha'])
268
+ return {
269
+ 'imsak'=> imsak, 'fajr'=> fajr, 'sunrise'=> sunrise, 'dhuhr'=> dhuhr,
270
+ 'asr'=> asr, 'sunset'=> sunset, 'maghrib'=> maghrib, 'isha'=> isha
271
+ }
272
+ end
273
+
274
+ # compute prayer times
275
+ def computeTimes
276
+ times = {
277
+ 'imsak'=> 5, 'fajr'=> 5, 'sunrise'=> 6, 'dhuhr'=> 12,
278
+ 'asr'=> 13, 'sunset'=> 18, 'maghrib'=> 18, 'isha'=> 18
279
+ }
280
+ # main iterations
281
+ @@numIterations.times do
282
+ times = self.computePrayerTimes(times)
283
+ end
284
+ times = self.adjustTimes(times)
285
+ # add midnight time
286
+ if @@settings['midnight'] == 'Jafari'
287
+ times['midnight'] = times['sunset'] + self.timeDiff(times['sunset'], times['fajr']) / 2
288
+ else
289
+ times['midnight'] = times['sunset'] + self.timeDiff(times['sunset'], times['sunrise']) / 2
290
+ end
291
+
292
+ times = self.tuneTimes(times)
293
+ return self.modifyFormats(times)
294
+ end
295
+
296
+ # adjust times in a prayer time array
297
+ def adjustTimes(times)
298
+ params = @@settings
299
+ tzAdjust = @timeZone - @lng / 15.0
300
+ times.each do |t,v|
301
+ times[t] += tzAdjust
302
+ end
303
+
304
+ if params['highLats'] != nil
305
+ times = self.adjustHighLats(times)
306
+ end
307
+
308
+ if self.isMin(params['imsak'])
309
+ times['imsak'] = times['fajr'] - self.eval(params['imsak']) / 60.0
310
+ end
311
+ # need to ask about '@@settings
312
+ if self.isMin(params['maghrib'])
313
+ times['maghrib'] = times['sunset'] - self.eval(params['maghrib']) / 60.0
314
+ end
315
+
316
+ if self.isMin(params['isha'])
317
+ times['isha'] = times['maghrib'] - self.eval(params['isha']) / 60.0
318
+ end
319
+ times['dhuhr'] += self.eval(params['dhuhr']) / 60.0
320
+
321
+ return times
322
+ end
323
+
324
+ # get asr shadow factor
325
+ def asrFactor(asrParam)
326
+ methods = {'Standard'=> 1, 'Hanafi'=> 2}
327
+ return methods[asrParam] ? methods[asrParam] : self.eval(asrParam)
328
+ end
329
+
330
+ # return sun angle for sunset/sunrise
331
+ def riseSetAngle(elevation = 0)
332
+ elevation = elevation == nil ? 0 : elevation
333
+ return 0.833 + 0.0347 * Math.sqrt(elevation) # an approximation
334
+ end
335
+
336
+ # apply offset to the times
337
+ def tuneTimes(times)
338
+ times.each do |name, value|
339
+ @@offset
340
+ times[name] += @@offset[name] / 60.0
341
+ end
342
+ return times
343
+ end
344
+
345
+ # convert times to given time format
346
+ def modifyFormats(times)
347
+ times.each do |name, value|
348
+ times[name] = self.getFormattedTime(times[name], @@timeFormat)
349
+ end
350
+ return times
351
+ end
352
+
353
+ # adjust times for locations in higher latitudes
354
+ def adjustHighLats(times)
355
+ params = @@settings
356
+ nightTime = self.timeDiff(times['sunset'], times['sunrise']) # sunset to sunrise
357
+ times['imsak'] = self.adjustHLTime(times['imsak'], times['sunrise'], self.eval(params['imsak']), nightTime, 'ccw')
358
+ times['fajr'] = self.adjustHLTime(times['fajr'], times['sunrise'], self.eval(params['fajr']), nightTime, 'ccw')
359
+ times['isha'] = self.adjustHLTime(times['isha'], times['sunset'], self.eval(params['isha']), nightTime)
360
+ times['maghrib'] = self.adjustHLTime(times['maghrib'], times['sunset'], self.eval(params['maghrib']), nightTime)
361
+ return times
362
+ end
363
+
364
+ # adjust a time for higher latitudes
365
+ def adjustHLTime(time, base, angle, night, direction = nil)
366
+ portion = self.nightPortion(angle, night)
367
+ diff = direction == 'ccw' ? self.timeDiff(time, base) : self.timeDiff(base, time)
368
+ if time.nan? or diff > portion
369
+ time = base + ( direction == 'ccw' ? -portion : portion)
370
+ end
371
+ return time
372
+ end
373
+
374
+ # the night portion used for adjusting times in higher latitudes
375
+ def nightPortion(angle, night)
376
+ method = @@settings['highLats']
377
+ portion = 1/2.0 # midnight
378
+ if method == 'AngleBased'
379
+ portion = 1/60.0 * angle
380
+ end
381
+ if method == 'OneSeventh'
382
+ portion = 1/7.0
383
+ end
384
+ return portion * night
385
+ end
386
+
387
+ # convert hours to day portions
388
+ def dayPortion(times)
389
+ times.each do |key, value|
390
+ times[key] = value /= 24.0
391
+ end
392
+ return times
393
+ end
394
+
395
+
396
+ #---------------------- Misc Functions -----------------------
397
+
398
+ # compute the difference between two times
399
+ def timeDiff(time1, time2)
400
+ return self.fixhour(time2- time1)
401
+ end
402
+
403
+ # convert given string into a number
404
+ def eval(st)
405
+ val = st.to_s.split('[^0-9.+-]')[0]
406
+ return val ? val.to_f : 0
407
+ end
408
+
409
+ # detect if input contains 'min'
410
+ def isMin(arg)
411
+ return arg.to_s.include?('min')
412
+ end
413
+
414
+
415
+ #----------------- Degree-Based Math Functions -------------------
416
+
417
+ def sin(d) return Math.sin((d) * Math::PI / 180); end
418
+ def cos(d) return Math.cos((d) * Math::PI / 180); end
419
+ def tan(d) return Math.tan((d) * Math::PI / 180); end
420
+
421
+ def arcsin(x) return ((Math.asin(x)* 180.0) / Math::PI); end
422
+ def arccos(x) return ((Math.acos(x)* 180.0) / Math::PI); end
423
+ def arctan(x) return ((Math.atan(x)* 180.0) / Math::PI); end
424
+
425
+ def arccot(x) return ((Math.atan(1.0/x)* 180.0) / Math::PI); end
426
+ def arctan2(y, x) return ((Math.atan2(y, x)* 180.0) / Math::PI); end
427
+
428
+ def fixangle(angle) return self.fix(angle, 360.0); end
429
+ def fixhour(hour) return self.fix(hour, 24.0); end
430
+
431
+ def fix(a, mode)
432
+ if a.nan?
433
+ return a
434
+ end
435
+ a = a - mode * ((a / mode).floor)
436
+ return a < 0 ? a + mode : a
437
+ end
438
+
439
+
440
+
441
+ end
442
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'prayertimes/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "prayertimes"
8
+ spec.version = Prayertimes::VERSION
9
+ spec.authors = ["Mohamed El Mahallawy"]
10
+ spec.email = ["mmahalwy@gmail.com"]
11
+ spec.summary = %q{ Gem used for calculating prayer times.}
12
+ spec.description = %q{Gem used for calculating prayer times.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Prayertimes do
4
+
5
+ subject {Prayertimes.new}
6
+
7
+ describe '#getTimes' do
8
+ let(:input){''}
9
+ let(:output){subject.getTimes(input)}
10
+
11
+
12
+ end
13
+ end
14
+
15
+
16
+
@@ -0,0 +1 @@
1
+ require 'prayertimes'
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prayertimes
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Mohamed El Mahallawy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Gem used for calculating prayer times.
56
+ email:
57
+ - mmahalwy@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
66
+ - Rakefile
67
+ - lib/prayertimes.rb
68
+ - lib/prayertimes/version.rb
69
+ - prayertimes.gemspec
70
+ - spec/prayertimes_spec.rb
71
+ - spec/spec_helper.rb
72
+ homepage: ''
73
+ licenses:
74
+ - MIT
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.2.2
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Gem used for calculating prayer times.
96
+ test_files:
97
+ - spec/prayertimes_spec.rb
98
+ - spec/spec_helper.rb