astroapi-ruby 1.0.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 +7 -0
- data/lib/astroapi/categories/analysis.rb +219 -0
- data/lib/astroapi/categories/astrocartography.rb +119 -0
- data/lib/astroapi/categories/base_category.rb +30 -0
- data/lib/astroapi/categories/charts.rb +119 -0
- data/lib/astroapi/categories/chinese.rb +72 -0
- data/lib/astroapi/categories/data.rb +100 -0
- data/lib/astroapi/categories/eclipses.rb +40 -0
- data/lib/astroapi/categories/enhanced.rb +53 -0
- data/lib/astroapi/categories/fengshui.rb +44 -0
- data/lib/astroapi/categories/fixed_stars.rb +47 -0
- data/lib/astroapi/categories/glossary.rb +114 -0
- data/lib/astroapi/categories/horary.rb +58 -0
- data/lib/astroapi/categories/horoscope.rb +144 -0
- data/lib/astroapi/categories/human_design.rb +77 -0
- data/lib/astroapi/categories/insights/business.rb +62 -0
- data/lib/astroapi/categories/insights/financial.rb +62 -0
- data/lib/astroapi/categories/insights/pet.rb +53 -0
- data/lib/astroapi/categories/insights/relationship.rb +67 -0
- data/lib/astroapi/categories/insights/wellness.rb +67 -0
- data/lib/astroapi/categories/insights.rb +41 -0
- data/lib/astroapi/categories/kabbalah.rb +69 -0
- data/lib/astroapi/categories/lunar.rb +51 -0
- data/lib/astroapi/categories/numerology.rb +37 -0
- data/lib/astroapi/categories/palmistry.rb +44 -0
- data/lib/astroapi/categories/pdf.rb +47 -0
- data/lib/astroapi/categories/render.rb +47 -0
- data/lib/astroapi/categories/svg.rb +48 -0
- data/lib/astroapi/categories/tarot.rb +156 -0
- data/lib/astroapi/categories/traditional.rb +93 -0
- data/lib/astroapi/categories/vedic.rb +190 -0
- data/lib/astroapi/categories/ziwei.rb +25 -0
- data/lib/astroapi/client.rb +103 -0
- data/lib/astroapi/configuration.rb +44 -0
- data/lib/astroapi/error.rb +74 -0
- data/lib/astroapi/http/client.rb +108 -0
- data/lib/astroapi/http/middleware/authentication.rb +22 -0
- data/lib/astroapi/http/middleware/logger.rb +43 -0
- data/lib/astroapi/http/middleware/response_unwrapper.rb +25 -0
- data/lib/astroapi/validators/base_validator.rb +72 -0
- data/lib/astroapi/validators/subject_validator.rb +87 -0
- data/lib/astroapi/version.rb +5 -0
- data/lib/astroapi.rb +18 -0
- metadata +218 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'base_category'
|
|
4
|
+
require_relative '../validators/subject_validator'
|
|
5
|
+
|
|
6
|
+
module Astroapi
|
|
7
|
+
module Categories
|
|
8
|
+
# Tarot category client for tarot readings and analysis
|
|
9
|
+
class Tarot < BaseCategory
|
|
10
|
+
# Get cards glossary
|
|
11
|
+
# @param params [Hash] Query parameters
|
|
12
|
+
# @return [Hash] 78 cards reference
|
|
13
|
+
def get_cards_glossary(params = {})
|
|
14
|
+
http.get(build_url('glossary', 'cards'), params: params)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Get spreads glossary
|
|
18
|
+
# @param params [Hash] Query parameters
|
|
19
|
+
# @return [Hash] Spread types
|
|
20
|
+
def get_spreads_glossary(params = {})
|
|
21
|
+
http.get(build_url('glossary', 'spreads'), params: params)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Get card details
|
|
25
|
+
# @param card_id [String] Card ID
|
|
26
|
+
# @return [Hash] Card details
|
|
27
|
+
def get_card_details(card_id)
|
|
28
|
+
http.get(build_url('glossary', 'cards', card_id))
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Draw cards
|
|
32
|
+
# @param request [Hash] Number of cards and options
|
|
33
|
+
# @return [Hash] Random card draw
|
|
34
|
+
def draw_cards(request)
|
|
35
|
+
http.post(build_url('cards', 'draw'), body: request)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Search cards
|
|
39
|
+
# @param params [Hash] Search keywords
|
|
40
|
+
# @return [Hash] Matching cards
|
|
41
|
+
def search_cards(params = {})
|
|
42
|
+
http.get(build_url('cards', 'search'), params: params)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Get daily card
|
|
46
|
+
# @param params [Hash] Query parameters
|
|
47
|
+
# @return [Hash] Daily card
|
|
48
|
+
def get_daily_card(params = {})
|
|
49
|
+
http.get(build_url('cards', 'daily'), params: params)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Generate single card report
|
|
53
|
+
# @param request [Hash] Card and question
|
|
54
|
+
# @return [Hash] Single card reading
|
|
55
|
+
def generate_single_report(request)
|
|
56
|
+
http.post(build_url('reports', 'single'), body: request)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Generate three card report
|
|
60
|
+
# @param request [Hash] Three cards
|
|
61
|
+
# @return [Hash] Past/present/future reading
|
|
62
|
+
def generate_three_card_report(request)
|
|
63
|
+
http.post(build_url('reports', 'three-card'), body: request)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Generate Celtic Cross report
|
|
67
|
+
# @param request [Hash] Ten cards
|
|
68
|
+
# @return [Hash] 10-card spread
|
|
69
|
+
def generate_celtic_cross_report(request)
|
|
70
|
+
http.post(build_url('reports', 'celtic-cross'), body: request)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Generate synastry report
|
|
74
|
+
# @param request [Hash] Cards and two subjects
|
|
75
|
+
# @return [Hash] Relationship reading
|
|
76
|
+
def generate_synastry_report(request)
|
|
77
|
+
http.post(build_url('reports', 'synastry'), body: request)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Generate houses report
|
|
81
|
+
# @param request [Hash] Cards for 12 houses
|
|
82
|
+
# @return [Hash] 12-house spread
|
|
83
|
+
def generate_houses_report(request)
|
|
84
|
+
http.post(build_url('reports', 'houses'), body: request)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Generate Tree of Life report
|
|
88
|
+
# @param request [Hash] Cards for Kabbalah spread
|
|
89
|
+
# @return [Hash] Tree of Life spread
|
|
90
|
+
def generate_tree_of_life_report(request)
|
|
91
|
+
http.post(build_url('reports', 'tree-of-life'), body: request)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Calculate quintessence
|
|
95
|
+
# @param request [Hash] Cards for synthesis
|
|
96
|
+
# @return [Hash] Synthesis card
|
|
97
|
+
def calculate_quintessence(request)
|
|
98
|
+
http.post(build_url('analysis', 'quintessence'), body: request)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Calculate birth cards
|
|
102
|
+
# @param request [Hash] Birth date
|
|
103
|
+
# @return [Hash] Personality/soul cards
|
|
104
|
+
def calculate_birth_cards(request)
|
|
105
|
+
http.post(build_url('analysis', 'birth-cards'), body: request)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Calculate elemental dignities
|
|
109
|
+
# @param request [Hash] Cards for analysis
|
|
110
|
+
# @return [Hash] Elemental interactions
|
|
111
|
+
def calculate_elemental_dignities(request)
|
|
112
|
+
http.post(build_url('analysis', 'dignities'), body: request)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Analyze timing
|
|
116
|
+
# @param request [Hash] Cards and question
|
|
117
|
+
# @return [Hash] Timing implications
|
|
118
|
+
def analyze_timing(request)
|
|
119
|
+
http.post(build_url('analysis', 'timing'), body: request)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Calculate optimal times
|
|
123
|
+
# @param request [Hash] Cards and date range
|
|
124
|
+
# @return [Hash] Best timing windows
|
|
125
|
+
def calculate_optimal_times(request)
|
|
126
|
+
http.post(build_url('analysis', 'optimal-times'), body: request)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Generate transit report
|
|
130
|
+
# @param request [Hash] Birth data and cards
|
|
131
|
+
# @return [Hash] Astro-tarot transit
|
|
132
|
+
def generate_transit_report(request)
|
|
133
|
+
if request[:subject] || request['subject']
|
|
134
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
135
|
+
end
|
|
136
|
+
http.post(build_url('analysis', 'transit-report'), body: request)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Generate natal report
|
|
140
|
+
# @param request [Hash] Birth data and cards
|
|
141
|
+
# @return [Hash] Astro-tarot natal
|
|
142
|
+
def generate_natal_report(request)
|
|
143
|
+
if request[:subject] || request['subject']
|
|
144
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
145
|
+
end
|
|
146
|
+
http.post(build_url('analysis', 'natal-report'), body: request)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
protected
|
|
150
|
+
|
|
151
|
+
def api_prefix
|
|
152
|
+
'/api/v3/tarot'
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'base_category'
|
|
4
|
+
require_relative '../validators/subject_validator'
|
|
5
|
+
|
|
6
|
+
module Astroapi
|
|
7
|
+
module Categories
|
|
8
|
+
# Traditional astrology category client
|
|
9
|
+
class Traditional < BaseCategory
|
|
10
|
+
# Get traditional analysis
|
|
11
|
+
# @param request [Hash] Subject birth data
|
|
12
|
+
# @return [Hash] Comprehensive traditional analysis
|
|
13
|
+
def get_analysis(request)
|
|
14
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
15
|
+
http.post(build_url('analysis'), body: request)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Get dignities analysis
|
|
19
|
+
# @param request [Hash] Subject birth data
|
|
20
|
+
# @return [Hash] Essential dignities
|
|
21
|
+
def get_dignities_analysis(request)
|
|
22
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
23
|
+
http.post(build_url('dignities'), body: request)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Get lots analysis
|
|
27
|
+
# @param request [Hash] Subject birth data
|
|
28
|
+
# @return [Hash] Arabic/Hellenistic lots
|
|
29
|
+
def get_lots_analysis(request)
|
|
30
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
31
|
+
http.post(build_url('lots'), body: request)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Get profections analysis
|
|
35
|
+
# @param request [Hash] Subject birth data
|
|
36
|
+
# @return [Hash] Profections analysis
|
|
37
|
+
def get_profections_analysis(request)
|
|
38
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
39
|
+
http.post(build_url('profections'), body: request)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Get annual profection
|
|
43
|
+
# @param request [Hash] Subject and specific year
|
|
44
|
+
# @return [Hash] Profection for year
|
|
45
|
+
def get_annual_profection(request)
|
|
46
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
47
|
+
http.post(build_url('analysis', 'annual-profection'), body: request)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Get profection timeline
|
|
51
|
+
# @param request [Hash] Subject and year range
|
|
52
|
+
# @return [Hash] Multi-year timeline
|
|
53
|
+
def get_profection_timeline(request)
|
|
54
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
55
|
+
http.post(build_url('analysis', 'profection-timeline'), body: request)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Get traditional points glossary
|
|
59
|
+
# @param params [Hash] Query parameters
|
|
60
|
+
# @return [Hash] Traditional points reference
|
|
61
|
+
def get_traditional_points_glossary(params = {})
|
|
62
|
+
http.get(build_url('glossary', 'traditional-points'), params: params)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Get dignities glossary
|
|
66
|
+
# @param params [Hash] Query parameters
|
|
67
|
+
# @return [Hash] Dignities reference
|
|
68
|
+
def get_dignities_glossary(params = {})
|
|
69
|
+
http.get(build_url('glossary', 'dignities'), params: params)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Get profection houses glossary
|
|
73
|
+
# @param params [Hash] Query parameters
|
|
74
|
+
# @return [Hash] Profection houses reference
|
|
75
|
+
def get_profection_houses_glossary(params = {})
|
|
76
|
+
http.get(build_url('glossary', 'profection-houses'), params: params)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Get capabilities
|
|
80
|
+
# @param params [Hash] Query parameters
|
|
81
|
+
# @return [Hash] Available features
|
|
82
|
+
def get_capabilities(params = {})
|
|
83
|
+
http.get(build_url('capabilities'), params: params)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
protected
|
|
87
|
+
|
|
88
|
+
def api_prefix
|
|
89
|
+
'/api/v3/traditional'
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'base_category'
|
|
4
|
+
require_relative '../validators/subject_validator'
|
|
5
|
+
|
|
6
|
+
module Astroapi
|
|
7
|
+
module Categories
|
|
8
|
+
# Vedic astrology category client
|
|
9
|
+
class Vedic < BaseCategory
|
|
10
|
+
# Get Vedic birth details
|
|
11
|
+
# @param request [Hash] Subject birth data
|
|
12
|
+
# @return [Hash] Vedic birth details
|
|
13
|
+
def get_birth_details(request)
|
|
14
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
15
|
+
http.post(build_url('birth-details'), body: request)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Generate Vedic chart SVG
|
|
19
|
+
# @param request [Hash] Subject birth data and options
|
|
20
|
+
# @return [Hash] Vedic chart SVG
|
|
21
|
+
def get_chart(request)
|
|
22
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
23
|
+
http.post(build_url('chart'), body: request)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Render Vedic chart in specified format
|
|
27
|
+
# @param format [String] Output format (png, svg, etc.)
|
|
28
|
+
# @param request [Hash] Subject birth data and options
|
|
29
|
+
# @return [Hash] Rendered chart
|
|
30
|
+
def render_chart(format, request)
|
|
31
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
32
|
+
http.post(build_url('chart', 'render', format), body: request)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Get divisional charts
|
|
36
|
+
# @param request [Hash] Subject birth data
|
|
37
|
+
# @return [Hash] Divisional chart data
|
|
38
|
+
def get_divisional_chart(request)
|
|
39
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
40
|
+
http.post(build_url('divisional-chart'), body: request)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Get Panchang
|
|
44
|
+
# @param request [Hash] Date and location
|
|
45
|
+
# @return [Hash] Daily Panchang
|
|
46
|
+
def get_panchang(request)
|
|
47
|
+
http.post(build_url('panchang'), body: request)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Get regional Panchang
|
|
51
|
+
# @param request [Hash] Date, location, and region
|
|
52
|
+
# @return [Hash] Regional Panchang
|
|
53
|
+
def get_regional_panchang(request)
|
|
54
|
+
http.post(build_url('regional-panchang'), body: request)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Calculate Ashtakvarga
|
|
58
|
+
# @param request [Hash] Subject birth data
|
|
59
|
+
# @return [Hash] Ashtakvarga strength analysis
|
|
60
|
+
def calculate_ashtakvarga(request)
|
|
61
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
62
|
+
http.post(build_url('ashtakvarga'), body: request)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Calculate Shadbala
|
|
66
|
+
# @param request [Hash] Subject birth data
|
|
67
|
+
# @return [Hash] Six-fold strength analysis
|
|
68
|
+
def calculate_shadbala(request)
|
|
69
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
70
|
+
http.post(build_url('shadbala'), body: request)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Get Vimshottari Dasha
|
|
74
|
+
# @param request [Hash] Subject birth data
|
|
75
|
+
# @return [Hash] Dasha periods
|
|
76
|
+
def get_vimshottari_dasha(request)
|
|
77
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
78
|
+
http.post(build_url('vimshottari-dasha'), body: request)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Get Yogini Dasha
|
|
82
|
+
# @param request [Hash] Subject birth data
|
|
83
|
+
# @return [Hash] Yogini Dasha periods
|
|
84
|
+
def get_yogini_dasha(request)
|
|
85
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
86
|
+
http.post(build_url('yogini-dasha'), body: request)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Calculate Chara Dasha
|
|
90
|
+
# @param request [Hash] Subject birth data
|
|
91
|
+
# @return [Hash] Chara Dasha periods
|
|
92
|
+
def calculate_chara_dasha(request)
|
|
93
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
94
|
+
http.post(build_url('chara-dasha'), body: request)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Analyze yogas
|
|
98
|
+
# @param request [Hash] Subject birth data
|
|
99
|
+
# @return [Hash] Yoga analysis
|
|
100
|
+
def analyze_yogas(request)
|
|
101
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
102
|
+
http.post(build_url('yoga-analysis'), body: request)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Get Nakshatra predictions
|
|
106
|
+
# @param request [Hash] Subject birth data
|
|
107
|
+
# @return [Hash] Nakshatra predictions
|
|
108
|
+
def get_nakshatra_predictions(request)
|
|
109
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
110
|
+
http.post(build_url('nakshatra-predictions'), body: request)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Get Manglik Dosha
|
|
114
|
+
# @param request [Hash] Subject birth data
|
|
115
|
+
# @return [Hash] Manglik analysis
|
|
116
|
+
def get_manglik_dosha(request)
|
|
117
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
118
|
+
http.post(build_url('manglik-dosha'), body: request)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Get Kaal Sarpa Dosha
|
|
122
|
+
# @param request [Hash] Subject birth data
|
|
123
|
+
# @return [Hash] Kaal Sarpa analysis
|
|
124
|
+
def get_kaal_sarpa_dosha(request)
|
|
125
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
126
|
+
http.post(build_url('kaal-sarpa-dosha'), body: request)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Get Sade Sati
|
|
130
|
+
# @param request [Hash] Subject birth data
|
|
131
|
+
# @return [Hash] Sade Sati analysis
|
|
132
|
+
def get_sade_sati(request)
|
|
133
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
134
|
+
http.post(build_url('sade-sati'), body: request)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Get Kundli matching
|
|
138
|
+
# @param request [Hash] Two subjects' birth data
|
|
139
|
+
# @return [Hash] Kundli matching results
|
|
140
|
+
def get_kundli_matching(request)
|
|
141
|
+
http.post(build_url('kundli-matching'), body: request)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Get Vedic transit
|
|
145
|
+
# @param request [Hash] Subject and transit date
|
|
146
|
+
# @return [Hash] Vedic transit data
|
|
147
|
+
def get_transit(request)
|
|
148
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
149
|
+
http.post(build_url('transit'), body: request)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Calculate Varshaphal
|
|
153
|
+
# @param request [Hash] Subject and year
|
|
154
|
+
# @return [Hash] Annual horoscope
|
|
155
|
+
def calculate_varshaphal(request)
|
|
156
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
157
|
+
http.post(build_url('varshaphal'), body: request)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Get remedies
|
|
161
|
+
# @param request [Hash] Subject birth data
|
|
162
|
+
# @return [Hash] Suggested remedies
|
|
163
|
+
def get_remedies(request)
|
|
164
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
165
|
+
http.post(build_url('remedies'), body: request)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Get festival calendar
|
|
169
|
+
# @param request [Hash] Date range and location
|
|
170
|
+
# @return [Hash] Hindu festival calendar
|
|
171
|
+
def get_festival_calendar(request)
|
|
172
|
+
http.post(build_url('festival-calendar'), body: request)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Calculate KP system
|
|
176
|
+
# @param request [Hash] Subject birth data
|
|
177
|
+
# @return [Hash] KP system analysis
|
|
178
|
+
def calculate_kp_system(request)
|
|
179
|
+
Validators::SubjectValidator.validate!(request[:subject] || request['subject'])
|
|
180
|
+
http.post(build_url('kp-system'), body: request)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
protected
|
|
184
|
+
|
|
185
|
+
def api_prefix
|
|
186
|
+
'/api/v3/vedic'
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'base_category'
|
|
4
|
+
require_relative '../validators/subject_validator'
|
|
5
|
+
|
|
6
|
+
module Astroapi
|
|
7
|
+
module Categories
|
|
8
|
+
# Zi Wei Dou Shu (Purple Star) category client
|
|
9
|
+
class Ziwei < BaseCategory
|
|
10
|
+
# Calculate Zi Wei chart
|
|
11
|
+
# @param request [Hash] Subject birth data
|
|
12
|
+
# @return [Hash] Zi Wei Dou Shu chart
|
|
13
|
+
def calculate_chart(request)
|
|
14
|
+
Validators::SubjectValidator.validate!(request)
|
|
15
|
+
http.post(build_url('chart'), body: request)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
protected
|
|
19
|
+
|
|
20
|
+
def api_prefix
|
|
21
|
+
'/api/v3/ziwei'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'configuration'
|
|
4
|
+
require_relative 'http/client'
|
|
5
|
+
require_relative 'categories/data'
|
|
6
|
+
require_relative 'categories/charts'
|
|
7
|
+
require_relative 'categories/horoscope'
|
|
8
|
+
require_relative 'categories/analysis'
|
|
9
|
+
require_relative 'categories/glossary'
|
|
10
|
+
require_relative 'categories/astrocartography'
|
|
11
|
+
require_relative 'categories/chinese'
|
|
12
|
+
require_relative 'categories/eclipses'
|
|
13
|
+
require_relative 'categories/lunar'
|
|
14
|
+
require_relative 'categories/numerology'
|
|
15
|
+
require_relative 'categories/tarot'
|
|
16
|
+
require_relative 'categories/traditional'
|
|
17
|
+
require_relative 'categories/fixed_stars'
|
|
18
|
+
require_relative 'categories/insights'
|
|
19
|
+
require_relative 'categories/svg'
|
|
20
|
+
require_relative 'categories/enhanced'
|
|
21
|
+
require_relative 'categories/vedic'
|
|
22
|
+
require_relative 'categories/human_design'
|
|
23
|
+
require_relative 'categories/kabbalah'
|
|
24
|
+
require_relative 'categories/horary'
|
|
25
|
+
require_relative 'categories/fengshui'
|
|
26
|
+
require_relative 'categories/palmistry'
|
|
27
|
+
require_relative 'categories/pdf'
|
|
28
|
+
require_relative 'categories/render'
|
|
29
|
+
require_relative 'categories/ziwei'
|
|
30
|
+
|
|
31
|
+
module Astroapi
|
|
32
|
+
# Main client for the Astrology API
|
|
33
|
+
#
|
|
34
|
+
# @example Initialize with API key
|
|
35
|
+
# client = Astroapi::Client.new(api_key: 'your-api-key')
|
|
36
|
+
#
|
|
37
|
+
# @example Initialize with configuration block
|
|
38
|
+
# client = Astroapi::Client.new do |config|
|
|
39
|
+
# config.api_key = 'your-api-key'
|
|
40
|
+
# config.timeout = 15
|
|
41
|
+
# config.debug = true
|
|
42
|
+
# end
|
|
43
|
+
#
|
|
44
|
+
# @example Use environment variables
|
|
45
|
+
# ENV['ASTROLOGY_API_KEY'] = 'your-api-key'
|
|
46
|
+
# client = Astroapi::Client.new
|
|
47
|
+
class Client
|
|
48
|
+
attr_reader :data, :charts, :horoscope, :analysis, :glossary,
|
|
49
|
+
:astrocartography, :chinese, :eclipses, :lunar, :numerology,
|
|
50
|
+
:tarot, :traditional, :fixed_stars, :insights, :svg, :enhanced,
|
|
51
|
+
:vedic, :human_design, :kabbalah, :horary, :fengshui,
|
|
52
|
+
:palmistry, :pdf, :render, :ziwei,
|
|
53
|
+
:config
|
|
54
|
+
|
|
55
|
+
# Initialize a new client
|
|
56
|
+
# @param options [Hash] Configuration options
|
|
57
|
+
# @option options [String] :api_key API key for authentication
|
|
58
|
+
# @option options [String] :base_url Base URL for the API
|
|
59
|
+
# @option options [Integer] :timeout Request timeout in seconds
|
|
60
|
+
# @option options [Boolean] :debug Enable debug logging
|
|
61
|
+
# @yield [config] Configuration block
|
|
62
|
+
# @yieldparam config [Configuration] Configuration object
|
|
63
|
+
def initialize(options = {})
|
|
64
|
+
@config = Configuration.new
|
|
65
|
+
|
|
66
|
+
if block_given?
|
|
67
|
+
yield @config
|
|
68
|
+
else
|
|
69
|
+
options.each do |key, value|
|
|
70
|
+
@config.public_send(:"#{key}=", value) if @config.respond_to?(:"#{key}=")
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
@http_client = HTTP::Client.new(@config)
|
|
75
|
+
|
|
76
|
+
@data = Categories::Data.new(@http_client)
|
|
77
|
+
@charts = Categories::Charts.new(@http_client)
|
|
78
|
+
@horoscope = Categories::Horoscope.new(@http_client)
|
|
79
|
+
@analysis = Categories::Analysis.new(@http_client)
|
|
80
|
+
@glossary = Categories::Glossary.new(@http_client)
|
|
81
|
+
@astrocartography = Categories::Astrocartography.new(@http_client)
|
|
82
|
+
@chinese = Categories::Chinese.new(@http_client)
|
|
83
|
+
@eclipses = Categories::Eclipses.new(@http_client)
|
|
84
|
+
@lunar = Categories::Lunar.new(@http_client)
|
|
85
|
+
@numerology = Categories::Numerology.new(@http_client)
|
|
86
|
+
@tarot = Categories::Tarot.new(@http_client)
|
|
87
|
+
@traditional = Categories::Traditional.new(@http_client)
|
|
88
|
+
@fixed_stars = Categories::FixedStars.new(@http_client)
|
|
89
|
+
@insights = Categories::InsightsCategory.new(@http_client)
|
|
90
|
+
@svg = Categories::Svg.new(@http_client)
|
|
91
|
+
@enhanced = Categories::Enhanced.new(@http_client)
|
|
92
|
+
@vedic = Categories::Vedic.new(@http_client)
|
|
93
|
+
@human_design = Categories::HumanDesign.new(@http_client)
|
|
94
|
+
@kabbalah = Categories::Kabbalah.new(@http_client)
|
|
95
|
+
@horary = Categories::Horary.new(@http_client)
|
|
96
|
+
@fengshui = Categories::Fengshui.new(@http_client)
|
|
97
|
+
@palmistry = Categories::Palmistry.new(@http_client)
|
|
98
|
+
@pdf = Categories::Pdf.new(@http_client)
|
|
99
|
+
@render = Categories::Render.new(@http_client)
|
|
100
|
+
@ziwei = Categories::Ziwei.new(@http_client)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'logger'
|
|
4
|
+
|
|
5
|
+
module Astroapi
|
|
6
|
+
# Configuration for the Astroapi client
|
|
7
|
+
class Configuration
|
|
8
|
+
DEFAULT_BASE_URL = 'https://api.astrology-api.io'
|
|
9
|
+
DEFAULT_TIMEOUT = 10
|
|
10
|
+
DEFAULT_RETRY_STATUS_CODES = [408, 425, 429, 500, 502, 503, 504].freeze
|
|
11
|
+
|
|
12
|
+
attr_accessor :api_key, :base_url, :timeout, :debug, :logger
|
|
13
|
+
attr_reader :retry
|
|
14
|
+
|
|
15
|
+
def initialize
|
|
16
|
+
@api_key = ENV.fetch('ASTROLOGY_API_KEY', nil)
|
|
17
|
+
@base_url = ENV.fetch('ASTROLOGY_API_BASE_URL', DEFAULT_BASE_URL)
|
|
18
|
+
@timeout = DEFAULT_TIMEOUT
|
|
19
|
+
@debug = parse_boolean(ENV.fetch('ASTROLOGY_DEBUG', nil))
|
|
20
|
+
@logger = Logger.new($stdout)
|
|
21
|
+
@logger.level = Logger::INFO
|
|
22
|
+
@retry = RetryConfig.new
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Retry configuration
|
|
26
|
+
class RetryConfig
|
|
27
|
+
attr_accessor :attempts, :delay_ms, :retry_status_codes
|
|
28
|
+
|
|
29
|
+
def initialize
|
|
30
|
+
@attempts = 0
|
|
31
|
+
@delay_ms = 250
|
|
32
|
+
@retry_status_codes = DEFAULT_RETRY_STATUS_CODES.dup
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def parse_boolean(value)
|
|
39
|
+
return false if value.nil? || value.empty?
|
|
40
|
+
|
|
41
|
+
%w[true 1 yes on].include?(value.to_s.downcase)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Astroapi
|
|
4
|
+
# Base error class for all Astroapi errors
|
|
5
|
+
class Error < StandardError
|
|
6
|
+
attr_reader :status_code, :code, :details, :response
|
|
7
|
+
|
|
8
|
+
def initialize(message, status_code: nil, code: nil, details: nil, response: nil)
|
|
9
|
+
super(message)
|
|
10
|
+
@status_code = status_code
|
|
11
|
+
@code = code
|
|
12
|
+
@details = details
|
|
13
|
+
@response = response
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Check if error is a client error (4xx)
|
|
17
|
+
# @return [Boolean]
|
|
18
|
+
def client_error?
|
|
19
|
+
return false unless status_code
|
|
20
|
+
|
|
21
|
+
status_code >= 400 && status_code < 500
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Check if error is a server error (5xx)
|
|
25
|
+
# @return [Boolean]
|
|
26
|
+
def server_error?
|
|
27
|
+
return false unless status_code
|
|
28
|
+
|
|
29
|
+
status_code >= 500 && status_code < 600
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Convert a Faraday error to an Astroapi error
|
|
33
|
+
# @param error [Faraday::Error] The Faraday error
|
|
34
|
+
# @return [Astroapi::Error] Normalized error
|
|
35
|
+
def self.from_faraday_error(error)
|
|
36
|
+
case error
|
|
37
|
+
when Faraday::TimeoutError
|
|
38
|
+
TimeoutError.new(error.message, details: error)
|
|
39
|
+
when Faraday::ConnectionFailed
|
|
40
|
+
ConnectionError.new(error.message, details: error)
|
|
41
|
+
when Faraday::ServerError
|
|
42
|
+
status = error.response&.dig(:status)
|
|
43
|
+
body = error.response&.dig(:body)
|
|
44
|
+
ServerError.new(error.message, status_code: status, response: body, details: error)
|
|
45
|
+
when Faraday::ClientError
|
|
46
|
+
status = error.response&.dig(:status)
|
|
47
|
+
body = error.response&.dig(:body)
|
|
48
|
+
ClientError.new(error.message, status_code: status, response: body, details: error)
|
|
49
|
+
else
|
|
50
|
+
status = error.respond_to?(:response) ? error.response&.dig(:status) : nil
|
|
51
|
+
body = error.respond_to?(:response) ? error.response&.dig(:body) : nil
|
|
52
|
+
new(error.message, status_code: status, response: body, details: error)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Client error (4xx)
|
|
58
|
+
class ClientError < Error; end
|
|
59
|
+
|
|
60
|
+
# Server error (5xx)
|
|
61
|
+
class ServerError < Error; end
|
|
62
|
+
|
|
63
|
+
# Timeout error
|
|
64
|
+
class TimeoutError < Error; end
|
|
65
|
+
|
|
66
|
+
# Connection error
|
|
67
|
+
class ConnectionError < Error; end
|
|
68
|
+
|
|
69
|
+
# Validation error
|
|
70
|
+
class ValidationError < Error; end
|
|
71
|
+
|
|
72
|
+
# Configuration error
|
|
73
|
+
class ConfigurationError < Error; end
|
|
74
|
+
end
|