wombat 2.8.0 → 3.0.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: bb1c11ccd6d54a4b1cdd9f9f4841803020bd56585feffd411a8d21813d811b27
4
- data.tar.gz: f77dc116067bddd1b01cb48de6d314b4285f929772b6546b9e6689cd6022f01b
3
+ metadata.gz: f1909fd5e86c31b2cf15c7ed6d64659c7da25137c161cfa67a9f39f4f2fd2de7
4
+ data.tar.gz: 5dbb06acbb4437ae8879a4994b885006fb7d0c4841005436e9566376e824f593
5
5
  SHA512:
6
- metadata.gz: 4892667469be2d4001b93d84e255b07bc7007f81dc8eb4630590388351cc9e6754e2887b9fbd61fc35f423e2db00bf58cab0141753d43cf4b5734dd1f23e951a
7
- data.tar.gz: 86a289188d0b12010157d0c979f4bbe3420a31a91cb8783b17286e01b23772085b832ae2c6a6dd0f2e5a253ec9a8a3cf666217fb74a5bf7f066c09e1ac4f2772
6
+ metadata.gz: 2afe281d0f9232398a349c3153c629bfe3a00c0a31be023fdc0a90a9573554123d84ac049e1898c44b0fc8cce24f3882f0ce4d441057622adbca4a3f1da41bf9
7
+ data.tar.gz: 2cc81b88d83a0719b0f37887b3047ddf22c67b6f1d7c0ba194bfaafc0fd1600308f410ae71d64ba171f3bbf571f90853727a7bf69dde08f8801b949e0540ed31
@@ -0,0 +1,11 @@
1
+ # To get started with Dependabot version updates, you'll need to specify which
2
+ # package ecosystems to update and where the package manifests are located.
3
+ # # Please see the documentation for all configuration options:
4
+ # # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5
+ #
6
+ version: 2
7
+ updates:
8
+ - package-ecosystem: "bundler" # See documentation for possible values
9
+ directory: "/" # Location of package manifests
10
+ schedule:
11
+ interval: "weekly"
@@ -0,0 +1,31 @@
1
+ name: Wombat CI
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [master]
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v2
13
+ - name: Restore Bundler cache
14
+ uses: actions/cache@v2
15
+ id: cache
16
+ with:
17
+ path: vendor/bundle
18
+ key: ${{ runner.os }}-bundle-${{ hashFiles('**/Gemfile.lock') }}
19
+ restore-keys: |
20
+ ${{ runner.os }}-bundle-
21
+ - name: Set up Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: 3.1.2
25
+
26
+ - name: Install dependencies
27
+ run: |
28
+ bundle config path vendor/bundle
29
+ bundle install --jobs 4 --retry 3
30
+ - name: Run tests
31
+ run: bundle exec rake test
data/.travis.yml CHANGED
@@ -1,7 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.2
4
- - 2.3.0
5
- - 2.4.1
3
+ - 2.5.0
4
+ - 2.6.3
6
5
  notifications:
7
6
  webhooks: https://app.fossa.io/hooks/travisci
data/CHANGELOG.md CHANGED
@@ -1,4 +1,18 @@
1
- ### version 2.6.0 (2017-11-24)
1
+ ### version 2.10.0 (2019-09-02)
2
+
3
+ * Bump gem dependencies to address rest-client security vulnerability
4
+ * Minimum supported Ruby version is now v2.5.0
5
+
6
+ ### version 2.9.0 (2019-07-09)
7
+
8
+ * Bump all gem dependencies to address security vulnerabilities
9
+ * Minimum supported Ruby version is now v2.3.0
10
+
11
+ ### version 2.8.0 (2018-11-27)
12
+
13
+ * Bump rack to version 2.0.6
14
+
15
+ ### version 2.7.0 (2017-11-24)
2
16
 
3
17
  * Bump activesupport to version 5.1.4
4
18
 
data/Gemfile CHANGED
@@ -1,14 +1,14 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem 'mechanize'
3
+ gem 'mechanize', '~> 2.8.5'
4
4
  gem 'activesupport'
5
5
  gem 'rest-client'
6
6
 
7
7
  group :development, :test do
8
8
  gem 'bundler'
9
+ gem 'jeweler'
9
10
  gem 'rake'
10
11
  gem 'yard'
11
- gem 'jeweler'
12
12
  gem 'rspec'
13
13
  gem 'vcr'
14
14
  gem 'webmock'
data/Gemfile.lock CHANGED
@@ -1,142 +1,180 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activesupport (5.2.0)
4
+ activesupport (7.0.3.1)
5
5
  concurrent-ruby (~> 1.0, >= 1.0.2)
6
- i18n (>= 0.7, < 2)
7
- minitest (~> 5.1)
8
- tzinfo (~> 1.1)
9
- addressable (2.4.0)
10
- builder (3.2.3)
11
- concurrent-ruby (1.0.5)
12
- connection_pool (2.2.2)
13
- coveralls (0.8.22)
6
+ i18n (>= 1.6, < 2)
7
+ minitest (>= 5.1)
8
+ tzinfo (~> 2.0)
9
+ addressable (2.8.1)
10
+ public_suffix (>= 2.0.2, < 6.0)
11
+ builder (3.2.4)
12
+ concurrent-ruby (1.1.10)
13
+ connection_pool (2.2.5)
14
+ coveralls (0.8.23)
14
15
  json (>= 1.8, < 3)
15
16
  simplecov (~> 0.16.1)
16
17
  term-ansicolor (~> 1.3)
