ronin-web-spider 0.1.0.beta1 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4a08a150f4301148cc86877702ea981f2083d173c3101ee6047d44cfc5f076c
4
- data.tar.gz: 8fb751613e0cee2161d08b338cce434b252ba83f62971275b5a33d0060cec567
3
+ metadata.gz: fcb3d69132ae37799758c37282083f3b876e04e76aa3ab9f500f251b7df0984d
4
+ data.tar.gz: 04b92b26f1bcd6166530ddfe225cde18a4bbaa8a1eb3b395120ae1e6b41aec4b
5
5
  SHA512:
6
- metadata.gz: 5af53f0fbf55f13d8ccd2ff9fd13d7cfba7d6ce7c8aae90e5b44a467617212eb77247f9e343da118bdc8a369a9cbb7d240f8513d58373ab36b210d95b7f51e2c
7
- data.tar.gz: d456194ef7e1c45a22a4419699e3f3cdcb82f09d987842ab15bcd3de009a2557cf1aa416da3d1ce0a8404fd3579d14103ca24e6b2495fa7684a421e9db6cf7b0
6
+ metadata.gz: e5cc4d39ac8e5f9d92edd240e836d5848f0b96798afbcab9c8116f8223142851d835b7bfd3e7a8d94e867951c4b995e0a66736a73b72d6a96f06fee6daf26bc9
7
+ data.tar.gz: 4f1facfbdffe1aca7fd0d10ff0c99d6f835b2633e94be49011b46127ca9cc7b76415930d5df0a961516000032b940f00e224c562923c06412c57f2896e50256f
@@ -21,10 +21,7 @@ jobs:
21
21
  uses: ruby/setup-ruby@v1
22
22
  with:
23
23
  ruby-version: ${{ matrix.ruby }}
24
- - name: Install libsqlite3
25
- run: |
26
- sudo apt update -y && \
27
- sudo apt install -y --no-install-recommends --no-install-suggests libsqlite3-dev
24
+ bundler-cache: true
28
25
  - name: Install dependencies
29
26
  run: bundle install --jobs 4 --retry 3
30
27
  - name: Run tests
data/.yardopts CHANGED
@@ -1 +1 @@
1
- --markup markdown --title 'Ronin FIXME Documentation' --protected
1
+ --markup markdown --title 'Ronin::Web::Spider Documentation' --protected
data/ChangeLog.md CHANGED
@@ -1,6 +1,9 @@
1
1
  ### 0.1.0 / 2023-XX-XX
2
2
 
