ronin-web-spider 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fcb3d69132ae37799758c37282083f3b876e04e76aa3ab9f500f251b7df0984d
4
- data.tar.gz: 04b92b26f1bcd6166530ddfe225cde18a4bbaa8a1eb3b395120ae1e6b41aec4b
3
+ metadata.gz: dab34842325a731e13f23303b1dec66c7ab9d78b4805b982d518ba01024c9352
4
+ data.tar.gz: '0668f126b3e828c6409cc7b7adef2d74cd527f48de334b10a3d54f3767fe3afd'
5
5
  SHA512:
6
- metadata.gz: e5cc4d39ac8e5f9d92edd240e836d5848f0b96798afbcab9c8116f8223142851d835b7bfd3e7a8d94e867951c4b995e0a66736a73b72d6a96f06fee6daf26bc9
7
- data.tar.gz: 4f1facfbdffe1aca7fd0d10ff0c99d6f835b2633e94be49011b46127ca9cc7b76415930d5df0a961516000032b940f00e224c562923c06412c57f2896e50256f
6
+ metadata.gz: d474705a601b7fe27be2a9c5f5e5485ed39b38dec1581db295b0e1ff524c987c9e74522afd24569829bc7e64f6930767104f9bd927a3007a17f627de003492f7
7
+ data.tar.gz: 397b84308ec62d51e1dba64cff37c75eda8ebd8c2e6a792487468158fb774aae566b8be5cd0388521774d62873e5ba6b751423bc1138ac9e3d47804bdd877a81
@@ -12,11 +12,12 @@ jobs:
12
12
  - '3.0'
13
13
  - '3.1'
14
14
  - '3.2'
15
+ - '3.3'
15
16
  - jruby
16
17
  - truffleruby
17
18
  name: Ruby ${{ matrix.ruby }}
18
19
  steps:
19
- - uses: actions/checkout@v2
20
+ - uses: actions/checkout@v4
20
21
  - name: Set up Ruby
21
22
  uses: ruby/setup-ruby@v1
22
23
  with:
@@ -26,3 +27,17 @@ jobs:
26
27
  run: bundle install --jobs 4 --retry 3
27
28
  - name: Run tests
28
29
  run: bundle exec rake test
