nous 0.3.0 → 0.5.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/.agents/skills/verify-nous/SKILL.md +6 -0
  3. data/CHANGELOG.md +75 -1
  4. data/CODING_STANDARDS.md +203 -0
  5. data/README.md +175 -17
  6. data/Rakefile +2 -0
  7. data/docs/setup/defuddle.md +38 -0
  8. data/docs/setup/verification.md +21 -0
  9. data/docs/verification/README.md +77 -0
  10. data/docs/verification/defuddle.md +45 -0
  11. data/docs/verification/failure-propagation.md +37 -0
  12. data/docs/verification/retained-html.md +37 -0
  13. data/javascript/build.mjs +24 -0
  14. data/javascript/defuddle.mjs +28 -0
  15. data/lib/nous/cli.rb +3 -3
  16. data/lib/nous/crawler/async_page_fetcher.rb +43 -11
  17. data/lib/nous/crawler/recursive_page_fetcher.rb +34 -26
  18. data/lib/nous/crawler/single_page_fetcher.rb +49 -9
  19. data/lib/nous/decode_html.rb +80 -0
  20. data/lib/nous/extract_html.rb +109 -0
  21. data/lib/nous/extractor/default/client.rb +30 -12
  22. data/lib/nous/extractor/default.rb +2 -4
  23. data/lib/nous/extractor/defuddle/client.rb +57 -0
  24. data/lib/nous/extractor/defuddle/run_process.rb +104 -0
  25. data/lib/nous/extractor/defuddle.rb +23 -0
  26. data/lib/nous/extractor/extraction_error.rb +7 -0
  27. data/lib/nous/fetcher/extraction_runner.rb +26 -11
  28. data/lib/nous/fetcher/page_extractor.rb +27 -12
  29. data/lib/nous/fetcher.rb +46 -10
  30. data/lib/nous/primitives/configuration.rb +1 -0
  31. data/lib/nous/primitives/fetch_record.rb +26 -0
  32. data/lib/nous/primitives/fetch_result.rb +21 -0
  33. data/lib/nous/primitives/page.rb +1 -1
  34. data/lib/nous/serializer.rb +9 -1
  35. data/lib/nous/version.rb +1 -1
  36. data/lib/nous.rb +2 -2
  37. data/package-lock.json +858 -0
  38. data/package.json +15 -0
  39. data/tasks/verification.rake +23 -0
  40. data/vendor/THIRD_PARTY_LICENSES.txt +518 -0
  41. data/vendor/defuddle.mjs +403 -0
  42. data/vendor/defuddle.mjs.LEGAL.txt +10 -0
  43. metadata +25 -4
  44. data/lib/nous/extractor/jina/client.rb +0 -59
  45. data/lib/nous/extractor/jina.rb +0 -26
  46. data/lib/nous/primitives/raw_page.rb +0 -5
@@ -0,0 +1,10 @@
1
+ Bundled license information:
2
+
3
+ @mixmark-io/domino/lib/style_parser.js:
4
+ /**
5
+ * @license
6
+ * Copyright Google LLC All Rights Reserved.
7
+ *
8
+ * Use of this source code is governed by an MIT-style license that can be
9
+ * found in the LICENSE file at https://angular.io/license
10
+ */
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nous
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Frenette
@@ -214,14 +214,24 @@ executables:
214
214
  extensions: []
215
215
  extra_rdoc_files: []
216
216
  files:
217
+ - ".agents/skills/verify-nous/SKILL.md"
217
218
  - ".rspec"
218
219
  - ".ruby-version"
219
220
  - ".standard.yml"
220
221
  - CHANGELOG.md
222
+ - CODING_STANDARDS.md
221
223
  - LICENSE.txt
222
224
  - README.md
223
225
  - Rakefile
226
+ - docs/setup/defuddle.md
227
+ - docs/setup/verification.md
228
+ - docs/verification/README.md
229
+ - docs/verification/defuddle.md
230
+ - docs/verification/failure-propagation.md
231
+ - docs/verification/retained-html.md
224
232
  - exe/nous
233
+ - javascript/build.mjs
234
+ - javascript/defuddle.mjs
225
235
  - lib/nous.rb
226
236
  - lib/nous/cli.rb
227
237
  - lib/nous/command.rb
@@ -234,22 +244,33 @@ files:
234
244
  - lib/nous/crawler/redirect_follower.rb
