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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/lib/astroapi/categories/analysis.rb +219 -0
  3. data/lib/astroapi/categories/astrocartography.rb +119 -0
  4. data/lib/astroapi/categories/base_category.rb +30 -0
  5. data/lib/astroapi/categories/charts.rb +119 -0
  6. data/lib/astroapi/categories/chinese.rb +72 -0
  7. data/lib/astroapi/categories/data.rb +100 -0
  8. data/lib/astroapi/categories/eclipses.rb +40 -0
  9. data/lib/astroapi/categories/enhanced.rb +53 -0
  10. data/lib/astroapi/categories/fengshui.rb +44 -0
  11. data/lib/astroapi/categories/fixed_stars.rb +47 -0
  12. data/lib/astroapi/categories/glossary.rb +114 -0
  13. data/lib/astroapi/categories/horary.rb +58 -0
  14. data/lib/astroapi/categories/horoscope.rb +144 -0
  15. data/lib/astroapi/categories/human_design.rb +77 -0
  16. data/lib/astroapi/categories/insights/business.rb +62 -0
  17. data/lib/astroapi/categories/insights/financial.rb +62 -0
  18. data/lib/astroapi/categories/insights/pet.rb +53 -0
  19. data/lib/astroapi/categories/insights/relationship.rb +67 -0
  20. data/lib/astroapi/categories/insights/wellness.rb +67 -0
  21. data/lib/astroapi/categories/insights.rb +41 -0
  22. data/lib/astroapi/categories/kabbalah.rb +69 -0
  23. data/lib/astroapi/categories/lunar.rb +51 -0
  24. data/lib/astroapi/categories/numerology.rb +37 -0
  25. data/lib/astroapi/categories/palmistry.rb +44 -0
  26. data/lib/astroapi/categories/pdf.rb +47 -0
  27. data/lib/astroapi/categories/render.rb +47 -0
  28. data/lib/astroapi/categories/svg.rb +48 -0
  29. data/lib/astroapi/categories/tarot.rb +156 -0
  30. data/lib/astroapi/categories/traditional.rb +93 -0
  31. data/lib/astroapi/categories/vedic.rb +190 -0
  32. data/lib/astroapi/categories/ziwei.rb +25 -0
  33. data/lib/astroapi/client.rb +103 -0
  34. data/lib/astroapi/configuration.rb +44 -0
  35. data/lib/astroapi/error.rb +74 -0
  36. data/lib/astroapi/http/client.rb +108 -0
  37. data/lib/astroapi/http/middleware/authentication.rb +22 -0
  38. data/lib/astroapi/http/middleware/logger.rb +43 -0
  39. data/lib/astroapi/http/middleware/response_unwrapper.rb +25 -0
  40. data/lib/astroapi/validators/base_validator.rb +72 -0
  41. data/lib/astroapi/validators/subject_validator.rb +87 -0
  42. data/lib/astroapi/version.rb +5 -0
  43. data/lib/astroapi.rb +18 -0
  44. 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