curlyq 0.0.4 → 0.0.6

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.
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ require 'helpers/curlyq-helpers'
7
+ require 'test_helper'
8
+
9
+ # Tests for tags command
10
+ class CurlyQTagsTest < Test::Unit::TestCase
11
+ include CurlyQHelpers
12
+
13
+ def setup
14
+ end
15
+
16
+ def test_extract_inclusive
17
+ result = curlyq('extract', '-i', '-b', 'Adding', '-a', 'accessing the source.', 'https://stackoverflow.com/questions/52428409/get-fully-rendered-html-using-selenium-webdriver-and-python')
18
+ json = JSON.parse(result)
19
+
20
+ assert_match(/^Adding <code>time.sleep\(10\)<\/code>.*?accessing the source.$/, json[0], 'Match should be found and include the before and after strings')
21
+ end
22
+
23
+ def test_extract_exclusive
24
+ result = curlyq('extract', '-b', 'Adding', '-a', 'accessing the source.', 'https://stackoverflow.com/questions/52428409/get-fully-rendered-html-using-selenium-webdriver-and-python')
25
+ json = JSON.parse(result)
26
+
27
+ assert_match(/^ <code>time.sleep\(10\)<\/code>.*?when I was $/, json[0], 'Match should be found and not include the before and after strings')
28
+ end
29
+
30
+ def test_extract_regex_inclusive
31
+ result = curlyq('extract', '-ri', '-b', '.dding <', '-a', 'accessing.*?source.', 'https://stackoverflow.com/questions/52428409/get-fully-rendered-html-using-selenium-webdriver-and-python')
32
+ json = JSON.parse(result)
33
+
34
+ assert_match(/^Adding <code>time.sleep\(10\)<\/code>.*?accessing the source.$/, json[0], 'Match should be found and include the before and after strings')
35
+ end
36
+
37
+ def test_extract_regex_exclusive
38
+ result = curlyq('extract', '-r', '-b', '.dding <', '-a', 'accessing.*?source.', 'https://stackoverflow.com/questions/52428409/get-fully-rendered-html-using-selenium-webdriver-and-python')
39
+ json = JSON.parse(result)
40
+
41
+ assert_match(/^code>time.sleep\(10\)<\/code>.*?when I was $/, json[0], 'Match should be found and not include the before and after strings')
42
+ end
43
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ require 'helpers/curlyq-helpers'
7
+ require 'test_helper'
8
+
9
+ # Tests for tags command
10
+ class CurlyQHeadlinksTest < Test::Unit::TestCase
11
+ include CurlyQHelpers
12
+
13
+ def setup
14
+ end
15
+
16
+ def test_headlinks_query
17
+ result = curlyq('headlinks', '-q', '[rel=stylesheet]', 'https://brettterpstra.com')
18
+ json = JSON.parse(result)
19
+
20
+ assert_match(/stylesheet/, json['rel'], 'Should have retrieved a single result with rel stylesheet')
21
+ assert_match(/screen\.\d+\.css$/, json['href'], 'Stylesheet should be correct primary stylesheet')
22
+ end
23
+
24
+ def test_headlinks
25
+ result = curlyq('headlinks', 'https://brettterpstra.com')
26
+ json = JSON.parse(result)
27
+
28
+ assert_equal(Array, json.class, 'Should have an array of results')
29
+ assert(json.count > 1, 'Should have more than one link')
30
+ # assert(json[0].count.positive?)
31
+ end
32
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ require 'helpers/curlyq-helpers'
7
+ require 'test_helper'
8
+
9
+ # Tests for tags command
10
+ class CurlyQHtmlTest < Test::Unit::TestCase
11
+ include CurlyQHelpers
12
+
13
+ def test_html_search_query
14
+ result = curlyq('html', '-s', '#main article .aligncenter', '-q', 'images[1]', 'https://brettterpstra.com')
15
+ json = JSON.parse(result)
16
+
17
+ assert_match(/aligncenter/, json[0]['class'], 'Should have found an image with class "aligncenter"')
18
+ end
19
+
20
+ def test_html_query
21
+ result = curlyq('html', '-q', 'meta.title', 'https://brettterpstra.com/2024/01/10/introducing-curlyq-a-pipeline-oriented-curl-helper/')
22
+
23
+ assert_match(/Introducing CurlyQ/, result, 'Should have retrived the page title')
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ require 'helpers/curlyq-helpers'
7
+ require 'test_helper'
8
+
9
+ # Tests for tags command
10
+ class CurlyQImagesTest < Test::Unit::TestCase
11
+ include CurlyQHelpers
12
+
13
+ def test_images_query
14
+ result = curlyq('images', '-t', 'img', '-q', '[alt$=screenshot]', 'https://brettterpstra.com/2024/01/08/keyboard-maestro-giveaway/')
15
+ json = JSON.parse(result)
16
+
17
+ assert(json.count == 1, 'Should have found 1 image')
18
+ assert_match(/Keyboard Maestro screenshot/, json[0]['alt'], 'Should match Keyboard Meastro screenshot')
19
+ end
20
+
21
+ def test_images_type
22
+ result = curlyq('images', '-t', 'srcset', 'https://brettterpstra.com/')
23
+ json = JSON.parse(result)
24
+
25
+ assert(json.count.positive?, 'Should have found at least 1 image')
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ require 'helpers/curlyq-helpers'
7
+ require 'test_helper'
8
+
9
+ # Tests for tags command
10
+ class CurlyQJsonTest < Test::Unit::TestCase
11
+ include CurlyQHelpers
12
+
13
+ def setup
14
+ end
15
+
16
+ def test_json
17
+ result = curlyq('json', 'https://brettterpstra.com/scripts/giveaways_wrapper.cgi?v=203495&giveaway=hazel2023&action=count')
18
+ json = JSON.parse(result)
19
+
20
+ assert_equal(json.class, Hash, 'Single result should be a hash')
21
+ assert_equal(286, json['json']['total'], 'json.total should match 286')
22
+ end
23
+
24
+ def test_query
25
+ result1 = curlyq('json', '-q', 'total', 'https://brettterpstra.com/scripts/giveaways_wrapper.cgi?v=203495&giveaway=hazel2023&action=count')
26
+ result2 = curlyq('json', '-q', 'json.total', 'https://brettterpstra.com/scripts/giveaways_wrapper.cgi?v=203495&giveaway=hazel2023&action=count')
27
+ json1 = JSON.parse(result1)
28
+ json2 = JSON.parse(result2)
29
+
30
+ assert_equal(286, json1, 'Should be 286')
31
+ assert_equal(286, json2, 'Including json in dot path should yeild same result')
32
+ end
33
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ require 'helpers/curlyq-helpers'
7
+ require 'test_helper'
8
+
9
+ # Tests for tags command
10
+ class CurlyQLinksTest < Test::Unit::TestCase
11
+ include CurlyQHelpers
12
+
13
+ def test_links
14
+ result = curlyq('links', '-q', '[content*=twitter]', 'https://stackoverflow.com/questions/52428409/get-fully-rendered-html-using-selenium-webdriver-and-python')
15
+ json = JSON.parse(result)
16
+
17
+ assert(json.count.positive?, 'Should be at least 1 match')
18
+ assert_match(/twitter.com/, json[0]['href'], 'Should be a link to Twitter')
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ require 'helpers/curlyq-helpers'
7
+ require 'test_helper'
8
+
9
+ # Tests for tags command
10
+ class CurlyQScrapeTest < Test::Unit::TestCase
11
+ include CurlyQHelpers
12
+
13
+ def setup
14
+ end
15
+
16
+ def test_scrape
17
+ result = curlyq('scrape', '-b', 'firefox', '-q', 'links[rel=me&content*=mastodon][0]', 'https://brettterpstra.com/2024/01/10/introducing-curlyq-a-pipeline-oriented-curl-helper/')
18
+ json = JSON.parse(result)
19
+
20
+ assert_match(/Mastodon/, json['content'], 'Should have retrieved a Mastodon link')
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ require 'helpers/curlyq-helpers'
7
+ require 'test_helper'
8
+
9
+ # Tests for tags command
10
+ class CurlyQTagsTest < Test::Unit::TestCase
11
+ include CurlyQHelpers
12
+
13
+ def setup
14
+ end
15
+
16
+ def test_tags
17
+ result = curlyq('tags', '--search', '#main .post h3', '-q', 'attrs[id*=what]', 'https://brettterpstra.com/2024/01/10/introducing-curlyq-a-pipeline-oriented-curl-helper/')
18
+ json = JSON.parse(result)
19
+
20
+ assert_equal(json.count, 1, 'Should have 1 result')
21
+ assert_match(/whats-next/, json[0]['attrs']['id'], 'Should have matched #whats-next')
22
+ end
23
+
24
+ def test_clean
25
+ result = curlyq('tags', '--search', '#main section.related', '--clean', 'https://brettterpstra.com/2024/01/10/introducing-curlyq-a-pipeline-oriented-curl-helper/')
26
+ json = JSON.parse(result)
27
+
28
+ assert_equal(json.count, 1, 'Should have 1 result')
29
+ assert_match(%r{Last.fm</h5></a></li>}, json[0]['source'], 'Should have matched #whats-next')
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ require 'open3'
2
+ require 'time'
3
+ $LOAD_PATH.unshift File.join(__dir__, '..', '..', 'lib')
4
+ require 'curly'
5
+
6
+ module CurlyQHelpers
7
+ CURLYQ_EXEC = File.join(File.dirname(__FILE__), '..', '..', 'bin', 'curlyq')
8
+ BUNDLE = '/Users/ttscoff/.asdf/shims/bundle'
9
+
10
+ def curlyq_with_env(env, *args, stdin: nil)
11
+ Dir.chdir(File.expand_path('~/Desktop/Code/curlyq'))
12
+ pread(env, BUNDLE, 'exec', 'bin/curlyq', *args, stdin: stdin)
13
+ end
14
+
15
+ def curlyq(*args)
16
+ curlyq_with_env({ 'GLI_DEBUG' => 'true' }, *args)
17
+ end
18
+
19
+ def pread(env, *cmd, stdin: nil)
20
+ out, err, status = Open3.capture3(env, *cmd, stdin_data: stdin)
21
+ unless status.success?
22
+ raise [
23
+ "Error (#{status}): #{cmd.inspect} failed", "STDOUT:", out.inspect, "STDERR:", err.inspect
24
+ ].join("\n")
25
+ end
26
+
27
+ out
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ class FakeStdOut
2
+ attr_reader :strings
3
+
4
+ def initialize
5
+ @strings = []
6
+ end
7
+
8
+ def puts(string=nil)
9
+ @strings << string unless string.nil?
10
+ end
11
+
12
+ def write(x)
13
+ puts(x)
14
+ end
15
+
16
+ def printf(*args)
17
+ puts(Kernel.printf(*args))
18
+ end
19
+
20
+ # Returns true if the regexp matches anything in the output
21
+ def contained?(regexp)
22
+ strings.find{ |x| x =~ regexp }
23
+ end
24
+
25
+ def flush; end
26
+
27
+ def to_s
28
+ @strings.join("\n")
29
+ end
30
+ end
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'tty-spinner'
4
+ require 'tty-progressbar'
5
+ require 'open3'
6
+ require 'shellwords'
7
+ require 'fileutils'
8
+ require 'pastel'
9
+
10
+ class ThreadedTests
11
+ def run(pattern: '*', max_threads: 8, max_tests: 0)
12
+ pastel = Pastel.new
13
+
14
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
15
+ @results = File.expand_path('results.log')
16
+
17
+ max_threads = 1000 if max_threads.to_i == 0
18
+
19
+ shuffle = false
20
+
21
+ unless pattern =~ /shuffle/i
22
+ pattern = "test/curlyq_*#{pattern}*_test.rb"
23
+ else
24
+ pattern = "test/curlyq_*_test.rb"
25
+ shuffle = true
26
+ end
27
+
28
+ tests = Dir.glob(pattern)
29
+
30
+ tests.shuffle! if shuffle
31
+
32
+ if max_tests.to_i > 0
33
+ tests = tests.slice(0, max_tests.to_i - 1)
34
+ end
35
+
36
+ puts pastel.cyan("#{tests.count} test files")
37
+
38
+ banner = "Running tests [:bar] T/A (#{max_threads.to_s} threads)"
39
+
40
+ progress = TTY::ProgressBar::Multi.new(banner,
41
+ width: 12,
42
+ clear: true,
43
+ hide_cursor: true)
44
+ @children = []
45
+ tests.each do |t|
46
+ test_name = File.basename(t, '.rb').sub(/curlyq_(.*?)_test/, '\1')
47
+ new_sp = progress.register("[:bar] #{test_name}:status",
48
+ total: tests.count + 8,
49
+ width: 1,
50
+ head: ' ',
51
+ unknown: ' ',
52
+ hide_cursor: true,
53
+ clear: true)
54
+ status = ': waiting'
55
+ @children.push([test_name, new_sp, status])
56
+ end
57
+
58
+ @elapsed = 0.0
59
+ @test_total = 0
60
+ @assrt_total = 0
61
+ @error_out = []
62
+ @threads = []
63
+ @running_tests = []
64
+
65
+ begin
66
+ finish_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
67
+ while @children.count.positive?
68
+
69
+ slices = @children.slice!(0, max_threads)
70
+ slices.each { |c| c[1].start }
71
+ slices.each do |s|
72
+ @threads << Thread.new do
73
+ run_test(s)
74
+ finish_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
75
+ end
76
+ end
77
+
78
+ @threads.each { |t| t.join }
79
+ end
80
+
81
+ finish_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
82
+
83
+ progress.finish
84
+ rescue
85
+ progress.stop
86
+ ensure
87
+ msg = @running_tests.map { |t| t[1].format.sub(/^\[:bar\] (.*?):status/, "\\1#{t[2]}") }.join("\n")
88
+
89
+ output = []
90
+ output << if @error_out.count.positive?
91
+ pastel.red("#{@error_out.count} Issues")
92
+ else
93
+ pastel.green('Success')
94
+ end
95
+ output << pastel.green("#{@test_total} tests")
96
+ output << pastel.cyan("#{@assrt_total} assertions")
97
+ output << pastel.yellow("#{(finish_time - start_time).round(3)}s")
98
+ puts output.join(', ')
99
+
100
+ if @error_out.count.positive?
101
+ puts @error_out.join(pastel.white("\n----\n"))
102
+ Process.exit 1
103
+ end
104
+ end
105
+ end
106
+
107
+ def run_test(s)
108
+ pastel = Pastel.new
109
+
110
+ bar = s[1]
111
+ s[2] = ": #{pastel.green('running')}"
112
+ bar.advance(status: s[2])
113
+
114
+ if @running_tests.count.positive?
115
+ @running_tests.each do |b|
116
+ prev_bar = b[1]
117
+ if prev_bar.complete?
118
+ prev_bar.reset
119
+ prev_bar.advance(status: b[2])
120
+ prev_bar.finish
121
+ else
122
+ prev_bar.update(head: ' ', unfinished: ' ')
123
+ prev_bar.advance(status: b[2])
124
+ end
125
+ end
126
+ end
127
+
128
+ @running_tests.push(s)
129
+ out, _err, status = Open3.capture3(ENV, 'rake', "test:#{s[0]}", stdin_data: nil)
130
+ time = out.match(/^Finished in (?<time>\d+\.\d+) seconds\./)
131
+ count = out.match(/^(?<tests>\d+) tests, (?<assrt>\d+) assertions, (?<fails>\d+) failures, (?<errs>\d+) errors/)
132
+
133
+ unless status.success? && !count['fails'].to_i.positive? && !count['errs'].to_i.positive?
134
+ s[2] = if count
135
+ ": #{paste.red(count['fails'])} #{pastel.red('failures')}, #{pastel.red(count['errs'])} #{pastel.red('errors')}"
136
+ else
137
+ ": #{pastel.red('Unknown Error')}"
138
+ end
139
+ bar.update(head: pastel.red('✖'))
140
+ bar.advance(head: pastel.red('✖'), status: s[2])
141
+
142
+ # errs = out.scan(/(?:Failure|Error): [\w_]+\((?:.*?)\):(?:.*?)(?=\n=======)/m)
143
+ @error_out.push(out)
144
+ bar.finish
145
+
146
+ next_test
147
+ Thread.exit
148
+ end
149
+
150
+ s[2] = [
151
+ ': ',
152
+ pastel.green(count['tests']),
153
+ '/',
154
+ pastel.cyan(count['assrt']),
155
+ ' ',
156
+ pastel.yellow(time['time'].to_f.round(3).to_s),
157
+ 's'
158
+ ].join('')
159
+ bar.update(head: pastel.green('✔'))
160
+ bar.advance(head: pastel.green('✔'), status: s[2])
161
+ @test_total += count['tests'].to_i
162
+ @assrt_total += count['assrt'].to_i
163
+ @elapsed += time['time'].to_f
164
+
165
+ bar.finish
166
+
167
+ next_test
168
+ end
169
+
170
+ def next_test
171
+ if @children.count.positive?
172
+ t = Thread.new do
173
+ s = @children.shift
174
+ # s[1].start
175
+ # s[1].advance(status: ": #{'running'.green}")
176
+ run_test(s)
177
+ end
178
+
179
+ t.join
180
+ end
181
+ end
182
+ end
data/test/test_helper.rb CHANGED
@@ -1,4 +1,9 @@
1
- require "minitest/autorun"
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'test/unit'
3
4
  # Add test libraries you want to use here, e.g. mocha