30
+
31
+ # rubocop linting
32
+ rubocop:
33
+ runs-on: ubuntu-latest
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+ - name: Set up Ruby
37
+ uses: ruby/setup-ruby@v1
38
+ with:
39
+ ruby-version: 3.0
40
+ - name: Install dependencies
41
+ run: bundle install --jobs 4 --retry 3
42
+ - name: Run rubocop
43
+ run: bundle exec rubocop --parallel
data/.rubocop.yml ADDED
@@ -0,0 +1,11 @@
1
+ AllCops:
2
+ NewCops: enable
3
+ SuggestExtensions: false
4
+ TargetRubyVersion: 3.1
5
+
6
+ inherit_gem:
7
+ rubocop-ronin: rubocop.yml
8
+
9
+ #
10
+ # ronin-web-spider specific exceptions
11
+ #
data/ChangeLog.md CHANGED
@@ -1,4 +1,22 @@
1
- ### 0.1.0 / 2023-XX-XX
1
+ ### 0.1.1 / 2024-06-19
2
+
3
+ * Fixed {Ronin::Web::Spider::Agent#every_html_comment} and
4
+ {Ronin::Web::Spider::Agent#every_javascript} when the page's `Content-Type`
5
+ header included `text/html` but lacked a response body, causing `page.doc` to
6
+ be `nil`.
7
+ * Fixed a bug in {Ronin::Web::Spider::Agent#every_javascript} where parsed
8
+ JavaScript source code strings containing UTF-8 characters where being
9
+ incorrectly encoded as ASCII-8bit strings, if the page's `Content-Type` header
10
+ did not include a `charset=` attribute.
11
+ * Fixed a bug in {Ronin::Web::Spider::Agent#every_javascript_string} where
12
+ inline JavaScript regexes containing the `"` or `'` characters (ex: `/["'=]/`)
13
+ would incorrectly be treated as the beginning or ends of JavaScript string
14
+ literals. Note that while this greatly improves the accuracy of
15
+ {Ronin::Web::Spider::Agent#every_javascript_string}, it still does not
16
+ support parsing JavaScript template literals that may also contain string
17
+ literals (ex: ````Hello \"World\"```` or ````Hello ${myFunc("string literal")}````).
18
+
19
+ ### 0.1.0 / 2023-02-01
2
20
 
3
21
  * Extracted and refactored from [ronin-web](https://github.com/ronin-rb/ronin-web/tree/v0.3.0.rc1).
4
22
  * Relicensed as LGPL-3.0.
@@ -20,3 +38,4 @@
20
38
  * `every_comment` - yields every HTML or JavaScript comment.
21
39
  * Supports archiving spidered pages to a directory or git repository.
22
40
 
41
+ [spidr]: https://github.com/postmodern/spidr#readme
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
4
  gemspec
@@ -28,4 +29,6 @@ group :development do
28
29
  gem 'dead_end', require: false
29
30
  gem 'sord', require: false, platform: :mri
30
31
  gem 'stackprof', require: false, platform: :mri
32
+ gem 'rubocop', require: false, platform: :mri
33
+ gem 'rubocop-ronin', require: false, platform: :mri
31
34
  end
data/README.md CHANGED
@@ -9,7 +9,6 @@
9
9
  * [Issues](https://github.com/ronin-rb/ronin-web-spider/issues)
10
10
  * [Documentation](https://ronin-rb.dev/docs/ronin-web-spider/frames)
11
11
  * [Discord](https://discord.gg/6WAb3PsVX9) |
12
- [Twitter](https://twitter.com/ronin_rb) |
13
12
  [Mastodon](https://infosec.exchange/@ronin_rb)
14
13
 
15
14
  ## Description
@@ -38,7 +37,7 @@ ronin-web-spider is a collection of common web spidering routines using the
38
37
  * [every_comment][docs-every_comment] - yields every HTML or JavaScript
39
38
  comment.
40
39
  * Supports archiving spidered pages to a directory or git repository.
41
- * Has 94% documentation coverage.
40
+ * Has 97% documentation coverage.
42
41
  * Has 94% test coverage.
43
42
 
44
43
  [docs-every_host]: https://ronin-rb.dev/docs/ronin-web-spider/Ronin/Web/Spider/Agent.html#every_host-instance_method
data/Rakefile CHANGED
@@ -1,11 +1,11 @@
1
- require 'rubygems'
1
+ # frozen_string_literal: true
2
2
 
3
3
  begin
4
4
  require 'bundler'
5
5
  rescue LoadError => e
6
6
  warn e.message
7
7
  warn "Run `gem install bundler` to install Bundler"
8
- exit -1
8
+ exit(-1)
9
9
  end
10
10
 
11
11
  begin
data/gemspec.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  name: ronin-web-spider
2
- summary: collection of common web spidering routines
2
+ summary: A collection of common web spidering routines.
3
3
  description:
4
4
  ronin-web-spider is a collection of common web spidering routines using the
5
5
  spidr gem.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  #
2
3
  # ronin-web-spider - A collection of common web spidering routines.
3
4
  #
@@ -237,6 +238,8 @@ module Ronin
237
238
  #
238
239
  def every_html_comment
239
240
  every_html_page do |page|
241
+ next unless page.doc
242
+
240
243
  page.doc.xpath('//comment()').each do |comment|
241
244
  comment_text = comment.inner_text.strip
242
245
 
@@ -267,20 +270,60 @@ module Ronin
267
270
  # yield inner text of every `<script type="text/javascript">` tag
268
271
  # and every `.js` URL.
269
272
  every_html_page do |page|
273
+ next unless page.doc
274
+
270
275
  page.doc.xpath('//script[@type="text/javascript"]').each do |script|
271
- unless script.inner_text.empty?
272
- yield script.inner_text
276
+ source = script.inner_text
277
+ source.force_encoding(Encoding::UTF_8)
278
+
279
+ unless source.empty?
280
+ yield source
273
281
  end
274
282
  end
275
283
  end
276
284
 
277
285
  every_javascript_page do |page|
278
- yield page.body
286
+ source = page.body
287
+ source.force_encoding(Encoding::UTF_8)
288
+
289
+ yield source
279
290
  end
280
291
  end
281
292
 
282
293
  alias every_js every_javascript
283
294
 
295
+ # Regex to match and skip JavaScript inline regexes.
296
+ #
297
+ # @api private
298
+ #
299
+ # @since 0.1.1
300
+ JAVASCRIPT_INLINE_REGEX = %r{
301
+ (?# match before the regex to avoid matching division operators )
302
+ (?:[\{\[\(;:,]\s*|=\s*)
303
+ /
304
+ (?# inline regex contents )
305
+ (?:
306
+ \[ (?:\\. | [^\]]) \] (?# [...] ) |
307
+ \\. (?# backslash escaped characters ) |
308
+ [^/] (?# everything else )
309
+ )+
310
+ /[dgimsuvy]* (?# also match any regex flags )
311
+ }mx
312
+
313
+ # Regex to match and skip JavaScript template literals.
314
+ #
315
+ # @note
316
+ # This regex will not properly match nested template literals:
317
+ #
318
+ # ```javascript
319
+ # `foo ${`bar ${1+1}`}`
320
+ # ```
321
+ #
322
+ # @api private
323
+ #
324
+ # @since 0.1.1
325
+ JAVASCRIPT_TEMPLATE_LITERAL = /`(?:\\`|[^`])+`/m
326
+
284
327
  #
285
328
  # Passes every JavaScript string value to the given block.
286
329
  #
@@ -293,15 +336,28 @@ module Ronin
293
336
  #
294
337
  # @example
295
338
  # spider.every_javascript_string do |str|
296
- # puts str
297
- # end
339
+ # puts str
340
+ # end
298
341
  #
299
342
  # @api public
300
343
  #
301
344
  def every_javascript_string
302
345
  every_javascript do |js|
303
- js.scan(Support::Text::Patterns::STRING) do |js_string|
304
- yield Support::Encoding::JS.unquote(js_string)
346
+ scanner = StringScanner.new(js)
347
+
348
+ until scanner.eos?
349
+ # NOTE: this is a naive JavaScript string scanner and should
350
+ # eventually be replaced with a real JavaScript lexer or parser.
351
+ case scanner.peek(1)
352
+ when '"', "'" # beginning of a quoted string
353
+ js_string = scanner.scan(Support::Text::Patterns::STRING)
354
+
355
+ yield Support::Encoding::JS.unquote(js_string)
356
+ else
357
+ scanner.skip(JAVASCRIPT_INLINE_REGEX) ||
358
+ scanner.skip(JAVASCRIPT_TEMPLATE_LITERAL) ||
359
+ scanner.getch
360
+ end
305
361
  end
306
362
  end
307
363
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  #
2
3
  # ronin-web-spider - A collection of common web spidering routines.
3
4
  #
@@ -31,7 +32,7 @@ module Ronin
31
32
  #
32
33
  # require 'ronin/web/spider'
33
34
  # require 'ronin/web/spider/archive'
34
- #
35
+ #
35
36
  # Ronin::Web::Spider::Archive.open('path/to/root') do |archive|
36
37
  # Ronin::Web::Spider.every_page(host: 'example.com') do |page|
37
38
  # archive.write(page.url,page.body)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  #
2
3
  # ronin-web-spider - A collection of common web spidering routines.
3
4
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  #
2
3
  # ronin-web-spider - A collection of common web spidering routines.
3
4
  #
@@ -33,7 +34,7 @@ module Ronin
33
34
  # require 'ronin/web/spider'
34
35
  # require 'ronin/web/spider/git_archive'
35
36
  # require 'date'
36
- #
37
+ #
37
38
  # Ronin::Web::Spider::GitArchive.open('path/to/root') do |archive|
38
39
  # archive.commit("Updated #{Date.today}") do
39
40
  # Ronin::Web::Spider.every_page(host: 'example.com') do |page|
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  #
2
3
  # ronin-web-spider - A collection of common web spidering routines.
3
4
  #
@@ -21,7 +22,7 @@ module Ronin
21
22
  module Web
22
23
  module Spider
23
24
  # ronin-web-spider version
24
- VERSION = '0.1.0'
25
+ VERSION = '0.1.1'
25
26
  end
26
27
  end
27
28
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  #
2
3
  # ronin-web-spider - A collection of common web spidering routines.
3
4
  #
@@ -30,136 +31,136 @@ module Ronin
30
31
  # ## Examples
31
32
  #
32
33
  # Spider a host:
33
- #
34
+ #
34
35
  # ```ruby
35
36
  # require 'ronin/web/spider'
36
- #
37
+ #
37
38
  # Ronin::Web::Spider.start_at('http://tenderlovemaking.com/') do |agent|
38
39
  # # ...
39
40
  # end
40
41
  # ```
41
- #
42
+ #
42
43
  # Spider a host:
43
- #
44
+ #
44
45
  # ```ruby
45
46
  # Ronin::Web::Spider.host('solnic.eu') do |agent|
46
47
  # # ...
47
48
  # end
48
49
  # ```
49
- #
50
+ #
50
51
  # Spider a domain (and any sub-domains):
51
- #
52
+ #
52
53
  # ```ruby
53
54
  # Ronin::Web::Spider.domain('ruby-lang.org') do |agent|
54
55
  # # ...
55
56
  # end
56
57
  # ```
57
- #
58
+ #
58
59
  # Spider a site:
59
- #
60
+ #
60
61
  # ```ruby
61
62
  # Ronin::Web::Spider.site('http://www.rubyflow.com/') do |agent|
62
63
  # # ...
63
64
  # end
64
65
  # ```
65
- #
66
+ #
66
67
  # Spider multiple hosts:
67
- #
68
+ #
68
69
  # ```ruby
69
70
  # Ronin::Web::Spider.start_at('http://company.com/', hosts: ['company.com', /host[\d]+\.company\.com/]) do |agent|
70
71
  # # ...
71
72
  # end
72
73
  # ```
73
- #
74
+ #
74
75
  # Do not spider certain links:
75
- #
76
+ #
76
77
  # ```ruby
77
78
  # Ronin::Web::Spider.site('http://company.com/', ignore_links: [%{^/blog/}]) do |agent|
78
79
  # # ...
79
80
  # end
80
81
  # ```
81
- #
82
+ #
82
83
  # Do not spider links on certain ports:
83
- #
84
+ #
84
85
  # ```ruby
85
86
  # Ronin::Web::Spider.site('http://company.com/', ignore_ports: [8000, 8010, 8080]) do |agent|
86
87
  # # ...
87
88
  # end
88
89
  # ```
89
- #
90
+ #
90
91
  # Do not spider links blacklisted in robots.txt:
91
- #
92
+ #
92
93
  # ```ruby
93
94
  # Ronin::Web::Spider.site('http://company.com/', robots: true) do |agent|
94
95
  # # ...
95
96
  # end
96
97
  # ```
97
- #
98
+ #
98
99
  # Print out visited URLs:
99
- #
100
+ #
100
101
  # ```ruby
101
102
  # Ronin::Web::Spider.site('http://www.rubyinside.com/') do |spider|
102
103
  # spider.every_url { |url| puts url }
103
104
  # end
104
105
  # ```
105
- #
106
+ #
106
107
  # Build a URL map of a site:
107
- #
108
+ #
108
109
  # ```ruby
109
110
  # url_map = Hash.new { |hash,key| hash[key] = [] }
110
- #
111
+ #
111
112
  # Ronin::Web::Spider.site('http://intranet.com/') do |spider|
112
113
  # spider.every_link do |origin,dest|
113
114
  # url_map[dest] << origin
114
115
  # end
115
116
  # end
116
117
  # ```
117
- #
118
+ #
118
119
  # Print out the URLs that could not be requested:
119
- #
120
+ #
120
121
  # ```ruby
121
122
  # Ronin::Web::Spider.site('http://company.com/') do |spider|
122
123
  # spider.every_failed_url { |url| puts url }
123
124
  # end
124
125
  # ```
125
- #
126
+ #
126
127
  # Finds all pages which have broken links:
127
- #
128
+ #
128
129
  # ```ruby
129
130
  # url_map = Hash.new { |hash,key| hash[key] = [] }
130
- #
131
+ #
131
132
  # spider = Ronin::Web::Spider.site('http://intranet.com/') do |spider|
132
133
  # spider.every_link do |origin,dest|
133
134
  # url_map[dest] << origin
134
135
  # end
135
136
  # end
136
- #
137
+ #
137
138
  # spider.failures.each do |url|
138
139
  # puts "Broken link #{url} found in:"
139
- #
140
+ #
140
141
  # url_map[url].each { |page| puts " #{page}" }
141
142
  # end
142
143
  # ```
143
- #
144
+ #
144
145
  # Search HTML and XML pages:
145
- #
146
+ #
146
147
  # ```ruby
147
148
  # Ronin::Web::Spider.site('http://company.com/') do |spider|
148
149
  # spider.every_page do |page|
149
150
  # puts ">>> #{page.url}"
150
- #
151
+ #
151
152
  # page.search('//meta').each do |meta|
152
153
  # name = (meta.attributes['name'] || meta.attributes['http-equiv'])
153
154
  # value = meta.attributes['content']
154
- #
155
+ #
155
156
  # puts " #{name} = #{value}"
156
157
  # end
157
158
  # end
158
159
  # end
159
160
  # ```
160
- #
161
+ #
161
162
  # Print out the titles from every page:
162
- #
163
+ #
163
164
  # ```ruby
164
165
  # Ronin::Web::Spider.site('https://www.ruby-lang.org/') do |spider|
165
166
  # spider.every_html_page do |page|
@@ -167,9 +168,9 @@ module Ronin
167
168
  # end
168
169
  # end
169
170
  # ```
170
- #
171
+ #
171
172
  # Print out every HTTP redirect:
172
- #
173
+ #
173
174
  # ```ruby
174
175
  # Ronin::Web::Spider.host('company.com') do |spider|
175
176
  # spider.every_redirect_page do |page|
@@ -177,21 +178,21 @@ module Ronin
177
178
  # end
178
179
  # end
179
180
  # ```
180
- #
181
+ #
181
182
  # Find what kinds of web servers a host is using, by accessing the headers:
182
- #
183
+ #
183
184
  # ```ruby
184
185
  # servers = Set[]
185
- #
186
+ #
186
187
  # Ronin::Web::Spider.host('company.com') do |spider|
187
188
  # spider.all_headers do |headers|
188
189
  # servers << headers['server']
189
190
  # end
190
191
  # end
191
192
  # ```
192
- #
193
+ #
193
194
  # Pause the spider on a forbidden page:
194
- #
195
+ #
195
196
  # ```ruby
196
197
  # Ronin::Web::Spider.host('company.com') do |spider|
197
198
  # spider.every_forbidden_page do |page|
@@ -199,9 +200,9 @@ module Ronin
199
200
  # end
200
201
  # end
201
202
  # ```
202
- #
203
+ #
203
204
  # Skip the processing of a page:
204
- #
205
+ #
205
206
  # ```ruby
206
207
  # Ronin::Web::Spider.host('company.com') do |spider|
207
208
  # spider.every_missing_page do |page|
@@ -209,9 +210,9 @@ module Ronin
209
210
  # end
210
211
  # end
211
212
  # ```
212
- #
213
+ #
213
214
  # Skip the processing of links:
214
- #
215
+ #
215
216
  # ```ruby
216
217
  # Ronin::Web::Spider.host('company.com') do |spider|
217
218
  # spider.every_url do |url|
@@ -221,9 +222,9 @@ module Ronin
221
222
  # end
222
223
  # end
223
224
  # ```
224
- #
225
+ #
225
226
  # Detect when a new host name is spidered:
226
- #
227
+ #
227
228
  # ```ruby
228
229
  # Ronin::Web::Spider.domain('example.com') do |spider|
229
230
  # spider.every_host do |host|
@@ -231,9 +232,9 @@ module Ronin
231
232
  # end
232
233
  # end
233
234
  # ```
234
- #
235
+ #
235
236
  # Detect when a new SSL/TLS certificate is encountered:
236
- #
237
+ #
237
238
  # ```ruby
238
239
  # Ronin::Web::Spider.domain('example.com') do |spider|
239
240
  # spider.every_cert do |cert|
@@ -241,9 +242,9 @@ module Ronin
241
242
  # end
242
243
  # end
243
244
  # ```
244
- #
245
+ #
245
246
  # Print the MD5 checksum of every `favicon.ico` file:
246
- #
247
+ #
247
248
  # ```ruby
248
249
  # Ronin::Web::Spider.domain('example.com') do |spider|
249
250
  # spider.every_favicon do |page|
@@ -251,9 +252,9 @@ module Ronin
251
252
  # end
252
253
  # end
253
254
  # ```
254
- #
255
+ #
255
256
  # Print every HTML comment:
256
- #
257
+ #
257
258
  # ```ruby
258
259
  # Ronin::Web::Spider.domain('example.com') do |spider|
259
260
  # spider.every_html_comment do |comment|
@@ -261,9 +262,9 @@ module Ronin
261
262
  # end
262
263
  # end
263
264
  # ```
264
- #
265
+ #
265
266
  # Print all JavaScript source code:
266
- #
267
+ #
267
268
  # ```ruby
268
269
  # Ronin::Web::Spider.domain('example.com') do |spider|
269
270
  # spider.every_javascript do |js|
@@ -271,9 +272,9 @@ module Ronin
271
272
  # end
272
273
  # end
273
274
  # ```
274
- #
275
+ #
275
276
  # Print every JavaScript string literal:
276
- #
277
+ #
277
278
  # ```ruby
278
279
  # Ronin::Web::Spider.domain('example.com') do |spider|
279
280
  # spider.every_javascript_string do |str|
@@ -281,9 +282,9 @@ module Ronin
281
282
  # end
282
283
  # end
283
284
  # ```
284
- #
285
+ #
285
286
  # Print every JavaScript comment:
286
- #
287
+ #
287
288
  # ```ruby
288
289
  # Ronin::Web::Spider.domain('example.com') do |spider|
289
290
  # spider.every_javascript_comment do |comment|
@@ -291,9 +292,9 @@ module Ronin
291
292
  # end
292
293
  # end
293
294
  # ```
294
- #
295
+ #
295
296
  # Print every HTML and JavaScript comment:
296
- #
297
+ #
297
298
  # ```ruby
298
299
  # Ronin::Web::Spider.domain('example.com') do |spider|
299
300
  # spider.every_comment do |comment|
@@ -301,7 +302,7 @@ module Ronin
301
302
  # end
302
303
  # end
303
304
  # ```
304
- #
305
+ #
305
306
  module Spider
306
307
  #
307
308
  # Creates a new agent and begin spidering at the given URL.
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'yaml'
4
4
 
@@ -22,7 +22,7 @@ Gem::Specification.new do |gem|
22
22
  gem.homepage = gemspec['homepage']
23
23
  gem.metadata = gemspec['metadata'] if gemspec['metadata']
24
24
 
25
- glob = lambda { |patterns| gem.files & Dir[*patterns] }
25
+ glob = ->(patterns) { gem.files & Dir[*patterns] }
26
26
 
27
27
  gem.files = `git ls-files`.split($/)
28
28
  gem.files = glob[gemspec['files']] if gemspec['files']
@@ -46,7 +46,7 @@ Gem::Specification.new do |gem|
46
46
  gem.required_rubygems_version = gemspec['required_rubygems_version']
47
47
  gem.post_install_message = gemspec['post_install_message']
48
48
 
49
- split = lambda { |string| string.split(/,\s*/) }
49
+ split = ->(string) { string.split(/,\s*/) }
50
50
 
51
51
  if gemspec['dependencies']
52
52
  gemspec['dependencies'].each do |name,versions|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ronin-web-spider
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Postmodern
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-01 00:00:00.000000000 Z
11
+ date: 2024-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spidr
@@ -66,6 +66,7 @@ files:
66
66
  - ".github/workflows/ruby.yml"
67
67
  - ".gitignore"
68
68
  - ".rspec"
69
+ - ".rubocop.yml"
69
70
  - ".ruby-version"
70
71
  - ".yardopts"
71
72
  - COPYING.txt
@@ -105,8 +106,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
106
  - !ruby/object:Gem::Version
106
107
  version: '0'
107
108
  requirements: []
108
- rubygems_version: 3.3.26
109
+ rubygems_version: 3.3.27
109
110
  signing_key:
110
111
  specification_version: 4
111
- summary: collection of common web spidering routines
112
+ summary: A collection of common web spidering routines.
112
113
  test_files: []