brave_search 0.1.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 (81) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +27 -0
  3. data/README.md +179 -0
  4. data/Rakefile +8 -0
  5. data/brave_search.gemspec +41 -0
  6. data/dummy_app/.dockerignore +45 -0
  7. data/dummy_app/.github/dependabot.yml +12 -0
  8. data/dummy_app/.github/workflows/ci.yml +66 -0
  9. data/dummy_app/.rubocop.yml +8 -0
  10. data/dummy_app/Dockerfile +69 -0
  11. data/dummy_app/Gemfile +48 -0
  12. data/dummy_app/README.md +24 -0
  13. data/dummy_app/Rakefile +6 -0
  14. data/dummy_app/app/controllers/application_controller.rb +2 -0
  15. data/dummy_app/app/controllers/concerns/.keep +0 -0
  16. data/dummy_app/app/controllers/searches_controller.rb +117 -0
  17. data/dummy_app/app/jobs/application_job.rb +7 -0
  18. data/dummy_app/app/mailers/application_mailer.rb +4 -0
  19. data/dummy_app/app/models/application_record.rb +3 -0
  20. data/dummy_app/app/models/concerns/.keep +0 -0
  21. data/dummy_app/app/views/layouts/mailer.html.erb +13 -0
  22. data/dummy_app/app/views/layouts/mailer.text.erb +1 -0
  23. data/dummy_app/bin/brakeman +7 -0
  24. data/dummy_app/bin/dev +2 -0
  25. data/dummy_app/bin/docker-entrypoint +14 -0
  26. data/dummy_app/bin/rails +4 -0
  27. data/dummy_app/bin/rake +4 -0
  28. data/dummy_app/bin/rubocop +8 -0
  29. data/dummy_app/bin/setup +34 -0
  30. data/dummy_app/bin/thrust +5 -0
  31. data/dummy_app/config/application.rb +32 -0
  32. data/dummy_app/config/boot.rb +4 -0
  33. data/dummy_app/config/cable.yml +10 -0
  34. data/dummy_app/config/database.yml +41 -0
  35. data/dummy_app/config/environment.rb +5 -0
  36. data/dummy_app/config/environments/development.rb +70 -0
  37. data/dummy_app/config/environments/production.rb +86 -0
  38. data/dummy_app/config/environments/test.rb +53 -0
  39. data/dummy_app/config/initializers/brave_search.rb +10 -0
  40. data/dummy_app/config/initializers/cors.rb +16 -0
  41. data/dummy_app/config/initializers/filter_parameter_logging.rb +8 -0
  42. data/dummy_app/config/initializers/inflections.rb +16 -0
  43. data/dummy_app/config/locales/en.yml +31 -0
  44. data/dummy_app/config/puma.rb +41 -0
  45. data/dummy_app/config/routes.rb +16 -0
  46. data/dummy_app/config/storage.yml +34 -0
  47. data/dummy_app/config.ru +6 -0
  48. data/dummy_app/db/seeds.rb +9 -0
  49. data/dummy_app/lib/tasks/.keep +0 -0
  50. data/dummy_app/public/robots.txt +1 -0
  51. data/dummy_app/script/.keep +0 -0
  52. data/dummy_app/test/controllers/.keep +0 -0
  53. data/dummy_app/test/fixtures/files/.keep +0 -0
  54. data/dummy_app/test/integration/.keep +0 -0
  55. data/dummy_app/test/mailers/.keep +0 -0
  56. data/dummy_app/test/models/.keep +0 -0
  57. data/dummy_app/test/test_helper.rb +15 -0
  58. data/dummy_app/vendor/.keep +0 -0
  59. data/example.rb +32 -0
  60. data/lib/brave_search/async_client.rb +52 -0
  61. data/lib/brave_search/client.rb +140 -0
  62. data/lib/brave_search/configuration.rb +21 -0
  63. data/lib/brave_search/exporter.rb +43 -0
  64. data/lib/brave_search/exporters/base.rb +23 -0
  65. data/lib/brave_search/exporters/csv.rb +32 -0
  66. data/lib/brave_search/exporters/json.rb +25 -0
  67. data/lib/brave_search/exporters/xlsx.rb +47 -0
  68. data/lib/brave_search/jobs/export_job.rb +40 -0
  69. data/lib/brave_search/jobs/pdf_download_job.rb +38 -0
  70. data/lib/brave_search/pdf_downloader.rb +46 -0
  71. data/lib/brave_search/railtie.rb +15 -0
  72. data/lib/brave_search/results.rb +93 -0
  73. data/lib/brave_search/storage/s3.rb +47 -0
  74. data/lib/brave_search/storage.rb +21 -0
  75. data/lib/brave_search/summarizer.rb +38 -0
  76. data/lib/brave_search/summary_result.rb +76 -0
  77. data/lib/brave_search/version.rb +5 -0
  78. data/lib/brave_search.rb +38 -0
  79. data/lib/generators/brave_search/install_generator.rb +44 -0
  80. data/test_with_real_api.rb +69 -0
  81. metadata +248 -0
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "net/http"
4
+ require "uri"
5
+
6
+ module BraveSearch
7
+ module Storage
8
+ class S3
9
+ def initialize(bucket:, access_key: nil, secret_key: nil, endpoint: nil, region: "us-east-1")
10
+ @bucket = bucket
11
+ @access_key = access_key || ENV.fetch("AWS_ACCESS_KEY_ID", nil)
12
+ @secret_key = secret_key || ENV.fetch("AWS_SECRET_ACCESS_KEY", nil)
13
+ @endpoint = endpoint || "https://s3.#{region}.amazonaws.com"
14
+ @region = region
15
+ end
16
+
17
+ def upload(content, key:)
18
+ # For now, simulate upload
19
+ {
20
+ key: key,
21
+ url: "#{@endpoint}/#{@bucket}/#{key}",
22
+ size: content.bytesize
23
+ }
24
+ end
25
+
26
+ def download(url, key:)
27
+ uri = URI(url)
28
+ response = Net::HTTP.get_response(uri)
29
+
30
+ raise "Download failed: #{response.code}" unless response.code == "200"
31
+
32
+ upload_result = upload(response.body, key: key)
33
+
34
+ {
35
+ key: key,
36
+ url: upload_result[:url],
37
+ size: response.body.bytesize,
38
+ original_url: url
39
+ }
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :bucket, :access_key, :secret_key, :endpoint, :region
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "storage/s3"
4
+
5
+ module BraveSearch
6
+ module Storage
7
+ ADAPTERS = {
8
+ aws: S3,
9
+ hetzner: S3,
10
+ digitalocean: S3,
11
+ s3: S3
12
+ }.freeze
13
+
14
+ def self.for(provider, **options)
15
+ adapter_class = ADAPTERS[provider]
16
+ raise ArgumentError, "Unknown storage provider: #{provider}" unless adapter_class
17
+
18
+ adapter_class.new(**options)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BraveSearch
4
+ class Summarizer
5
+ SEARCH_ENDPOINT = "/summarizer/search"
6
+ SUMMARY_ENDPOINT = "/summarizer/summary"
7
+
8
+ def initialize(client)
9
+ @client = client
10
+ end
11
+
12
+ def search_and_summarize(q:, **options)
13
+ params = build_search_params(q: q, **options)
14
+ make_summarizer_request(SEARCH_ENDPOINT, params)
15
+ end
16
+
17
+ def summarize(key:, **options)
18
+ params = build_summary_params(key: key, **options)
19
+ make_summarizer_request(SUMMARY_ENDPOINT, params)
20
+ end
21
+
22
+ private
23
+
24
+ def make_summarizer_request(endpoint, params)
25
+ response = @client.send(:make_request, endpoint, params, method: :post)
26
+ data = @client.send(:handle_response, response)
27
+ SummaryResult.new(data)
28
+ end
29
+
30
+ def build_search_params(q:, **options)
31
+ { q: q }.merge(options.compact)
32
+ end
33
+
34
+ def build_summary_params(key:, **options)
35
+ { key: key }.merge(options.compact)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BraveSearch
4
+ class SummaryResult
5
+ attr_reader :raw_data
6
+
7
+ def initialize(data)
8
+ @raw_data = data
9
+ end
10
+
11
+ def summary
12
+ @raw_data.dig(:summarizer, :summary) || []
13
+ end
14
+
15
+ def key
16
+ @raw_data.dig(:summarizer, :key)
17
+ end
18
+
19
+ def status
20
+ @raw_data.dig(:summarizer, :status)
21
+ end
22
+
23
+ def type
24
+ @raw_data.dig(:summarizer, :type)
25
+ end
26
+
27
+ def enriched_results
28
+ results = @raw_data.dig(:summarizer, :enriched_results) || []
29
+ results.map { |result| EnrichedResult.new(result) }
30
+ end
31
+
32
+ # Support pattern matching (Ruby 3+)
33
+ def deconstruct_keys(keys)
34
+ hash = {
35
+ summary: summary,
36
+ key: key,
37
+ status: status,
38
+ type: type,
39
+ enriched_results: enriched_results
40
+ }
41
+ keys ? hash.slice(*keys) : hash
42
+ end
43
+
44
+ def to_h
45
+ @raw_data
46
+ end
47
+ end
48
+
49
+ class EnrichedResult
50
+ attr_reader :raw_data
51
+
52
+ def initialize(data)
53
+ @raw_data = data
54
+ end
55
+
56
+ def title
57
+ @raw_data[:title]
58
+ end
59
+
60
+ def url
61
+ @raw_data[:url]
62
+ end
63
+
64
+ def description
65
+ @raw_data[:description]
66
+ end
67
+
68
+ def snippets
69
+ @raw_data[:snippets] || []
70
+ end
71
+
72
+ def to_h
73
+ @raw_data
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BraveSearch
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "brave_search/version"
4
+ require_relative "brave_search/configuration"
5
+ require_relative "brave_search/results"
6
+ require_relative "brave_search/storage"
7
+ require_relative "brave_search/pdf_downloader"
8
+ require_relative "brave_search/exporter"
9
+ require_relative "brave_search/summarizer"
10
+ require_relative "brave_search/summary_result"
11
+ require_relative "brave_search/client"
12
+ require_relative "brave_search/async_client"
13
+ require_relative "brave_search/railtie" if defined?(Rails)
14
+
15
+ if defined?(ActiveJob)
16
+ require_relative "brave_search/jobs/export_job"
17
+ require_relative "brave_search/jobs/pdf_download_job"
18
+ end
19
+
20
+ module BraveSearch
21
+ class Error < StandardError; end
22
+ class AuthenticationError < Error; end
23
+ class RateLimitError < Error; end
24
+ class QuotaExceededError < Error; end
25
+
26
+ class << self
27
+ attr_accessor :configuration
28
+ end
29
+
30
+ def self.configure
31
+ self.configuration ||= Configuration.new
32
+ yield(configuration)
33
+ end
34
+
35
+ def self.config
36
+ self.configuration ||= Configuration.new
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+
5
+ module BraveSearch
6
+ class InstallGenerator < Rails::Generators::Base
7
+ source_root File.expand_path("templates", __dir__)
8
+
9
+ def create_initializer
10
+ create_file "config/initializers/brave_search.rb", <<~RUBY
11
+ # frozen_string_literal: true
12
+
13
+ BraveSearch.configure do |config|
14
+ # Get your API key from https://brave.com/search/api/
15
+ config.api_key = Rails.application.credentials.brave_api_key
16
+ #{' '}
17
+ # Optional configuration
18
+ # config.timeout = 30
19
+ # config.retry_attempts = 3
20
+ end
21
+ RUBY
22
+ end
23
+
24
+ def show_instructions
25
+ say <<~TEXT
26
+
27
+ BraveSearch has been installed!
28
+
29
+ Next steps:
30
+ 1. Get your API key from https://brave.com/search/api/
31
+ 2. Add it to your Rails credentials:
32
+ rails credentials:edit
33
+ #{' '}
34
+ Add this line:
35
+ brave_api_key: your_api_key_here
36
+
37
+ 3. Use the client:
38
+ client = BraveSearch::Client.new
39
+ results = client.search(q: "ruby programming")
40
+
41
+ TEXT
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "lib/brave_search"
5
+ require "json"
6
+
7
+ puts "BraveSearch Real API Test"
8
+ puts "=" * 40
9
+
10
+ # Check for API key
11
+ api_key = ENV.fetch("BRAVE_API_KEY", nil)
12
+ if api_key.nil? || api_key.empty?
13
+ puts "❌ Please set BRAVE_API_KEY environment variable"
14
+ puts "Usage: BRAVE_API_KEY=your_key ruby test_with_real_api.rb"
15
+ exit 1
16
+ end
17
+
18
+ begin
19
+ client = BraveSearch::Client.new(api_key: api_key)
20
+ puts "✅ Client initialized with API key: #{api_key[0..8]}..."
21
+
22
+ # Test basic search
23
+ puts "\n🔍 Testing search: 'ruby programming'"
24
+ results = client.search(q: "ruby programming", count: 3)
25
+
26
+ puts "✅ Search successful!"
27
+ puts "Query: #{results.dig(:query, :original) || 'ruby programming'}"
28
+
29
+ if results[:web] && results[:web][:results]
30
+ puts "📄 Found #{results[:web][:results].length} web results:"
31
+
32
+ results[:web][:results].each_with_index do |result, i|
33
+ puts "\n#{i + 1}. #{result[:title]}"
34
+ puts " URL: #{result[:url]}"
35
+ puts " Description: #{result[:description][0..100]}..." if result[:description]
36
+ end
37
+ end
38
+
39
+ # Test news search if available
40
+ if results[:news] && results[:news][:results] && !results[:news][:results].empty?
41
+ puts "\n📰 News results found: #{results[:news][:results].length}"
42
+ results[:news][:results].first(2).each_with_index do |news, i|
43
+ puts "#{i + 1}. #{news[:title]} (#{news[:meta_tag]})"
44
+ end
45
+ end
46
+
47
+ # Show raw response structure
48
+ puts "\n📊 Response structure:"
49
+ puts "Available sections: #{results.keys.join(', ')}"
50
+
51
+ # Test different query
52
+ puts "\n🔍 Testing search: 'Rails 8 features'"
53
+ rails_results = client.search(q: "Rails 8 features", count: 2)
54
+ puts "✅ Second search successful!"
55
+ puts "Found #{rails_results.dig(:web, :results)&.length || 0} results"
56
+
57
+ puts "\n🎉 All tests passed!"
58
+ rescue BraveSearch::AuthenticationError => e
59
+ puts "❌ Authentication failed: #{e.message}"
60
+ puts "Check your API key at https://brave.com/search/api/"
61
+ rescue BraveSearch::RateLimitError => e
62
+ puts "❌ Rate limit exceeded: #{e.message}"
63
+ rescue BraveSearch::QuotaExceededError => e
64
+ puts "❌ Quota exceeded: #{e.message}"
65
+ rescue StandardError => e
66
+ puts "❌ Error: #{e.message}"
67
+ puts "Class: #{e.class}"
68
+ puts e.backtrace.first(3) if ENV["DEBUG"]
69
+ end
metadata ADDED
@@ -0,0 +1,248 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: brave_search
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Remi AI
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 2025-08-11 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: async
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '2.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '2.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: caxlsx
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '4.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '4.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: concurrent-ruby
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.2'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.2'
54
+ - !ruby/object:Gem::Dependency
55
+ name: httparty
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.21'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.21'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rails
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '8.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '8.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.12'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.12'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rubocop
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.50'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.50'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubocop-rspec
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '2.20'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '2.20'
124
+ - !ruby/object:Gem::Dependency
125
+ name: webmock
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.18'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '3.18'
138
+ description: Simple Ruby client for Brave Search API with Rails integration
139
+ email:
140
+ - denis@goremi.co.uk
141
+ executables: []
142
+ extensions: []
143
+ extra_rdoc_files: []
144
+ files:
145
+ - ".rubocop.yml"
146
+ - README.md
147
+ - Rakefile
148
+ - brave_search.gemspec
149
+ - dummy_app/.dockerignore
150
+ - dummy_app/.github/dependabot.yml
151
+ - dummy_app/.github/workflows/ci.yml
152
+ - dummy_app/.rubocop.yml
153
+ - dummy_app/Dockerfile
154
+ - dummy_app/Gemfile
155
+ - dummy_app/README.md
156
+ - dummy_app/Rakefile
157
+ - dummy_app/app/controllers/application_controller.rb
158
+ - dummy_app/app/controllers/concerns/.keep
159
+ - dummy_app/app/controllers/searches_controller.rb
160
+ - dummy_app/app/jobs/application_job.rb
161
+ - dummy_app/app/mailers/application_mailer.rb
162
+ - dummy_app/app/models/application_record.rb
163
+ - dummy_app/app/models/concerns/.keep
164
+ - dummy_app/app/views/layouts/mailer.html.erb
165
+ - dummy_app/app/views/layouts/mailer.text.erb
166
+ - dummy_app/bin/brakeman
167
+ - dummy_app/bin/dev
168
+ - dummy_app/bin/docker-entrypoint
169
+ - dummy_app/bin/rails
170
+ - dummy_app/bin/rake
171
+ - dummy_app/bin/rubocop
172
+ - dummy_app/bin/setup
173
+ - dummy_app/bin/thrust
174
+ - dummy_app/config.ru
175
+ - dummy_app/config/application.rb
176
+ - dummy_app/config/boot.rb
177
+ - dummy_app/config/cable.yml
178
+ - dummy_app/config/database.yml
179
+ - dummy_app/config/environment.rb
180
+ - dummy_app/config/environments/development.rb
181
+ - dummy_app/config/environments/production.rb
182
+ - dummy_app/config/environments/test.rb
183
+ - dummy_app/config/initializers/brave_search.rb
184
+ - dummy_app/config/initializers/cors.rb
185
+ - dummy_app/config/initializers/filter_parameter_logging.rb
186
+ - dummy_app/config/initializers/inflections.rb
187
+ - dummy_app/config/locales/en.yml
188
+ - dummy_app/config/puma.rb
189
+ - dummy_app/config/routes.rb
190
+ - dummy_app/config/storage.yml
191
+ - dummy_app/db/seeds.rb
192
+ - dummy_app/lib/tasks/.keep
193
+ - dummy_app/public/robots.txt
194
+ - dummy_app/script/.keep
195
+ - dummy_app/test/controllers/.keep
196
+ - dummy_app/test/fixtures/files/.keep
197
+ - dummy_app/test/integration/.keep
198
+ - dummy_app/test/mailers/.keep
199
+ - dummy_app/test/models/.keep
200
+ - dummy_app/test/test_helper.rb
201
+ - dummy_app/vendor/.keep
202
+ - example.rb
203
+ - lib/brave_search.rb
204
+ - lib/brave_search/async_client.rb
205
+ - lib/brave_search/client.rb
206
+ - lib/brave_search/configuration.rb
207
+ - lib/brave_search/exporter.rb
208
+ - lib/brave_search/exporters/base.rb
209
+ - lib/brave_search/exporters/csv.rb
210
+ - lib/brave_search/exporters/json.rb
211
+ - lib/brave_search/exporters/xlsx.rb
212
+ - lib/brave_search/jobs/export_job.rb
213
+ - lib/brave_search/jobs/pdf_download_job.rb
214
+ - lib/brave_search/pdf_downloader.rb
215
+ - lib/brave_search/railtie.rb
216
+ - lib/brave_search/results.rb
217
+ - lib/brave_search/storage.rb
218
+ - lib/brave_search/storage/s3.rb
219
+ - lib/brave_search/summarizer.rb
220
+ - lib/brave_search/summary_result.rb
221
+ - lib/brave_search/version.rb
222
+ - lib/generators/brave_search/install_generator.rb
223
+ - test_with_real_api.rb
224
+ homepage: https://github.com/Remi-org/brave-search-ruby
225
+ licenses:
226
+ - MIT
227
+ metadata:
228
+ homepage_uri: https://github.com/Remi-org/brave-search-ruby
229
+ source_code_uri: https://github.com/Remi-org/brave-search-ruby
230
+ rubygems_mfa_required: 'true'
231
+ rdoc_options: []
232
+ require_paths:
233
+ - lib
234
+ required_ruby_version: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ">="
237
+ - !ruby/object:Gem::Version
238
+ version: 3.0.0
239
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ requirements: []
245
+ rubygems_version: 3.6.2
246
+ specification_version: 4
247
+ summary: Ruby client for Brave Search API
248
+ test_files: []