4
- # Add helper classes or methods here, too
5
+
6
+ class Test::Unit::TestCase
7
+ ENV['TZ'] = 'UTC'
8
+ # Add global extensions to the test case class here
9
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curlyq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-10 00:00:00.000000000 Z
11
+ date: 2024-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -16,42 +16,48 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.9.2
19
+ version: '13.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 13.0.1
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
- version: 0.9.2
29
+ version: '13.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 13.0.1
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rdoc
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '4.3'
39
+ version: 6.3.1
34
40
  type: :development
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: '4.3'
46
+ version: 6.3.1
41
47
  - !ruby/object:Gem::Dependency
42
- name: minitest
48
+ name: test-unit
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '5.14'
53
+ version: 3.4.4
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '5.14'
60
+ version: 3.4.4
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: yard
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -72,6 +78,80 @@ dependencies:
72
78
  - - ">="
73
79
  - !ruby/object:Gem::Version
74
80
  version: 0.9.26
81
+ - !ruby/object:Gem::Dependency
82
+ name: tty-spinner
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '0.9'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 0.9.3
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '0.9'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 0.9.3
101
+ - !ruby/object:Gem::Dependency
102
+ name: tty-progressbar
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '0.18'
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 0.18.2
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.18'
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: 0.18.2
121
+ - !ruby/object:Gem::Dependency
122
+ name: pastel
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: 0.8.0
128
+ type: :development
129
+ prerelease: false
130
+ version_requirements: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: 0.8.0
135
+ - !ruby/object:Gem::Dependency
136
+ name: parallel_tests
137
+ requirement: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: '3.7'
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 3.7.3
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.7'
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: 3.7.3
75
155
  - !ruby/object:Gem::Dependency
76
156
  name: gli
77
157
  requirement: !ruby/object:Gem::Requirement
@@ -139,6 +219,7 @@ extra_rdoc_files:
139
219
  files:
140
220
  - ".github/FUNDING.yml"
141
221
  - ".gitignore"
222
+ - ".irbrc"
142
223
  - CHANGELOG.md
143
224
  - Gemfile
144
225
  - Gemfile.lock
@@ -158,7 +239,18 @@ files:
158
239
  - lib/curly/string.rb
159
240
  - lib/curly/version.rb
160
241
  - src/_README.md
242
+ - test/curlyq_extract_test.rb
243
+ - test/curlyq_headlinks_test.rb
244
+ - test/curlyq_html_test.rb
245
+ - test/curlyq_images_test.rb
246
+ - test/curlyq_json_test.rb
247
+ - test/curlyq_links_test.rb
248
+ - test/curlyq_scrape_test.rb
249
+ - test/curlyq_tags_test.rb
161
250
  - test/default_test.rb
251
+ - test/helpers/curlyq-helpers.rb
252
+ - test/helpers/fake_std_out.rb
253
+ - test/helpers/threaded_tests.rb
162
254
  - test/test_helper.rb
163
255
  homepage: https://brettterpstra.com
164
256
  licenses: