horoscope 0.0.4 → 0.0.5
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.
- data/.gitignore +1 -0
- data/Gemfile +6 -0
- data/README.md +4 -1
- data/assets/south_chart.png +0 -0
- data/horoscope.gemspec +4 -1
- data/lib/horoscope.rb +46 -4
- data/lib/horoscope/version.rb +1 -1
- data/spec/horoscope_spec.rb +59 -35
- metadata +35 -2
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
Calculate the accurate horoscope of a person using Vedic Horoscope technique given the birth time and birth place of the subject. The gem is available at https://rubygems.org/gems/horoscope
|
4
4
|
|
5
|
+
[ ](https://travis-ci.org/bragboy/horoscope)
|
5
6
|
[](https://codeclimate.com/github/bragboy/horoscope)
|
6
7
|
|
7
8
|
## Installation
|
@@ -22,11 +23,13 @@ Then you can start using this by passing a Time object along with latitude and l
|
|
22
23
|
|
23
24
|
#To calculate Sachin Tendulkar's horoscope
|
24
25
|
h = Horoscope::Horo.new(
|
25
|
-
:datetime => Time.
|
26
|
+
:datetime => Time.utc(1973, 4, 24, 14, 25),
|
27
|
+
:zone => 5.5,
|
26
28
|
:lat => 18.60, :lon => -72.50)
|
27
29
|
h.compute
|
28
30
|
=> {"As"=>4, "Su"=>0, "Mo"=>8, "Ma"=>9, "Me"=>11, "Ju"=>9, "Ve"=>0, "Sa"=>1, "Ra"=>8, "Ke"=>2}
|
29
31
|
|
32
|
+
h.create_chart #This will generate the horoscope chart to your working directory
|
30
33
|
|
31
34
|
## Contributing
|
32
35
|
|
Binary file
|
data/horoscope.gemspec
CHANGED
@@ -10,8 +10,11 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.email = ["bragboy@gmail.com"]
|
11
11
|
gem.description = %q{Calculate the horoscope of a person given the birth date and time}
|
12
12
|
gem.summary = %q{Calculate the accurate horoscope of a person using Vedic Horoscope technique given the birth time and birth place of the subject.}
|
13
|
-
gem.homepage = ""
|
13
|
+
gem.homepage = "https://github.com/bragboy/horoscope"
|
14
|
+
|
14
15
|
gem.add_development_dependency "rspec"
|
16
|
+
gem.add_development_dependency "debugger"
|
17
|
+
gem.add_dependency "rmagick"
|
15
18
|
|
16
19
|
gem.files = `git ls-files`.split($/)
|
17
20
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
data/lib/horoscope.rb
CHANGED
@@ -1,30 +1,40 @@
|
|
1
1
|
require 'horoscope/version'
|
2
2
|
require 'horoscope/overrides/math_override'
|
3
3
|
require 'horoscope/planet'
|
4
|
+
require 'RMagick'
|
4
5
|
|
5
6
|
module Horoscope
|
6
7
|
class Horo
|
7
8
|
|
8
9
|
PLANETS = ["As", "Su", "Mo", "Ma", "Me", "Ju", "Ve", "Sa", "Ra", "Ke"]
|
9
10
|
|
11
|
+
IMG_SIZE = 440
|
12
|
+
SPLIT = IMG_SIZE/4
|
13
|
+
XBIAS = 10
|
14
|
+
YBIAS = 15
|
15
|
+
PADDING = 15
|
16
|
+
|
10
17
|
ERRORS = {
|
11
18
|
:Date => "Error: Invalid Date. Enter a valid date between years 1600 AD and 2300 AD",
|
19
|
+
:Zone => "Error: Please pass a valid time zone ranging from -12.0 to +12.0",
|
12
20
|
:Lat => "Error: Invalid Latitude. Enter between -90.0 to +90.0",
|
13
21
|
:Lon => "Error: Invalid Longitude. Enter between -180.0 to +180.0"
|
14
22
|
}
|
15
23
|
|
16
|
-
attr_accessor :datetime, :lat, :lon, :errors, :positions
|
24
|
+
attr_accessor :datetime, :zone, :lat, :lon, :errors, :positions, :positions_rev
|
17
25
|
|
18
26
|
def initialize(data={})
|
19
27
|
@data = data
|
20
28
|
|
21
29
|
@errors = []
|
22
30
|
|
31
|
+
@computed = false
|
23
32
|
@datetime = data[:datetime]
|
24
|
-
@zone = data[:
|
33
|
+
@zone = data[:zone]
|
25
34
|
@lat = data[:lat]
|
26
35
|
@lon = data[:lon]
|
27
36
|
@positions = Hash[PLANETS.map {|x| [x, nil]}]
|
37
|
+
@positions_rev = [[], [], [], [], [], [], [], [], [], [], [], []]
|
28
38
|
end
|
29
39
|
|
30
40
|
def compute
|
@@ -34,7 +44,7 @@ module Horoscope
|
|
34
44
|
tsp, pos, spd = [Array.new(10, 0), Array.new(10, 0), Array.new(10, 0)]
|
35
45
|
jd = Planet.get_jul_day(@datetime.month, @datetime.day, @datetime.year)
|
36
46
|
time = @datetime.hour + (@datetime.min / 60.0)
|
37
|
-
time -= @
|
47
|
+
time -= @zone
|
38
48
|
jd += time / 24.0
|
39
49
|
t = (jd - 0.5 - Planet::J2000) / 36525.0
|
40
50
|
Planet.get_planets(t, pos, spd)
|
@@ -49,19 +59,51 @@ module Horoscope
|
|
49
59
|
end
|
50
60
|
tsp[i] = (spd[i] * 3600.0).to_i
|
51
61
|
end
|
62
|
+
count = 0
|
52
63
|
(0..11).each do |i|
|
53
64
|
(0..9).each do |j|
|
54
|
-
|
65
|
+
if (tpos[j] / 1800 == i)
|
66
|
+
@positions[PLANETS[j]] = i
|
67
|
+
@positions_rev[i] << PLANETS[j]
|
68
|
+
end
|
55
69
|
end
|
56
70
|
end
|
71
|
+
@computed = true
|
57
72
|
return @positions
|
58
73
|
end
|
59
74
|
|
75
|
+
def create_chart(options={})
|
76
|
+
self.compute unless @computed
|
77
|
+
base_chart = Magick::ImageList.new('assets/south_chart.png')
|
78
|
+
|
79
|
+
canvas = Magick::ImageList.new
|
80
|
+
canvas.new_image(IMG_SIZE, IMG_SIZE, Magick::TextureFill.new(base_chart))
|
81
|
+
|
82
|
+
draw_x = [XBIAS+SPLIT, XBIAS+SPLIT*2, XBIAS+SPLIT*3, XBIAS+SPLIT*3, XBIAS+SPLIT*3, XBIAS+SPLIT*3, XBIAS+SPLIT*2, XBIAS+SPLIT, XBIAS, XBIAS, XBIAS, XBIAS, XBIAS]
|
83
|
+
draw_y = [YBIAS, YBIAS, YBIAS, YBIAS+SPLIT, YBIAS+SPLIT*2, YBIAS+SPLIT*3, YBIAS+SPLIT*3, YBIAS+SPLIT*3, YBIAS+SPLIT*3, YBIAS+SPLIT*2, YBIAS+SPLIT, YBIAS]
|
84
|
+
|
85
|
+
text = Magick::Draw.new
|
86
|
+
text.pointsize = 14
|
87
|
+
text.font_family = 'helvetica'
|
88
|
+
|
89
|
+
@positions_rev.each_with_index do |this_pos, i|
|
90
|
+
unless this_pos.empty?
|
91
|
+
this_pos.each_with_index do |planet, j|
|
92
|
+
text.annotate(canvas, 0, 0, draw_x[i], draw_y[i] + j * PADDING, planet) {
|
93
|
+
self.fill = planet == PLANETS[0] ? 'red' : 'black'
|
94
|
+
}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
x = canvas.write('output.png')
|
99
|
+
end
|
100
|
+
|
60
101
|
private
|
61
102
|
|
62
103
|
def validate_values
|
63
104
|
@errors = []
|
64
105
|
@errors << ERRORS[:Date] if @datetime.nil? || !@datetime.is_a?(Time) || @datetime.year > 2300 || @datetime.year < 1600
|
106
|
+
@errors << ERRORS[:Zone] if @zone.nil? || @zone > 12.0 || @zone < -12.0
|
65
107
|
@errors << ERRORS[:Lat] if @lat.nil? || @lat > 90.0 || @lat < -90.0
|
66
108
|
@errors << ERRORS[:Lon] if @lon.nil? || @lon > 180.0 || @lon < -180.0
|
67
109
|
@errors
|
data/lib/horoscope/version.rb
CHANGED
data/spec/horoscope_spec.rb
CHANGED
@@ -1,53 +1,77 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'ruby-debug'
|
2
3
|
|
3
4
|
describe Horoscope do
|
4
5
|
it "should error out for blanks" do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
h = Horoscope::Horo.new
|
7
|
+
expect(h.compute).to eql(["Error: Invalid Date. Enter a valid date between years 1600 AD and 2300 AD",
|
8
|
+
"Error: Please pass a valid time zone ranging from -12.0 to +12.0",
|
9
|
+
"Error: Invalid Latitude. Enter between -90.0 to +90.0",
|
10
|
+
"Error: Invalid Longitude. Enter between -180.0 to +180.0"])
|
9
11
|
end
|
10
12
|
|
11
13
|
it "should validate an universal horoscope" do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
#Sachin Tendulkar's Birth Horoscope
|
15
|
+
h = Horoscope::Horo.new(:datetime => Time.utc(1973, 4, 24, 14, 25), :zone => +5.5, :lat => 18.60, :lon => -72.50)
|
16
|
+
h.compute
|
17
|
+
expect(h.errors).to eql([])
|
18
|
+
expect(h.positions).to eql({"As"=>4, "Su"=>0, "Mo"=>8, "Ma"=>9, "Me"=>11, "Ju"=>9, "Ve"=>0, "Sa"=>1, "Ra"=>8, "Ke"=>2})
|
17
19
|
end
|
18
20
|
|
19
21
|
it "should validate all dates" do
|
20
|
-
|
21
|
-
|
22
|
+
h = Horoscope::Horo.new(:datetime => nil, :zone => 0, :lat => 0, :lon => 0)
|
23
|
+
expect(h.compute).to eql(["Error: Invalid Date. Enter a valid date between years 1600 AD and 2300 AD"])
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
+
h.datetime = Time.mktime(1599)
|
26
|
+
expect(h.compute).to eql(["Error: Invalid Date. Enter a valid date between years 1600 AD and 2300 AD"])
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
h.datetime = Time.mktime(2301)
|
29
|
+
expect(h.compute).to eql(["Error: Invalid Date. Enter a valid date between years 1600 AD and 2300 AD"])
|
30
|
+
|
31
|
+
h.datetime = Time.mktime(2013)
|
30
32
|
h.compute
|
31
|
-
|
33
|
+
expect(h.errors).to eql([])
|
32
34
|
end
|
33
35
|
|
34
36
|
it "should validate lat and lon" do
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
37
|
+
h = Horoscope::Horo.new(:datetime => Time.now, :zone => 0)
|
38
|
+
expect(h.compute).to eql(["Error: Invalid Latitude. Enter between -90.0 to +90.0",
|
39
|
+
"Error: Invalid Longitude. Enter between -180.0 to +180.0"])
|
40
|
+
|
41
|
+
h.lat = +90.1
|
42
|
+
h.lon = +180.1
|
43
|
+
expect(h.compute).to eql(["Error: Invalid Latitude. Enter between -90.0 to +90.0",
|
44
|
+
"Error: Invalid Longitude. Enter between -180.0 to +180.0"])
|
45
|
+
|
46
|
+
h.lat = -90.1
|
47
|
+
h.lon = -180.1
|
48
|
+
expect(h.compute).to eql(["Error: Invalid Latitude. Enter between -90.0 to +90.0",
|
49
|
+
"Error: Invalid Longitude. Enter between -180.0 to +180.0"])
|
50
|
+
|
51
|
+
h.lat = h.lon = 0
|
52
|
+
h.compute
|
53
|
+
expect(h.errors).to eql([])
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should validate time zone" do
|
57
|
+
h = Horoscope::Horo.new(:datetime => Time.now, :lat => 18.60, :lon => -72.50)
|
58
|
+
expect(h.compute).to eql(["Error: Please pass a valid time zone ranging from -12.0 to +12.0"])
|
59
|
+
|
60
|
+
h.zone = -12.1
|
61
|
+
expect(h.compute).to eql(["Error: Please pass a valid time zone ranging from -12.0 to +12.0"])
|
62
|
+
|
63
|
+
h.zone = 12.1
|
64
|
+
expect(h.compute).to eql(["Error: Please pass a valid time zone ranging from -12.0 to +12.0"])
|
65
|
+
|
66
|
+
h.zone = 5.5
|
67
|
+
h.compute
|
68
|
+
expect(h.errors).to eql([])
|
69
|
+
end
|
70
|
+
|
71
|
+
it "can generate chart" do
|
72
|
+
h = Horoscope::Horo.new(:datetime => Time.mktime(1973, 4, 24, 14, 25).getlocal("+05:30"), :lat => 18.60, :lon => -72.50)
|
73
|
+
h.compute
|
74
|
+
h.create_chart
|
75
|
+
expect(File).to exist("output.png")
|
52
76
|
end
|
53
77
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: horoscope
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -27,6 +27,38 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: debugger
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rmagick
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
30
62
|
description: Calculate the horoscope of a person given the birth date and time
|
31
63
|
email:
|
32
64
|
- bragboy@gmail.com
|
@@ -41,6 +73,7 @@ files:
|
|
41
73
|
- LICENSE.txt
|
42
74
|
- README.md
|
43
75
|
- Rakefile
|
76
|
+
- assets/south_chart.png
|
44
77
|
- horoscope.gemspec
|
45
78
|
- lib/horoscope.rb
|
46
79
|
- lib/horoscope/overrides/math_override.rb
|
@@ -56,7 +89,7 @@ files:
|
|
56
89
|
- lib/horoscope/version.rb
|
57
90
|
- spec/horoscope_spec.rb
|
58
91
|
- spec/spec_helper.rb
|
59
|
-
homepage:
|
92
|
+
homepage: https://github.com/bragboy/horoscope
|
60
93
|
licenses: []
|
61
94
|
post_install_message:
|
62
95
|
rdoc_options: []
|