17
- thor (~> 0.19.4)
18
+ thor (>= 0.19.4, < 2.0)
18
19
  tins (~> 1.6)
19
- crack (0.4.3)
20
- safe_yaml (~> 1.0.0)
20
+ crack (0.4.5)
21
+ rexml
21
22
  descendants_tracker (0.0.4)
22
23
  thread_safe (~> 0.3, >= 0.3.1)
23
- diff-lcs (1.3)
24
- docile (1.3.1)
25
- domain_name (0.5.20180417)
24
+ diff-lcs (1.5.0)
25
+ docile (1.4.0)
26
+ domain_name (0.5.20190701)
26
27
  unf (>= 0.0.5, < 1.0.0)
27
- faraday (0.9.2)
28
- multipart-post (>= 1.2, < 3)
29
- git (1.4.0)
30
- github_api (0.16.0)
31
- addressable (~> 2.4.0)
28
+ faraday (1.10.2)
29
+ faraday-em_http (~> 1.0)
30
+ faraday-em_synchrony (~> 1.0)
31
+ faraday-excon (~> 1.1)
32
+ faraday-httpclient (~> 1.0)
33
+ faraday-multipart (~> 1.0)
34
+ faraday-net_http (~> 1.0)
35
+ faraday-net_http_persistent (~> 1.0)
36
+ faraday-patron (~> 1.0)
37
+ faraday-rack (~> 1.0)
38
+ faraday-retry (~> 1.0)
39
+ ruby2_keywords (>= 0.0.4)
40
+ faraday-em_http (1.0.0)
41
+ faraday-em_synchrony (1.0.0)
42
+ faraday-excon (1.1.0)
43
+ faraday-httpclient (1.0.1)
44
+ faraday-multipart (1.0.4)
45
+ multipart-post (~> 2)
46
+ faraday-net_http (1.0.1)
47
+ faraday-net_http_persistent (1.2.0)
48
+ faraday-patron (1.0.0)
49
+ faraday-rack (1.0.0)
50
+ faraday-retry (1.0.3)
51
+ git (1.12.0)
52
+ addressable (~> 2.8)
53
+ rchardet (~> 1.8)
54
+ github_api (0.19.0)
55
+ addressable (~> 2.4)
32
56
  descendants_tracker (~> 0.0.4)
33
- faraday (~> 0.8, < 0.10)
34
- hashie (>= 3.4)
35
- mime-types (>= 1.16, < 3.0)
57
+ faraday (>= 0.8, < 2)
58
+ hashie (~> 3.5, >= 3.5.2)
36
59
  oauth2 (~> 1.0)
37
- hashdiff (0.3.7)
38
- hashie (3.5.7)
39
- highline (2.0.0)
40
- http-cookie (1.0.3)
60
+ hashdiff (1.0.1)
61
+ hashie (3.6.0)
62
+ highline (2.0.3)
63
+ http-accept (1.7.0)
64
+ http-cookie (1.0.5)
41
65
  domain_name (~> 0.5)
42
- i18n (1.0.1)
66
+ i18n (1.12.0)
43
67
  concurrent-ruby (~> 1.0)
44
- jeweler (2.3.9)
68
+ jeweler (2.1.1)
45
69
  builder
46
- bundler
70
+ bundler (>= 1.0)
47
71
  git (>= 1.2.5)
48
- github_api (~> 0.16.0)
72
+ github_api
49
73
  highline (>= 1.6.15)
50
74
  nokogiri (>= 1.5.10)
51
- psych
52
75
  rake
53
76
  rdoc
54
- semver2
55
- json (2.1.0)
56
- jwt (1.5.6)
57
- mechanize (2.7.6)
58
- domain_name (~> 0.5, >= 0.5.1)
59
- http-cookie (~> 1.0)
60
- mime-types (>= 1.17.2)
61
- net-http-digest_auth (~> 1.1, >= 1.1.1)
62
- net-http-persistent (>= 2.5.2)
63
- nokogiri (~> 1.6)
64
- ntlm-http (~> 0.1, >= 0.1.1)
65
- webrobots (>= 0.0.9, < 0.2)
66
- mime-types (2.99.3)
67
- mini_portile2 (2.3.0)
68
- minitest (5.11.3)
69
- multi_json (1.13.1)
77
+ semver
78
+ json (2.6.2)
79
+ jwt (2.4.1)
80
+ mechanize (2.8.5)
81
+ addressable (~> 2.8)
82
+ domain_name (~> 0.5, >= 0.5.20190701)
83
+ http-cookie (~> 1.0, >= 1.0.3)
84
+ mime-types (~> 3.0)
85
+ net-http-digest_auth (~> 1.4, >= 1.4.1)
86
+ net-http-persistent (>= 2.5.2, < 5.0.dev)
87
+ nokogiri (~> 1.11, >= 1.11.2)
88
+ rubyntlm (~> 0.6, >= 0.6.3)
89
+ webrick (~> 1.7)
90
+ webrobots (~> 0.1.2)
91
+ mime-types (3.4.1)
92
+ mime-types-data (~> 3.2015)
93
+ mime-types-data (3.2022.0105)
94
+ minitest (5.16.3)
95
+ multi_json (1.15.0)
70
96
  multi_xml (0.6.0)
71
- multipart-post (2.0.0)
97
+ multipart-post (2.2.3)
72
98
  net-http-digest_auth (1.4.1)
73
- net-http-persistent (3.0.0)
99
+ net-http-persistent (4.0.1)
74
100
  connection_pool (~> 2.2)