235
245
  - lib/nous/crawler/single_page_fetcher.rb
236
246
  - lib/nous/crawler/url_filter.rb
247
+ - lib/nous/decode_html.rb
248
+ - lib/nous/extract_html.rb
237
249
  - lib/nous/extractor/default.rb
238
250
  - lib/nous/extractor/default/client.rb
239
- - lib/nous/extractor/jina.rb
240
- - lib/nous/extractor/jina/client.rb
251
+ - lib/nous/extractor/defuddle.rb
252
+ - lib/nous/extractor/defuddle/client.rb
253
+ - lib/nous/extractor/defuddle/run_process.rb
254
+ - lib/nous/extractor/extraction_error.rb
241
255
  - lib/nous/fetcher.rb
242
256
  - lib/nous/fetcher/extraction_runner.rb
243
257
  - lib/nous/fetcher/page_extractor.rb
244
258
  - lib/nous/primitives/configuration.rb
245
259
  - lib/nous/primitives/extracted_content.rb
260
+ - lib/nous/primitives/fetch_record.rb
261
+ - lib/nous/primitives/fetch_result.rb
246
262
  - lib/nous/primitives/page.rb
247
- - lib/nous/primitives/raw_page.rb
248
263
  - lib/nous/primitives/url.rb
249
264
  - lib/nous/serializer.rb
250
265
  - lib/nous/url_resolver.rb
251
266
  - lib/nous/version.rb
267
+ - package-lock.json
268
+ - package.json
252
269
  - sig/nous.rbs
270
+ - tasks/verification.rake
271
+ - vendor/THIRD_PARTY_LICENSES.txt
272
+ - vendor/defuddle.mjs
273
+ - vendor/defuddle.mjs.LEGAL.txt
253
274
  homepage: https://github.com/danfrenette/nous
254
275
  licenses:
255
276
  - MIT
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "faraday"
4
- require "faraday/retry"
5
- require "json"
6
-
7
- module Nous
8
- module Extractor
9
- class Jina
10
- class Client
11
- class RequestError < StandardError; end
12
-
13
- BASE_URL = "https://r.jina.ai"
14
- RETRYABLE_STATUSES = [429, 500, 502, 503, 504].freeze
15
- MAX_RETRIES = 3
16
-
17
- def initialize(api_key: nil, timeout: 30, retry_interval: 1)
18
- @connection = build_connection(api_key:, timeout:, retry_interval:)
19
- end
20
-
21
- def get(url)
22
- response = connection.get("/#{url}")
23
- parse(response.body)
24
- rescue Faraday::Error => e
25
- raise RequestError, e.message
26
- end
27
-
28
- private
29
-
30
- attr_reader :connection
31
-
32
- def build_connection(api_key:, timeout:, retry_interval:)
33
- Faraday.new(url: BASE_URL) do |f|
34
- f.response :raise_error
35
-
36
- f.request :retry,
37
- max: MAX_RETRIES,
38
- interval: retry_interval,
39
- backoff_factor: 2,
40
- retry_statuses: RETRYABLE_STATUSES
41
-
42
- f.headers["Accept"] = "application/json"
43
- f.headers["X-No-Cache"] = "true"
44
- f.headers["Authorization"] = "Bearer #{api_key}" if api_key
45
-
46
- f.options.timeout = timeout
47
- f.options.open_timeout = timeout
48
- end
49
- end
50
-
51
- def parse(body)
52
- JSON.parse(body)
53
- rescue JSON::ParserError => e
54
- raise RequestError, "invalid JSON: #{e.message}"
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nous
4
- module Extractor
5
- class Jina < Command
6
- def initialize(api_key: nil, timeout: 30, **client_options)
7
- @client = Client.new(api_key: api_key || ENV["JINA_API_KEY"], timeout:, **client_options)
8
- end
9
-
10
- def extract(raw_page)
11
- body = client.get(raw_page.url)
12
-
13
- success(payload: ExtractedContent.new(
14
- title: body.dig("data", "title") || "",
15
- content: body.dig("data", "content") || ""
16
- ))
17
- rescue Client::RequestError => e
18
- failure(ExtractionError.new(e.message))
19
- end
20
-
21
- private
22
-
23
- attr_reader :client
24
- end
25
- end
26
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nous
4
- RawPage = Data.define(:url, :pathname, :html)
5
- end