3
+ * Extracted and refactored from [ronin-web](https://github.com/ronin-rb/ronin-web/tree/v0.3.0.rc1).
4
+ * Relicensed as LGPL-3.0.
3
5
  * Initial release:
6
+ * Requires `ruby` >= 3.0.0.
4
7
  * Built on top of the battle tested and versatile [spidr] gem.
5
8
  * Provides additional callback methods:
6
9
  * `every_host` - yields every unique host name that's spidered.
data/Gemfile CHANGED
@@ -8,8 +8,8 @@ end
8
8
 
9
9
  # gem 'spidr', '~> 0.7', github: 'postmodern/spidr'
10
10
 
11
- gem 'ronin-support', '~> 1.0', github: "ronin-rb/ronin-support",
12
- branch: '1.0.0'
11
+ # gem 'ronin-support', '~> 1.0', github: "ronin-rb/ronin-support",
12
+ # branch: 'main'
13
13
 
14
14
  group :development do
15
15
  gem 'rake'
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/ronin-rb/ronin-web-spider/actions/workflows/ruby.yml/badge.svg)](https://github.com/ronin-rb/ronin-web-spider/actions/workflows/ruby.yml)
4
4
  [![Code Climate](https://codeclimate.com/github/ronin-rb/ronin-web-spider.svg)](https://codeclimate.com/github/ronin-rb/ronin-web-spider)
5
+ [![Gem Version](https://badge.fury.io/rb/ronin-web-spider.svg)](https://badge.fury.io/rb/ronin-web-spider)
5
6
 
6
7
  * [Website](https://ronin-rb.dev/)
7
8
  * [Source](https://github.com/ronin-rb/ronin-web-spider)
@@ -20,22 +21,35 @@ ronin-web-spider is a collection of common web spidering routines using the
20
21
 
21
22
  * Built on top of the battle tested and versatile [spidr] gem.
22
23
  * Provides additional callback methods:
23
- * `every_host` - yields every unique host name that's spidered.
24
- * `every_cert` - yields every unique SSL/TLS certificate encountered while
25
- spidering.
26
- * `every_favicon` - yields every favicon file that's encountered while
27
- spidering.
28
- * `every_html_comment` - yields every HTML comment.
29
- * `every_javascript` - yields all JavaScript source code from either inline
30
- `<script>` or `.js` files.
31
- * `every_javascript_string` - yields every single-quoted or double-quoted
32
- String literal from all JavaScript source code.
33
- * `every_javascript_comment` - yields every JavaScript comment.
34
- * `every_comment` - yields every HTML or JavaScript comment.
24
+ * [every_host][docs-every_host] - yields every unique host name that's
25
+ spidered.
26
+ * [every_cert][docs-every_cert] - yields every unique SSL/TLS certificate
27
+ encountered while spidering.
28
+ * [every_favicon][docs-every_favicon] - yields every favicon file that's
29
+ encountered while spidering.
30
+ * [every_html_comment][docs-every_html_comment] - yields every HTML comment.
31
+ * [every_javascript][docs-every_javascript] - yields all JavaScript source
32
+ code from either inline `<script>` or `.js` files.
33
+ * [every_javascript_string][docs-every_javascript_string] - yields every
34
+ single-quoted or double-quoted String literal from all JavaScript source
35
+ code.
36
+ * [every_javascript_comment][docs-every_javascript_comment] - yields every
37
+ JavaScript comment.
38
+ * [every_comment][docs-every_comment] - yields every HTML or JavaScript
39
+ comment.
35
40
  * Supports archiving spidered pages to a directory or git repository.
36
41
  * Has 94% documentation coverage.
37
42
  * Has 94% test coverage.
38
43
 
44
+ [docs-every_host]: https://ronin-rb.dev/docs/ronin-web-spider/Ronin/Web/Spider/Agent.html#every_host-instance_method
45
+ [docs-every_cert]: https://ronin-rb.dev/docs/ronin-web-spider/Ronin/Web/Spider/Agent.html#every_cert-instance_method
46
+ [docs-every_favicon]: https://ronin-rb.dev/docs/ronin-web-spider/Ronin/Web/Spider/Agent.html#every_favicon-instance_method
47
+ [docs-every_html_comment]: https://ronin-rb.dev/docs/ronin-web-spider/Ronin/Web/Spider/Agent.html#every_html_comment-instance_method
48
+ [docs-every_javascript]: https://ronin-rb.dev/docs/ronin-web-spider/Ronin/Web/Spider/Agent.html#every_javascript-instance_method
49
+ [docs-every_javascript_string]: https://ronin-rb.dev/docs/ronin-web-spider/Ronin/Web/Spider/Agent.html#every_javascript_string-instance_method
50
+ [docs-every_javascript_comment]: https://ronin-rb.dev/docs/ronin-web-spider/Ronin/Web/Spider/Agent.html#every_javascript_comment-instance_method
51
+ [docs-every_comment]: https://ronin-rb.dev/docs/ronin-web-spider/Ronin/Web/Spider/Agent.html#every_comment-instance_method
52
+
39
53
  ## Examples
40
54
 
41
55
  Spider a host:
@@ -43,41 +57,299 @@ Spider a host:
43
57
  ```ruby
44
58
  require 'ronin/web/spider'
45
59
 
46
- Ronin::Web::Spider.host('www.example.com') do |agent|
47
- agent.ever_url do |url|
48
- # ...
60
+ Ronin::Web::Spider.start_at('http://tenderlovemaking.com/') do |agent|
61
+ # ...
62
+ end
63
+ ```
64
+
65
+ Spider a host:
66
+
67
+ ```ruby
68
+ Ronin::Web::Spider.host('solnic.eu') do |agent|
69
+ # ...
70
+ end
71
+ ```
72
+
73
+ Spider a domain (and any sub-domains):
74
+
75
+ ```ruby
76
+ Ronin::Web::Spider.domain('ruby-lang.org') do |agent|
77
+ # ...
78
+ end
79
+ ```
80
+
81
+ Spider a site:
82
+
83
+ ```ruby
84
+ Ronin::Web::Spider.site('http://www.rubyflow.com/') do |agent|
85
+ # ...
86
+ end
87
+ ```
88
+
89
+ Spider multiple hosts:
90
+
91
+ ```ruby
92
+ Ronin::Web::Spider.start_at('http://company.com/', hosts: ['company.com', /host[\d]+\.company\.com/]) do |agent|
93
+ # ...
94
+ end
95
+ ```
96
+
97
+ Do not spider certain links:
98
+
99
+ ```ruby
100
+ Ronin::Web::Spider.site('http://company.com/', ignore_links: [%{^/blog/}]) do |agent|
101
+ # ...
102
+ end
103
+ ```
104
+
105
+ Do not spider links on certain ports:
106
+
107
+ ```ruby
108
+ Ronin::Web::Spider.site('http://company.com/', ignore_ports: [8000, 8010, 8080]) do |agent|
109
+ # ...
110
+ end
111
+ ```
112
+
113
+ Do not spider links blacklisted in robots.txt:
114
+
115
+ ```ruby
116
+ Ronin::Web::Spider.site('http://company.com/', robots: true) do |agent|
117
+ # ...
118
+ end
119
+ ```
120
+
121
+ Print out visited URLs:
122
+
123
+ ```ruby
124
+ Ronin::Web::Spider.site('http://www.rubyinside.com/') do |spider|
125
+ spider.every_url { |url| puts url }
126
+ end
127
+ ```
128
+
129
+ Build a URL map of a site:
130
+
131
+ ```ruby
132
+ url_map = Hash.new { |hash,key| hash[key] = [] }
133
+
134
+ Ronin::Web::Spider.site('http://intranet.com/') do |spider|
135
+ spider.every_link do |origin,dest|
136
+ url_map[dest] << origin
137
+ end
138
+ end
139
+ ```
140
+
141
+ Print out the URLs that could not be requested:
142
+
143
+ ```ruby
144
+ Ronin::Web::Spider.site('http://company.com/') do |spider|
145
+ spider.every_failed_url { |url| puts url }
146
+ end
147
+ ```
148
+
149
+ Finds all pages which have broken links:
150
+
151
+ ```ruby
152
+ url_map = Hash.new { |hash,key| hash[key] = [] }
153
+
154
+ spider = Ronin::Web::Spider.site('http://intranet.com/') do |spider|
155
+ spider.every_link do |origin,dest|
156
+ url_map[dest] << origin
157
+ end
158
+ end
159
+
160
+ spider.failures.each do |url|
161
+ puts "Broken link #{url} found in:"
162
+
163
+ url_map[url].each { |page| puts " #{page}" }
164
+ end
165
+ ```
166
+
167
+ Search HTML and XML pages:
168
+
169
+ ```ruby
170
+ Ronin::Web::Spider.site('http://company.com/') do |spider|
171
+ spider.every_page do |page|
172
+ puts ">>> #{page.url}"
173
+
174
+ page.search('//meta').each do |meta|
175
+ name = (meta.attributes['name'] || meta.attributes['http-equiv'])
176
+ value = meta.attributes['content']
177
+
178
+ puts " #{name} = #{value}"
179
+ end
180
+ end
181
+ end
182
+ ```
183
+
184
+ Print out the titles from every page:
185
+
186
+ ```ruby
187
+ Ronin::Web::Spider.site('https://www.ruby-lang.org/') do |spider|
188
+ spider.every_html_page do |page|
189
+ puts page.title
190
+ end
191
+ end
192
+ ```
193
+
194
+ Print out every HTTP redirect:
195
+
196
+ ```ruby
197
+ Ronin::Web::Spider.host('company.com') do |spider|
198
+ spider.every_redirect_page do |page|
199
+ puts "#{page.url} -> #{page.headers['Location']}"
49
200
  end
201
+ end
202
+ ```
203
+
204
+ Find what kinds of web servers a host is using, by accessing the headers:
205
+
206
+ ```ruby
207
+ servers = Set[]
50
208
 
51
- agent.every_url_like(/.../) do |url|
52
- # ...
209
+ Ronin::Web::Spider.host('company.com') do |spider|
210
+ spider.all_headers do |headers|
211
+ servers << headers['server']
53
212
  end
213
+ end
214
+ ```
54
215
 
55
- agent.every_page do |page|
56
- # ...
216
+ Pause the spider on a forbidden page:
217
+
218
+ ```ruby
219
+ Ronin::Web::Spider.host('company.com') do |spider|
220
+ spider.every_forbidden_page do |page|
221
+ spider.pause!
57
222
  end
58
223
  end
59
224
  ```
60
225
 
61
- See [Spidr::Agent] documentation for more agent methods.
226
+ Skip the processing of a page:
62
227
 
63
- [Spidr::Agent]: https://rubydoc.info/gems/spidr/Spidr/Agent
228
+ ```ruby
229
+ Ronin::Web::Spider.host('company.com') do |spider|
230
+ spider.every_missing_page do |page|
231
+ spider.skip_page!
232
+ end
233
+ end
234
+ ```
64
235
 
65
- Spider a domain:
236
+ Skip the processing of links:
66
237
 
67
238
  ```ruby
68
- Ronin::Web::Spider.domain('example.com') do |agent|
69
- agent.every_page do |page|
70
- # ...
239
+ Ronin::Web::Spider.host('company.com') do |spider|
240
+ spider.every_url do |url|
241
+ if url.path.split('/').find { |dir| dir.to_i > 1000 }
242
+ spider.skip_link!
243
+ end
71
244
  end
72
245
  end
73
246
  ```
74
247
 
75
- Spider a website:
248
+ Detect when a new host name is spidered:
76
249
 
77
250
  ```ruby
78
- Ronin::Web::Spider.site('https://www.example.com/index.html') do |agent|
79
- agent.every_page do |page|
80
- # ...
251
+ Ronin::Web::Spider.domain('example.com') do |spider|
252
+ spider.every_host do |host|
253
+ puts "Spidering #{host} ..."
254
+ end
255
+ end
256
+ ```
257
+
258
+ Detect when a new SSL/TLS certificate is encountered:
259
+
260
+ ```ruby
261
+ Ronin::Web::Spider.domain('example.com') do |spider|
262
+ spider.every_cert do |cert|
263
+ puts "Discovered new cert for #{cert.subject.command_name}, #{cert.subject_alt_name}"
264
+ end
265
+ end
266
+ ```
267
+
268
+ Print the MD5 checksum of every `favicon.ico` file:
269
+
270
+ ```ruby
271
+ Ronin::Web::Spider.domain('example.com') do |spider|
272
+ spider.every_favicon do |page|
273
+ puts "#{page.url}: #{page.body.md5}"
274
+ end
275
+ end
276
+ ```
277
+
278
+ Print every HTML comment:
279
+
280
+ ```ruby
281
+ Ronin::Web::Spider.domain('example.com') do |spider|
282
+ spider.every_html_comment do |comment|
283
+ puts comment
284
+ end
285
+ end
286
+ ```
287
+
288
+ Print all JavaScript source code:
289
+
290
+ ```ruby
291
+ Ronin::Web::Spider.domain('example.com') do |spider|
292
+ spider.every_javascript do |js|
293
+ puts js
294
+ end
295
+ end
296
+ ```
297
+
298
+ Print every JavaScript string literal:
299
+
300
+ ```ruby
301
+ Ronin::Web::Spider.domain('example.com') do |spider|
302
+ spider.every_javascript_string do |str|
303
+ puts str
304
+ end
305
+ end
306
+ ```
307
+
308
+ Print every JavaScript comment:
309
+
310
+ ```ruby
311
+ Ronin::Web::Spider.domain('example.com') do |spider|
312
+ spider.every_javascript_comment do |comment|
313
+ puts comment
314
+ end
315
+ end
316
+ ```
317
+
318
+ Print every HTML and JavaScript comment:
319
+
320
+ ```ruby
321
+ Ronin::Web::Spider.domain('example.com') do |spider|
322
+ spider.every_comment do |comment|
323
+ puts comment
324
+ end
325
+ end
326
+ ```
327
+
328
+ Spider a host and archive every web page:
329
+
330
+ ```ruby
331
+ require 'ronin/web/spider'
332
+ require 'ronin/web/spider/archive'
333
+
334
+ Ronin::Web::Spider::Archive.open('path/to/root') do |archive|
335
+ Ronin::Web::Spider.every_page(host: 'example.com') do |page|
336
+ archive.write(page.url,page.body)
337
+ end
338
+ end
339
+ ```
340
+
341
+ Spider a host and archive every web page to a Git repository:
342
+
343
+ ```ruby
344
+ require 'ronin/web/spider/git_archive'
345
+ require 'ronin/web/spider'
346
+ require 'date'
347
+
348
+ Ronin::Web::Spider::GitArchive.open('path/to/root') do |archive|
349
+ archive.commit("Updated #{Date.today}") do
350
+ Ronin::Web::Spider.every_page(host: 'example.com') do |page|
351
+ archive.write(page.url,page.body)
352
+ end
81
353
  end
82
354
  end
83
355
  ```
@@ -119,7 +391,7 @@ gem.add_dependency 'ronin-web-spider', '~> 0.1'
119
391
 
120
392
  ## License
121
393
 
122
- Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
394
+ Copyright (c) 2006-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
123
395
 
124
396
  ronin-web-spider is free software: you can redistribute it and/or modify
125
397
  it under the terms of the GNU Lesser General Public License as published
data/gemspec.yml CHANGED
@@ -11,10 +11,10 @@ homepage: https://ronin-rb.dev/
11
11
  has_yard: true
12
12
 
13
13
  metadata:
14
- documentation_uri: https://rubydoc.info/gems/ronin-web-spider
14
+ documentation_uri: https://ronin-rb.dev/docs/ronin-web-spider
15
15
  source_code_uri: https://github.com/ronin-rb/ronin-web-spider
16
16
  bug_tracker_uri: https://github.com/ronin-rb/ronin-web-spider/issues
17
- changelog_uri: https://github.com/ronin-rb/ronin-web-spider/blob/master/ChangeLog.md
17
+ changelog_uri: https://github.com/ronin-rb/ronin-web-spider/blob/main/ChangeLog.md
18
18
  rubygems_mfa_required: 'true'
19
19
 
20
20
  required_ruby_version: ">= 3.0.0"
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # ronin-web-spider - A collection of common web spidering routines.
3
3
  #
4
- # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ # Copyright (c) 2006-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
5
5
  #
6
6
  # ronin-web-spider is free software: you can redistribute it and/or modify
7
7
  # it under the terms of the GNU Lesser General Public License as published
@@ -122,6 +122,8 @@ module Ronin
122
122
  # The visited host names.
123
123
  #
124
124
  # @return [Set<String>, nil]
125
+ #
126
+ # @api public
125
127
  attr_reader :visited_hosts
126
128
 
127
129
  #
@@ -132,6 +134,13 @@ module Ronin
132
134
  #
133
135
  # @yieldparam [String] host
134
136
  #
137
+ # @example
138
+ # spider.every_host do |host|
139
+ # puts "Spidring #{host} ..."
140
+ # end
141
+ #
142
+ # @api public
143
+ #
135
144
  def every_host
136
145
  @visited_hosts ||= Set.new
137
146
 
@@ -147,6 +156,8 @@ module Ronin
147
156
  # All certificates encountered while spidering.
148
157
  #
149
158
  # @return [Array<Ronin::Support::Crypto::Cert>]
159
+ #
160
+ # @api public
150
161
  attr_reader :collected_certs
151
162
 
152
163
  #
@@ -157,6 +168,13 @@ module Ronin
157
168
  #
158
169
  # @yieldparam [Ronin::Support::Crypto::Cert]
159
170
  #
171
+ # @example
172
+ # spider.every_cert do |cert|
173
+ # puts "Discovered new cert for #{cert.subject.command_name}, #{cert.subject_alt_name}"
174
+ # end
175
+ #
176
+ # @api public
177
+ #
160
178
  def every_cert
161
179
  @collected_certs ||= []
162
180
 
@@ -185,8 +203,15 @@ module Ronin
185
203
  # @yieldparam [Spidr::Page] favicon
186
204
  # An encountered `.ico` file.
187
205
  #
206
+ # @example
207
+ # spider.every_favicon do |page|
208
+ # # ...
209
+ # end
210
+ #
188
211
  # @see https://rubydoc.info/gems/spidr/Spidr/Page
189
212
  #
213
+ # @api public
214
+ #
190
215
  def every_favicon
191
216
  every_page do |page|
192
217
  yield page if page.icon?
@@ -197,12 +222,19 @@ module Ronin
197
222
  # Passes every non-empty HTML comment to the given block.
198
223
  #
199
224
  # @yield [comment]
200
- # The given block will be passevery HTML comment.
225
+ # The given block will be pass every HTML comment.
201
226
  #
202
227
  # @yieldparam [String] comment
203
228
  # The HTML comment inner text, with leading and trailing whitespace
204
229
  # stripped.
205
230
  #
231
+ # @example
232
+ # spider.every_html_comment do |comment|
233
+ # puts comment
234
+ # end
235
+ #
236
+ # @api public
237
+ #
206
238
  def every_html_comment
207
239
  every_html_page do |page|
208
240
  page.doc.xpath('//comment()').each do |comment|
@@ -224,6 +256,13 @@ module Ronin
224
256
  # @yieldparam [String] js
225
257
  # The JavaScript source code.
226
258
  #
259
+ # @example
260
+ # spider.every_javascript do |js|
261
+ # puts js
262
+ # end
263
+ #
264
+ # @api public
265
+ #
227
266
  def every_javascript
228
267
  # yield inner text of every `<script type="text/javascript">` tag
229
268
  # and every `.js` URL.
@@ -252,6 +291,13 @@ module Ronin
252
291
  # @yieldparam [String] string
253
292
  # The parsed contents of a JavaScript string.
254
293
  #
294
+ # @example
295
+ # spider.every_javascript_string do |str|
296
+ # puts str
297
+ # end
298
+ #
299
+ # @api public
300
+ #
255
301
  def every_javascript_string
256
302
  every_javascript do |js|
257
303
  js.scan(Support::Text::Patterns::STRING) do |js_string|
@@ -271,6 +317,13 @@ module Ronin
271
317
  # @yieldparam [String] comment
272
318
  # The contents of a JavaScript comment.
273
319
  #
320
+ # @example
321
+ # spider.every_javascript_comment do |comment|
322
+ # puts comment
323
+ # end
324
+ #
325
+ # @api public
326
+ #
274
327
  def every_javascript_comment(&block)
275
328
  every_javascript do |js|
276
329
  js.scan(Support::Text::Patterns::JAVASCRIPT_COMMENT,&block)
@@ -288,9 +341,16 @@ module Ronin
288
341
  # @yieldparam [String] comment
289
342
  # The contents of a HTML or JavaScript comment.
290
343
  #
344
+ # @example
345
+ # spider.every_comment do |comment|
346
+ # puts comment
347
+ # end
348
+ #
291
349
  # @see #every_html_comment
292
350
  # @see #every_javascript_comment
293
351
  #
352
+ # @api public
353
+ #
294
354
  def every_comment(&block)
295
355
  every_html_comment(&block)
296
356
  every_javascript_comment(&block)
@@ -29,6 +29,9 @@ module Ronin
29
29
  #
30
30
  # Spider a host and archive every web page:
31
31
  #
32
+ # require 'ronin/web/spider'
33
+ # require 'ronin/web/spider/archive'
34
+ #
32
35
  # Ronin::Web::Spider::Archive.open('path/to/root') do |archive|
33
36
  # Ronin::Web::Spider.every_page(host: 'example.com') do |page|
34
37
  # archive.write(page.url,page.body)
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # ronin-web-spider - A collection of common web spidering routines.
3
3
  #
4
- # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ # Copyright (c) 2006-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
5
5
  #
6
6
  # ronin-web-spider is free software: you can redistribute it and/or modify
7
7
  # it under the terms of the GNU Lesser General Public License as published
@@ -30,8 +30,8 @@ module Ronin
30
30
  #
31
31
  # Spider a host and archive every web page to a Git repository:
32
32
  #
33
- # require 'ronin/web/spider/git_archive'
34
33
  # require 'ronin/web/spider'
34
+ # require 'ronin/web/spider/git_archive'
35
35
  # require 'date'
36
36
  #
37
37
  # Ronin::Web::Spider::GitArchive.open('path/to/root') do |archive|
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # ronin-web-spider - A collection of common web spidering routines.
3
3
  #
4
- # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ # Copyright (c) 2006-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
5
5
  #
6
6
  # ronin-web-spider is free software: you can redistribute it and/or modify
7
7
  # it under the terms of the GNU Lesser General Public License as published
@@ -21,7 +21,7 @@ module Ronin
21
21
  module Web
22
22
  module Spider
23
23
  # ronin-web-spider version
24
- VERSION = '0.1.0.beta1'
24
+ VERSION = '0.1.0'
25
25
  end
26
26
  end
27
27
  end