75
101
  netrc (0.11.0)
76
- nokogiri (1.8.4)
77
- mini_portile2 (~> 2.3.0)
78
- ntlm-http (0.1.1)
79
- oauth2 (1.4.0)
80
- faraday (>= 0.8, < 0.13)
81
- jwt (~> 1.0)
102
+ nokogiri (1.13.8-x86_64-linux)
103
+ racc (~> 1.4)
104
+ oauth2 (1.4.10)
105
+ faraday (>= 0.17.3, < 3.0)
106
+ jwt (>= 1.0, < 3.0)
82
107
  multi_json (~> 1.3)
83
108
  multi_xml (~> 0.5)
84
109
  rack (>= 1.2, < 3)
85
- psych (3.0.2)
86
- rack (2.0.6)
87
- rake (12.3.1)
88
- rdoc (6.0.4)
89
- rest-client (2.0.2)
110
+ psych (4.0.4)
111
+ stringio
112
+ public_suffix (5.0.0)
113
+ racc (1.6.0)
114
+ rack (2.2.4)
115
+ rake (13.0.6)
116
+ rchardet (1.8.0)
117
+ rdoc (6.4.0)
118
+ psych (>= 4.0.0)
119
+ rest-client (2.1.0)
120
+ http-accept (>= 1.7.0, < 2.0)
90
121
  http-cookie (>= 1.0.2, < 2.0)
91
122
  mime-types (>= 1.16, < 4.0)
92
123
  netrc (~> 0.8)
93
- rspec (3.7.0)
94
- rspec-core (~> 3.7.0)
95
- rspec-expectations (~> 3.7.0)
96
- rspec-mocks (~> 3.7.0)
97
- rspec-core (3.7.1)
98
- rspec-support (~> 3.7.0)
99
- rspec-expectations (3.7.0)
124
+ rexml (3.2.5)
125
+ rspec (3.11.0)
126
+ rspec-core (~> 3.11.0)
127
+ rspec-expectations (~> 3.11.0)
128
+ rspec-mocks (~> 3.11.0)
129
+ rspec-core (3.11.0)
130
+ rspec-support (~> 3.11.0)
131
+ rspec-expectations (3.11.0)
100
132
  diff-lcs (>= 1.2.0, < 2.0)
101
- rspec-support (~> 3.7.0)
102
- rspec-mocks (3.7.0)
133
+ rspec-support (~> 3.11.0)
134
+ rspec-mocks (3.11.1)
103
135
  diff-lcs (>= 1.2.0, < 2.0)
104
- rspec-support (~> 3.7.0)
105
- rspec-support (3.7.1)
106
- safe_yaml (1.0.4)
107
- semver2 (3.4.2)
136
+ rspec-support (~> 3.11.0)
137
+ rspec-support (3.11.0)
138
+ ruby2_keywords (0.0.5)
139
+ rubyntlm (0.6.3)
140
+ semver (1.0.1)
108
141
  simplecov (0.16.1)
109
142
  docile (~> 1.1)
110
143
  json (>= 1.8, < 3)
111
144
  simplecov-html (~> 0.10.0)
112
145
  simplecov-html (0.10.2)
113
- term-ansicolor (1.6.0)
146
+ stringio (3.0.2)
147
+ sync (0.5.0)
148
+ term-ansicolor (1.7.1)
114
149
  tins (~> 1.0)
115
- thor (0.19.4)
150
+ thor (1.2.1)
116
151
  thread_safe (0.3.6)
117
- tins (1.16.3)
118
- tzinfo (1.2.5)
119
- thread_safe (~> 0.1)
152
+ tins (1.31.1)
153
+ sync
154
+ tzinfo (2.0.5)
155
+ concurrent-ruby (~> 1.0)
120
156
  unf (0.1.4)
121
157
  unf_ext
122
- unf_ext (0.0.7.5)
123
- vcr (4.0.0)
124
- webmock (3.4.2)
125
- addressable (>= 2.3.6)
158
+ unf_ext (0.0.8.2)
159
+ vcr (6.1.0)
160
+ webmock (3.18.1)
161
+ addressable (>= 2.8.0)
126
162
  crack (>= 0.3.2)
127
- hashdiff
163
+ hashdiff (>= 0.4.0, < 2.0.0)
164
+ webrick (1.7.0)
128
165
  webrobots (0.1.2)
129
- yard (0.9.15)
166
+ yard (0.9.28)
167
+ webrick (~> 1.7.0)
130
168
 
131
169
  PLATFORMS
132
- ruby
170
+ x86_64-linux
133
171
 
134
172
  DEPENDENCIES
135
173
  activesupport
136
174
  bundler
137
175
  coveralls
138
176
  jeweler
139
- mechanize
177
+ mechanize (~> 2.8.5)
140
178
  rake
141
179
  rest-client
142
180
  rspec
@@ -145,4 +183,4 @@ DEPENDENCIES
145
183
  yard
146
184
 
147
185
  BUNDLED WITH
148
- 1.17.1
186
+ 2.3.20
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # Wombat
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/wombat.svg)](https://badge.fury.io/rb/wombat)
4
- [![CI Build Status](https://secure.travis-ci.org/felipecsl/wombat.png?branch=master)][travis]
5
- [![Dependency Status](https://gemnasium.com/felipecsl/wombat.png?travis)][gemnasium]
6
- [![Code Climate](https://codeclimate.com/github/felipecsl/wombat.png)][codeclimate]
3
+ [![Gem Version](https://badge.fury.io/rb/wombat.svg)](https://badge.fury.io/rb/wombat)
4
+ [![CI Build Status](https://secure.travis-ci.org/felipecsl/wombat.png?branch=master)][travis]
5
+ [![Dependency Status](https://gemnasium.com/felipecsl/wombat.png?travis)][gemnasium]
6
+ [![Code Climate](https://codeclimate.com/github/felipecsl/wombat.png)][codeclimate]
7
7
  [![Coverage Status](https://coveralls.io/repos/felipecsl/wombat/badge.png?branch=master)][coveralls]
8
8
  [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Ffelipecsl%2Fwombat.svg?type=shield)][fossa]
9
9
 
@@ -70,7 +70,7 @@ end
70
70
  ### This is just a sneak peek of what Wombat can do. For the complete documentation, please check the links below:
71
71
 
72
72
  ### [Wiki](http://github.com/felipecsl/wombat/wiki)
73
- ### [API Documentation](http://rubydoc.info/gems/wombat/2.1.1/frames)
73
+ ### [API Documentation](https://rubydoc.info/gems/wombat)
74
74
  ### [Changelog](https://github.com/felipecsl/wombat/blob/master/CHANGELOG.md)
75
75
 
76
76
  ## Contributing to Wombat
@@ -90,7 +90,7 @@ end
90
90
 
91
91
  ## Copyright
92
92
 
93
- Copyright (c) 2012 Felipe Lima. See LICENSE.txt for further details.
93
+ Copyright (c) 2019 Felipe Lima. See LICENSE.txt for further details.
94
94
 
95
95
 
96
96
  ## License
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.8.0
1
+ 3.0.0
@@ -3,24 +3,16 @@ http_interactions:
3
3
  - request:
4
4
  method: get
5
5
  uri: http://ws.audioscrobbler.com/2.0/?api_key=060decb474b73437d5bbec37f527ae7b&location=San%20Francisco&method=geo.getevents
6
- body: ''
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
7
9
  headers:
8
- accept:
9
- - ! '*/*'
10
- user-agent:
11
- - Mechanize/2.1 Ruby/1.9.3p0 (http://github.com/tenderlove/mechanize/)
12
- accept-encoding:
13
- - gzip,deflate,identity
14
- accept-charset:
15
- - ISO-8859-1,utf-8;q=0.7,*;q=0.7
16
- accept-language:
17
- - en-us,en;q=0.5
18
- host:
19
- - ws.audioscrobbler.com
20
- connection:
21
- - keep-alive
22
- keep-alive:
23
- - 300
10
+ Accept:
11
+ - "*/*"
12
+ User-Agent:
13
+ - rest-client/2.1.0 (darwin17.3.0 x86_64) ruby/2.5.0p0
14
+ Host:
15
+ - ws.audioscrobbler.com
24
16
  response:
25
17
  status:
26
18
  code: 200
@@ -49,7 +49,6 @@ module Wombat
49
49
  private
50
50
  def parser_for(metadata, url)
51
51
  url ||= "#{metadata[:base_url]}#{metadata[:path]}"
52
- page = nil
53
52
  parser = nil
54
53
  _method = method_from(metadata[:http_method])
55
54
  data = metadata[:data]
@@ -64,7 +63,7 @@ module Wombat
64
63
  parser.headers = @page.header
65
64
  else
66
65
  @page = RestClient.public_send(_method, *args) unless @page
67
- parser = Nokogiri::XML @page
66
+ parser = Nokogiri::XML(decode_body)
68
67
  parser.headers = @page.headers
69
68
  end
70
69
  @response_code = @page.code.to_i if @page.respond_to? :code
@@ -79,6 +78,15 @@ module Wombat
79
78
  end
80
79
  end
81
80
 
81
+ def decode_body
82
+ # Check if it's gzip encoded
83
+ if @page.body.start_with?("\x1F\x8B".b)
84
+ Zlib::GzipReader.new(StringIO.new(@page.body)).read
85
+ else
86
+ @page.body
87
+ end
88
+ end
89
+
82
90
  def method_from(_method)
83
91
  return :get if _method.nil?
84
92
  HTTP_METHODS.detect(->{:get}){ |i| i == _method.downcase.to_sym }
@@ -4,10 +4,10 @@ describe Wombat::DSL::Property do
4
4
  it 'should store property data' do
5
5
  callback = lambda { false }
6
6
  property = Wombat::DSL::Property.new("title", *["/some/selector", :html], &callback)
7
-
8
- property.wombat_property_name.should == "title"
9
- property.selector.should == "/some/selector"
10
- property.format.should == :html
11
- property.callback.should == callback
7
+
8
+ property.wombat_property_name.should eq "title"
9
+ property.selector.should eq "/some/selector"
10
+ property.format.should eq :html
11
+ property.callback.should eq callback
12
12
  end
13
13
  end
@@ -22,7 +22,7 @@ describe 'following pages referred by relative links' do
22
22
  results = crawler_instance.crawl
23
23
 
24
24
  # There are many entries. It's enough to check first three ones
25
- results["vocabulary"][0..2].should == [
25
+ results["vocabulary"][0..2].should eq [
26
26
  {"entry"=>{"word"=>"Dmoz", "description"=>"Dmoz - второй по популярности каталог сайтов после Яндекс-Каталога. Адрес каталога Dmoz - .\r\n\r\nЗаметка: Как вы думаете, мебель из Китая дорого стоит? Правильно, она недорогая. поставляет не только мебель, но и китайскую сантехнику, люстры, светильники и многое другое. Если вы хотите здорово съэкономить, то не пропустите такую возможность."}},
27
27
  {"entry"=>{"word"=>"PR", "description"=>"PR - PageRank - показатель Google для конкретной страницы сайта. Зависит от количества ссылок на страницу и от качества этих ссылок. Учитываются и ссылки с внутренних страниц сайта. PR влияет на выдачу в поисковой системе Google. Повысить PR сайту можно внутренней перелинковкой. PR бывает тулбарный и внутренний. Апдейт PR происходит, как правило, несколько раз в год. Сейчас у этого блога PR=2, а у сайта PR равен 3."}},
28
28
  {"entry"=>{"word"=>"Sape (сапа)", "description"=>"Sape (сапа) - это самая популярная в России биржа ссылок. Адрес: www.sape.ru. Веб-мастер может продать ссылки со своего сайта, а оптимизатор купить ссылки. Продажа ссылок осуществляется с ежемесячной оплатой. Цена на ссылки устанавливается веб-мастером для своего сайта. Для продажи ссылок на сайте размещается специальный код системы и в дальнейшем вся продажа происходит автоматически через веб-интерфейс Sape.\r\n\r\nЗаметка: Интересует монтаж и эксплуатация противопожарных металлических ДПМ или ? Читайте технологическую документацию и нормативные документы."}}
@@ -25,10 +25,10 @@ describe 'basic crawler setup' do
25
25
 
26
26
  results = crawler_instance.crawl
27
27
 
28
- results["search"].should == "Buscar"
29
- results["links"].should == [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
30
- results["subheader"].should == "Londres 2012"
31
- results["social"]["twitter"].should == "Verão"
28
+ results["search"].should eq "Buscar"
29
+ results["links"].should eq [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
30
+ results["subheader"].should eq "Londres 2012"
31
+ results["social"]["twitter"].should eq "Verão"
32
32
  end
33
33
  end
34
34
 
@@ -56,10 +56,10 @@ describe 'basic crawler setup' do
56
56
 
57
57
  results = crawler_instance.crawl
58
58
 
59
- results["search"].should == "Buscar"
60
- results["links"].should == [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
61
- results["subheader"].should == "Londres 2012"
62
- results["social"]["twitter"].should == "Verão"
59
+ results["search"].should eq "Buscar"
60
+ results["links"].should eq [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
61
+ results["subheader"].should eq "Londres 2012"
62
+ results["social"]["twitter"].should eq "Verão"
63
63
  end
64
64
  end
65
65
 
@@ -86,10 +86,10 @@ describe 'basic crawler setup' do
86
86
 
87
87
  results = crawler_instance.crawl
88
88
 
89
- results["search"].should == "Buscar"
90
- results["links"].should == [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
91
- results["subheader"].should == "Londres 2012"
92
- results["social"]["twitter"].should == "Verão"
89
+ results["search"].should eq "Buscar"
90
+ results["links"].should eq [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
91
+ results["subheader"].should eq "Londres 2012"
92
+ results["social"]["twitter"].should eq "Verão"
93
93
  end
94
94
  end
95
95
 
@@ -112,13 +112,13 @@ describe 'basic crawler setup' do
112
112
  results = crawler_instance.crawl
113
113
  end
114
114
 
115
- results["links"].should == result_hash
115
+ results["links"].should eq result_hash
116
116
 
117
117
  VCR.use_cassette('basic_crawler_page') do
118
118
  results = crawler_instance.crawl
119
119
  end
120
120
 
121
- results["links"].should == result_hash
121
+ results["links"].should eq result_hash
122
122
  end
123
123
 
124
124
  it 'should crawl page through block to class instance crawl method' do
@@ -145,10 +145,10 @@ describe 'basic crawler setup' do
145
145
  end
146
146
  end
147
147
 
148
- results["search"].should == "Buscar"
149
- results["links"].should == [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
150
- results["subheader"].should == "Londres 2012"
151
- results["social"]["twitter"].should == "Verão"
148
+ results["search"].should eq "Buscar"
149
+ results["links"].should eq [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
150
+ results["subheader"].should eq "Londres 2012"
151
+ results["social"]["twitter"].should eq "Verão"
152
152
  end
153
153
  end
154
154
 
@@ -173,10 +173,10 @@ describe 'basic crawler setup' do
173
173
  end
174
174
  end
175
175
 
176
- results["search"].should == "Buscar"
177
- results["links"].should == [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
178
- results["subheader"].should == "Londres 2012"
179
- results["social"]["twitter"].should == "Verão"
176
+ results["search"].should eq "Buscar"
177
+ results["links"].should eq [{"menu"=>"Agenda"}, {"menu"=>"Brasileiro"}, {"menu"=>"Brasil"}, {"menu"=>"Bolsas"}, {"menu"=>"Cinema"}, {"menu"=>"Galerias de Fotos"}, {"menu"=>"Beleza"}, {"menu"=>"Esportes"}, {"menu"=>"Assine o RSS"}]
178
+ results["subheader"].should eq "Londres 2012"
179
+ results["social"]["twitter"].should eq "Verão"
180
180
  end
181
181
  end
182
182
 
@@ -197,14 +197,14 @@ describe 'basic crawler setup' do
197
197
 
198
198
  results = crawler.new.crawl
199
199
 
200
- results.should == { "repos" => [
200
+ results.should eq({ "repos" => [
201
201
  { "project" => { "repo" => "jairajs89 / Touchy.js", "description" => "A simple light-weight JavaScript library dealing with touch events" } },
202
202
  { "project" => { "repo" => "mcavage / node-restify", "description" => "node.js REST framework specifically meant web service APIs" } },
203
203
  { "project" => { "repo" => "notlion / streetview-stereographic", "description" => "Shader Toy + Google Map + Panoramic Explorer" } },
204
204
  { "project" => { "repo" => "twitter / bootstrap", "description" => "HTML, CSS, and JS toolkit from Twitter" } },
205
205
  { "project" => { "repo" => "stolksdorf / Parallaxjs", "description" => "a Library Javascript that allows easy page parallaxing" } },
206
206
  { "project" => { "repo" => nil, "description" => nil}}
207
- ]}
207
+ ]})
208
208
  end
209
209
  end
210
210
 
@@ -215,10 +215,8 @@ describe 'basic crawler setup' do
215
215
 
216
216
  crawler.document_format :xml
217
217
  crawler.base_url "http://ws.audioscrobbler.com"
218
- crawler.path "/2.0/?method=geo.getevents&location=#{URI.escape('San Francisco')}&api_key=060decb474b73437d5bbec37f527ae7b"
219
-
218
+ crawler.path "/2.0/?method=geo.getevents&location=#{URI.encode_www_form_component('San Francisco')}&api_key=060decb474b73437d5bbec37f527ae7b"
220
219
  crawler.artist "xpath=//title", :list
221
-
222
220
  crawler.location 'xpath=//event', :iterator do
223
221
  latitude "xpath=./venue/location/geo:point/geo:lat", :text, { 'geo' => 'http://www.w3.org/2003/01/geo/wgs84_pos#' }
224
222
  longitude "xpath=./venue/location/geo:point/geo:long", :text, { 'geo' => 'http://www.w3.org/2003/01/geo/wgs84_pos#' }
@@ -228,7 +226,7 @@ describe 'basic crawler setup' do
228
226
  results = crawler_instance.crawl
229
227
  iterator = results['location']
230
228
 
231
- iterator.should == [
229
+ iterator.should eq([
232
230
  {"latitude"=>"37.807775", "longitude"=>"-122.272736"},
233
231
  {"latitude"=>"37.807717", "longitude"=>"-122.270059"},
234
232
  {"latitude"=>"37.869784", "longitude"=>"-122.267701"},
@@ -239,7 +237,7 @@ describe 'basic crawler setup' do
239
237
  {"latitude"=>"37.771079", "longitude"=>"-122.412604"},
240
238
  {"latitude"=>"37.784963", "longitude"=>"-122.418871"},
241
239
  {"latitude"=>"37.788978", "longitude"=>"-122.40664"}
242
- ]
240
+ ])
243
241
 
244
242
  results["artist"].should =~ ["Davka", "Digitalism (DJ Set)", "Gary Clark Jr.", "Lenny Kravitz", "Little Muddy", "Michael Schenker Group", "The Asteroids Galaxy Tour", "When Indie Attacks", "When Indie Attacks", "YOB"]
245
243
  end
@@ -260,7 +258,7 @@ describe 'basic crawler setup' do
260
258
  crawler_instance = crawler.new
261
259
  results = crawler_instance.crawl
262
260
 
263
- results.should == {
261
+ results.should eq({
264
262
  "github" => [
265
263
  { "heading"=>"GitHub helps people build software together." },
266
264
  { "heading"=>nil },
@@ -270,7 +268,7 @@ describe 'basic crawler setup' do
270
268
  { "heading"=>"GitHub on Your Servers" },
271
269
  { "heading"=>"Loading..." }
272
270
  ]
273
- }
271
+ })
274
272
  end
275
273
  end
276
274
 
@@ -46,7 +46,7 @@ describe Wombat::Processing::Parser do
46
46
  @metadata.http_method :get
47
47
 
48
48
  fake_document = double :document
49
- fake_parser = double :parser
49
+ fake_parser = double(:parser, body: 'foo')
50
50
  fake_header = double :header
51
51
  fake_document.should_receive(:parser).and_return(fake_parser)
52
52
  fake_document.should_receive(:header).and_return(fake_header)
@@ -58,13 +58,13 @@ describe Wombat::Processing::Parser do
58
58
  end
59
59
 
60
60
  it 'should correctly parse xml documents' do
61
- fake_document = double :xml
61
+ fake_document = double(:xml, body: 'foo')
62
62
  fake_parser = double :parser
63
63
  fake_headers = double :headers
64
64
  @metadata.document_format :xml
65
65
  @parser.mechanize.should_not_receive(:get)
66
66
  RestClient.should_receive(:get).and_return fake_document
67
- Nokogiri.should_receive(:XML).with(fake_document).and_return fake_parser
67
+ Nokogiri.should_receive(:XML).with('foo').and_return fake_parser
68
68
  fake_document.should_receive(:headers).and_return(fake_headers)
69
69
  fake_parser.should_receive(:headers=)
70
70
 
@@ -7,20 +7,15 @@ describe Wombat::Property::Locators::Html do
7
7
  fake_elem.stub inner_html: "Something cool "
8
8
  context.stub(:xpath).with("/abc", nil).and_return [fake_elem]
9
9
  property = Wombat::DSL::Property.new('data1', 'xpath=/abc', :html)
10
-
11
10
  locator = Wombat::Property::Locators::Html.new(property)
12
-
13
- locator.locate(context).should == { "data1" => "Something cool" }
11
+ locator.locate(context).should eq({ "data1" => "Something cool" })
14
12
  end
15
13
 
16
14
  it 'should return null if the property cannot be found' do
17
- fake_elem = double :element
18
15
  context = double :context
19
16
  context.stub(:xpath).with("/abc", nil).and_return []
20
17
  property = Wombat::DSL::Property.new('data1', 'xpath=/abc', :html)
21
-
22
18
  locator = Wombat::Property::Locators::Html.new(property)
23
-
24
- locator.locate(context).should == { "data1" => nil }
19
+ locator.locate(context).should eq({ "data1" => nil })
25
20
  end
26
21
  end
@@ -8,6 +8,6 @@ describe Wombat::Property::Locators::List do
8
8
 
9
9
  locator = Wombat::Property::Locators::List.new(property)
10
10
 
11
- locator.locate(context).should == { "data1" => %w(1 2 3 4 5) }
11
+ locator.locate(context).should eq({ "data1" => %w(1 2 3 4 5) })
12
12
  end
13
13
  end
@@ -10,7 +10,7 @@ describe Wombat::Property::Locators::Text do
10
10
 
11
11
  locator = Wombat::Property::Locators::Text.new(property)
12
12
 
13
- locator.locate(context).should == { "data1" => "Something cool" }
13
+ locator.locate(context).should eq({ "data1" => "Something cool" })
14
14
  end
15
15
 
16
16
  it 'should locate text property with xpath selector using xpath functions' do
@@ -20,7 +20,7 @@ describe Wombat::Property::Locators::Text do
20
20
 
21
21
  locator = Wombat::Property::Locators::Text.new(property)
22
22
 
23
- locator.locate(context).should == { "data1" => "Something" }
23
+ locator.locate(context).should eq({ "data1" => "Something" })
24
24
  end
25
25
 
26
26
  it 'should locate text property with css selector' do
@@ -32,17 +32,16 @@ describe Wombat::Property::Locators::Text do
32
32
 
33
33
  locator = Wombat::Property::Locators::Text.new(property)
34
34
 
35
- locator.locate(context).should == { "data1" => "My name" }
35
+ locator.locate(context).should eq({ "data1" => "My name" })
36
36
  end
37
37
 
38
38
  it 'should return plain symbols as strings' do
39
- fake_elem = double :element
40
39
  context = double :context
41
40
  property = Wombat::DSL::Property.new('data_2', :hardcoded_value, :text)
42
41
 
43
42
  locator = Wombat::Property::Locators::Text.new(property)
44
43
 
45
- locator.locate(context).should == { "data_2" => "hardcoded_value" }
44
+ locator.locate(context).should eq({ "data_2" => "hardcoded_value" })
46
45
  end
47
46
 
48
47
  it 'should invoke property callback' do
@@ -54,6 +53,6 @@ describe Wombat::Property::Locators::Text do
54
53
 
55
54
  locator = Wombat::Property::Locators::Text.new(property)
56
55
 
57
- locator.locate(context).should == { "data1" => "My ass" }
56
+ locator.locate(context).should eq({ "data1" => "My ass" })
58
57
  end
59
58
  end
@@ -8,7 +8,7 @@ describe SampleCrawler do
8
8
 
9
9
  it 'should correctly assign event metadata' do
10
10
  @sample_crawler.should_receive(:parse) do |args|
11
- args['event_group'].wombat_property_selector.should == "css=div.title-agenda"
11
+ args['event_group'].wombat_property_selector.should eq "css=div.title-agenda"
12
12
  it = args['event_group']
13
13
  expect(it["event"]["title"].wombat_property_selector).to eq("xpath=.")
14
14
  expect(it["event"]["date"].wombat_property_selector).to(
@@ -16,8 +16,8 @@ describe SampleCrawler do
16
16
  expect(it["event"]["type"].wombat_property_selector).to eq("xpath=.type")
17
17
  expect(it["venue"]["name"].wombat_property_selector).to eq("xpath=.")
18
18
 
19
- args[:base_url].should == 'http://www.obaoba.com.br'
20
- args[:path].should == '/porto-alegre/agenda'
19
+ args[:base_url].should eq 'http://www.obaoba.com.br'
20
+ args[:path].should eq '/porto-alegre/agenda'
21
21
  end
22
22
 
23
23
  @sample_crawler.crawl
data/spec/wombat_spec.rb CHANGED
@@ -23,9 +23,9 @@ describe Wombat do
23
23
  config.set_user_agent "Wombat"
24
24
  config.set_user_agent_alias 'Mac Safari'
25
25
  end
26
- Wombat.proxy_args.should == ["10.0.0.1", 8080]
27
- Wombat.user_agent.should == 'Wombat'
28
- Wombat.user_agent_alias.should == 'Mac Safari'
26
+ Wombat.proxy_args.should eq ["10.0.0.1", 8080]
27
+ Wombat.user_agent.should eq 'Wombat'
28
+ Wombat.user_agent_alias.should eq 'Mac Safari'
29
29
  end
30
30
 
31
31
  it 'should accept regular properties (non-selectors)' do
data/wombat.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: wombat 2.8.0 ruby lib
5
+ # stub: wombat 3.0.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "wombat".freeze
9
- s.version = "2.8.0"
9
+ s.version = "3.0.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Felipe Lima".freeze]
14
- s.date = "2018-11-28"
14
+ s.date = "2022-08-23"
15
15
  s.description = "Generic Web crawler with a DSL that parses structured data from web pages".freeze
16
16
  s.email = "felipe.lima@gmail.com".freeze
17
17
  s.extra_rdoc_files = [
@@ -20,6 +20,8 @@ Gem::Specification.new do |s|
20
20
  ]
21
21
  s.files = [
22
22
  ".document",
23
+ ".github/dependabot.yml",
24
+ ".github/workflows/ci.yml",
23
25
  ".rspec",
24
26
  ".travis.yml",
25
27
  "CHANGELOG.md",
@@ -86,45 +88,33 @@ Gem::Specification.new do |s|
86
88
  s.homepage = "http://felipecsl.github.com/wombat".freeze
87
89
  s.licenses = ["MIT".freeze]
88
90
  s.required_ruby_version = Gem::Requirement.new(">= 1.9".freeze)
89
- s.rubygems_version = "2.7.3".freeze
91
+ s.rubygems_version = "3.3.7".freeze
90
92
  s.summary = "Ruby DSL to scrape web pages".freeze
91
93
 
92
94
  if s.respond_to? :specification_version then
93
95
  s.specification_version = 4
96
+ end
94
97
 
95
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
96
- s.add_runtime_dependency(%q<mechanize>.freeze, [">= 0"])
97
- s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
98
- s.add_runtime_dependency(%q<rest-client>.freeze, [">= 0"])
99
- s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
100
- s.add_development_dependency(%q<rake>.freeze, [">= 0"])
101
- s.add_development_dependency(%q<yard>.freeze, [">= 0"])
102
- s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
103
- s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
104
- s.add_development_dependency(%q<vcr>.freeze, [">= 0"])
105
- s.add_development_dependency(%q<webmock>.freeze, [">= 0"])
106
- s.add_development_dependency(%q<coveralls>.freeze, [">= 0"])
107
- else
108
- s.add_dependency(%q<mechanize>.freeze, [">= 0"])
109
- s.add_dependency(%q<activesupport>.freeze, [">= 0"])
110
- s.add_dependency(%q<rest-client>.freeze, [">= 0"])
111
- s.add_dependency(%q<bundler>.freeze, [">= 0"])
112
- s.add_dependency(%q<rake>.freeze, [">= 0"])
113
- s.add_dependency(%q<yard>.freeze, [">= 0"])
114
- s.add_dependency(%q<jeweler>.freeze, [">= 0"])
115
- s.add_dependency(%q<rspec>.freeze, [">= 0"])
116
- s.add_dependency(%q<vcr>.freeze, [">= 0"])
117
- s.add_dependency(%q<webmock>.freeze, [">= 0"])
118
- s.add_dependency(%q<coveralls>.freeze, [">= 0"])
119
- end
98
+ if s.respond_to? :add_runtime_dependency then
99
+ s.add_runtime_dependency(%q<mechanize>.freeze, ["~> 2.8.5"])
100
+ s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
101
+ s.add_runtime_dependency(%q<rest-client>.freeze, [">= 0"])
102
+ s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
103
+ s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
104
+ s.add_development_dependency(%q<rake>.freeze, [">= 0"])
105
+ s.add_development_dependency(%q<yard>.freeze, [">= 0"])
106
+ s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
107
+ s.add_development_dependency(%q<vcr>.freeze, [">= 0"])
108
+ s.add_development_dependency(%q<webmock>.freeze, [">= 0"])
109
+ s.add_development_dependency(%q<coveralls>.freeze, [">= 0"])
120
110
  else
121
- s.add_dependency(%q<mechanize>.freeze, [">= 0"])
111
+ s.add_dependency(%q<mechanize>.freeze, ["~> 2.8.5"])
122
112
  s.add_dependency(%q<activesupport>.freeze, [">= 0"])
123
113
  s.add_dependency(%q<rest-client>.freeze, [">= 0"])
124
114
  s.add_dependency(%q<bundler>.freeze, [">= 0"])
115
+ s.add_dependency(%q<jeweler>.freeze, [">= 0"])
125
116
  s.add_dependency(%q<rake>.freeze, [">= 0"])
126
117
  s.add_dependency(%q<yard>.freeze, [">= 0"])
127
- s.add_dependency(%q<jeweler>.freeze, [">= 0"])
128
118
  s.add_dependency(%q<rspec>.freeze, [">= 0"])
129
119
  s.add_dependency(%q<vcr>.freeze, [">= 0"])
130
120
  s.add_dependency(%q<webmock>.freeze, [">= 0"])
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wombat
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felipe Lima
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-28 00:00:00.000000000 Z
11
+ date: 2022-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mechanize
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 2.8.5
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 2.8.5
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: jeweler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: yard
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: jeweler
98
+ name: yard
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -173,6 +173,8 @@ extra_rdoc_files:
173
173
  - README.md
174
174
  files:
175
175
  - ".document"
176
+ - ".github/dependabot.yml"
177
+ - ".github/workflows/ci.yml"
176
178
  - ".rspec"
177
179
  - ".travis.yml"
178
180
  - CHANGELOG.md
@@ -239,7 +241,7 @@ homepage: http://felipecsl.github.com/wombat
239
241
  licenses:
240
242
  - MIT
241
243
  metadata: {}
242
- post_install_message:
244
+ post_install_message:
243
245
  rdoc_options: []
244
246
  require_paths:
245
247
  - lib
@@ -254,9 +256,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
254
256
  - !ruby/object:Gem::Version
255
257
  version: '0'
256
258
  requirements: []
257
- rubyforge_project:
258
- rubygems_version: 2.7.3
259
- signing_key:
259
+ rubygems_version: 3.3.7
260
+ signing_key:
260
261
  specification_version: 4
261
262
  summary: Ruby DSL to scrape web pages
262
263
  test_files: []