kabutops 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ddd72a59b7d2055cb55e305f2f365bc2fcbf8b23
4
- data.tar.gz: b065d94ff1311e7051e9ba5a88dd5b8079923a75
3
+ metadata.gz: 3558c828ca14af27797b234bab95569992e00f1e
4
+ data.tar.gz: 317fec36ba533f78861203c4142e4a7c7d3add84
5
5
  SHA512:
6
- metadata.gz: 406b830a7b6f936a805c4403e98abfdfd71ee72fffc73f46ae2ac0cb985a1fe0502111767a761cfa319a16cb86986802f0bc11c70847bac99fa5b678fb051d9d
7
- data.tar.gz: 3230fd659aa8241ce9dcc6eb174bdb51d1e2b35d9d7bdcac47f33ff304ff14846b166439ecb9d8abdd27294eccaf3e865afc4e47edd3a0c81e9a3615671d23a4
6
+ metadata.gz: 8bf4d1916494080e06c5cda2a830f78857851c1d07228aa271b2c106896b712a54a2ef5747b881cd828d506a03a1f2d8e4db672864f888585cc3780640d317a1
7
+ data.tar.gz: efbef6ae896963703a2c39963b55cf57b6729d58ed1b9749d2052a5821e0366420c65b16f0a1256ef267453e2bc57732530b89a777e5ecc9669885b232cb9b9e
data/LICENSE CHANGED
@@ -1,191 +1,8 @@
1
- Apache License
2
- Version 2.0, January 2004
3
- http://www.apache.org/licenses/
4
-
5
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
-
7
- 1. Definitions.
8
-
9
- "License" shall mean the terms and conditions for use, reproduction, and
10
- distribution as defined by Sections 1 through 9 of this document.
11
-
12
- "Licensor" shall mean the copyright owner or entity authorized by the copyright
13
- owner that is granting the License.
14
-
15
- "Legal Entity" shall mean the union of the acting entity and all other entities
16
- that control, are controlled by, or are under common control with that entity.
17
- For the purposes of this definition, "control" means (i) the power, direct or
18
- indirect, to cause the direction or management of such entity, whether by
19
- contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
20
- outstanding shares, or (iii) beneficial ownership of such entity.
21
-
22
- "You" (or "Your") shall mean an individual or Legal Entity exercising
23
- permissions granted by this License.
24
-
25
- "Source" form shall mean the preferred form for making modifications, including
26
- but not limited to software source code, documentation source, and configuration
27
- files.
28
-
29
- "Object" form shall mean any form resulting from mechanical transformation or
30
- translation of a Source form, including but not limited to compiled object code,
31
- generated documentation, and conversions to other media types.
32
-
33
- "Work" shall mean the work of authorship, whether in Source or Object form, made
34
- available under the License, as indicated by a copyright notice that is included
35
- in or attached to the work (an example is provided in the Appendix below).
36
-
37
- "Derivative Works" shall mean any work, whether in Source or Object form, that
38
- is based on (or derived from) the Work and for which the editorial revisions,
39
- annotations, elaborations, or other modifications represent, as a whole, an
40
- original work of authorship. For the purposes of this License, Derivative Works
41
- shall not include works that remain separable from, or merely link (or bind by
42
- name) to the interfaces of, the Work and Derivative Works thereof.
43
-
44
- "Contribution" shall mean any work of authorship, including the original version
45
- of the Work and any modifications or additions to that Work or Derivative Works
46
- thereof, that is intentionally submitted to Licensor for inclusion in the Work
47
- by the copyright owner or by an individual or Legal Entity authorized to submit
48
- on behalf of the copyright owner. For the purposes of this definition,
49
- "submitted" means any form of electronic, verbal, or written communication sent
50
- to the Licensor or its representatives, including but not limited to
51
- communication on electronic mailing lists, source code control systems, and
52
- issue tracking systems that are managed by, or on behalf of, the Licensor for
53
- the purpose of discussing and improving the Work, but excluding communication
54
- that is conspicuously marked or otherwise designated in writing by the copyright
55
- owner as "Not a Contribution."
56
-
57
- "Contributor" shall mean Licensor and any individual or Legal Entity on behalf
58
- of whom a Contribution has been received by Licensor and subsequently
59
- incorporated within the Work.
60
-
61
- 2. Grant of Copyright License.
62
-
63
- Subject to the terms and conditions of this License, each Contributor hereby
64
- grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
65
- irrevocable copyright license to reproduce, prepare Derivative Works of,
66
- publicly display, publicly perform, sublicense, and distribute the Work and such
67
- Derivative Works in Source or Object form.
68
-
69
- 3. Grant of Patent License.
70
-
71
- Subject to the terms and conditions of this License, each Contributor hereby
72
- grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
73
- irrevocable (except as stated in this section) patent license to make, have
74
- made, use, offer to sell, sell, import, and otherwise transfer the Work, where
75
- such license applies only to those patent claims licensable by such Contributor
76
- that are necessarily infringed by their Contribution(s) alone or by combination
77
- of their Contribution(s) with the Work to which such Contribution(s) was
78
- submitted. If You institute patent litigation against any entity (including a
79
- cross-claim or counterclaim in a lawsuit) alleging that the Work or a
80
- Contribution incorporated within the Work constitutes direct or contributory
81
- patent infringement, then any patent licenses granted to You under this License
82
- for that Work shall terminate as of the date such litigation is filed.
83
-
84
- 4. Redistribution.
85
-
86
- You may reproduce and distribute copies of the Work or Derivative Works thereof
87
- in any medium, with or without modifications, and in Source or Object form,
88
- provided that You meet the following conditions:
89
-
90
- You must give any other recipients of the Work or Derivative Works a copy of
91
- this License; and
92
- You must cause any modified files to carry prominent notices stating that You
93
- changed the files; and
94
- You must retain, in the Source form of any Derivative Works that You distribute,
95
- all copyright, patent, trademark, and attribution notices from the Source form
96
- of the Work, excluding those notices that do not pertain to any part of the
97
- Derivative Works; and
98
- If the Work includes a "NOTICE" text file as part of its distribution, then any
99
- Derivative Works that You distribute must include a readable copy of the
100
- attribution notices contained within such NOTICE file, excluding those notices
101
- that do not pertain to any part of the Derivative Works, in at least one of the
102
- following places: within a NOTICE text file distributed as part of the
103
- Derivative Works; within the Source form or documentation, if provided along
104
- with the Derivative Works; or, within a display generated by the Derivative
105
- Works, if and wherever such third-party notices normally appear. The contents of
106
- the NOTICE file are for informational purposes only and do not modify the
107
- License. You may add Your own attribution notices within Derivative Works that
108
- You distribute, alongside or as an addendum to the NOTICE text from the Work,
109
- provided that such additional attribution notices cannot be construed as
110
- modifying the License.
111
- You may add Your own copyright statement to Your modifications and may provide
112
- additional or different license terms and conditions for use, reproduction, or
113
- distribution of Your modifications, or for any such Derivative Works as a whole,
114
- provided Your use, reproduction, and distribution of the Work otherwise complies
115
- with the conditions stated in this License.
116
-
117
- 5. Submission of Contributions.
118
-
119
- Unless You explicitly state otherwise, any Contribution intentionally submitted
120
- for inclusion in the Work by You to the Licensor shall be under the terms and
121
- conditions of this License, without any additional terms or conditions.
122
- Notwithstanding the above, nothing herein shall supersede or modify the terms of
123
- any separate license agreement you may have executed with Licensor regarding
124
- such Contributions.
125
-
126
- 6. Trademarks.
127
-
128
- This License does not grant permission to use the trade names, trademarks,
129
- service marks, or product names of the Licensor, except as required for
130
- reasonable and customary use in describing the origin of the Work and
131
- reproducing the content of the NOTICE file.
132
-
133
- 7. Disclaimer of Warranty.
134
-
135
- Unless required by applicable law or agreed to in writing, Licensor provides the
136
- Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
137
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
138
- including, without limitation, any warranties or conditions of TITLE,
139
- NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
140
- solely responsible for determining the appropriateness of using or
141
- redistributing the Work and assume any risks associated with Your exercise of
142
- permissions under this License.
143
-
144
- 8. Limitation of Liability.
145
-
146
- In no event and under no legal theory, whether in tort (including negligence),
147
- contract, or otherwise, unless required by applicable law (such as deliberate
148
- and grossly negligent acts) or agreed to in writing, shall any Contributor be
149
- liable to You for damages, including any direct, indirect, special, incidental,
150
- or consequential damages of any character arising as a result of this License or
151
- out of the use or inability to use the Work (including but not limited to
152
- damages for loss of goodwill, work stoppage, computer failure or malfunction, or
153
- any and all other commercial damages or losses), even if such Contributor has
154
- been advised of the possibility of such damages.
155
-
156
- 9. Accepting Warranty or Additional Liability.
157
-
158
- While redistributing the Work or Derivative Works thereof, You may choose to
159
- offer, and charge a fee for, acceptance of support, warranty, indemnity, or
160
- other liability obligations and/or rights consistent with this License. However,
161
- in accepting such obligations, You may act only on Your own behalf and on Your
162
- sole responsibility, not on behalf of any other Contributor, and only if You
163
- agree to indemnify, defend, and hold each Contributor harmless for any liability
164
- incurred by, or claims asserted against, such Contributor by reason of your
165
- accepting any such warranty or additional liability.
166
-
167
- END OF TERMS AND CONDITIONS
168
-
169
- APPENDIX: How to apply the Apache License to your work
170
-
171
- To apply the Apache License to your work, attach the following boilerplate
172
- notice, with the fields enclosed by brackets "[]" replaced with your own
173
- identifying information. (Don't include the brackets!) The text should be
174
- enclosed in the appropriate comment syntax for the file format. We also
175
- recommend that a file or class name and description of purpose be included on
176
- the same "printed page" as the copyright notice for easier identification within
177
- third-party archives.
178
-
179
- Copyright [yyyy] [name of copyright owner]
180
-
181
- Licensed under the Apache License, Version 2.0 (the "License");
182
- you may not use this file except in compliance with the License.
183
- You may obtain a copy of the License at
184
-
185
- http://www.apache.org/licenses/LICENSE-2.0
186
-
187
- Unless required by applicable law or agreed to in writing, software
188
- distributed under the License is distributed on an "AS IS" BASIS,
189
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
190
- See the License for the specific language governing permissions and
191
- limitations under the License.
1
+ /*
2
+ * ----------------------------------------------------------------------------
3
+ * "THE BEER-WARE LICENSE" (Revision 42):
4
+ * As long as you retain this notice you can do whatever you want with this
5
+ * stuff. If we meet some day, and you think this stuff is worth it, you can
6
+ * buy me a beer in return. Rene Klacan
7
+ * ----------------------------------------------------------------------------
8
+ */
data/README.md CHANGED
@@ -13,7 +13,7 @@ gem install kabutops
13
13
  Or you can put it in your Gemfile
14
14
 
15
15
  ```ruby
16
- gem 'kabutops'
16
+ gem 'kabutops', '~> 0.0.2'
17
17
  ```
18
18
 
19
19
  Basic example
@@ -33,18 +33,19 @@ class FruitCrawler < Kabutops::Crawler
33
33
  url: "https://www.example.com/fruits/#{id}",
34
34
  }
35
35
  }.shuffle
36
+
36
37
  proxy '127.0.0.1', 81818
37
38
  cache true
38
39
 
39
40
  elasticsearch do
40
41
  index :books
41
- document :book
42
+ type :book
42
43
 
43
44
  data do
44
45
  id :var, :id
45
46
  url :var, :url
46
47
  some_attr :css, 'h1.bookTitle'
47
- grape :lambda, ->(page) {
48
+ grape :lambda, ->(resource, page) {
48
49
  page.css('h3.fruit').split(',').first
49
50
  }
50
51
 
@@ -85,3 +86,23 @@ One document will look something like this
85
86
  }
86
87
  }
87
88
  ```
89
+
90
+ Debugging
91
+ ---------
92
+
93
+ As we all know, crawler can't be written on the first time.
94
+
95
+ Therefore there are methods for debugging
96
+
97
+ ```ruby
98
+ FruitCrawler.debug_first # will take first from collection
99
+ FruitCrawler.debug_first 7 # will take first 7 resources
100
+ FruitCrawler.debug_random # will take random one
101
+ FruitCrawler.debug_random 3 # will take 3 random resources
102
+ FruitCrawler.debug_last # will take last from collection
103
+ FruitCrawler.debug_last 5 # will take last 5 resources
104
+ FruitCrawler.debug_resource { id: '123', url: '...' }
105
+ ```
106
+
107
+ These methods will print out what would be otherwise saved to the
108
+ database but for this time there is no save to the database.
data/lib/kabutops.rb CHANGED
@@ -1,12 +1,16 @@
1
+ require 'hashie'
1
2
  require 'sidekiq'
2
3
  require 'cachy'
3
4
  require 'moneta'
4
5
  require 'pstore'
6
+ require 'elasticsearch'
5
7
 
6
8
  Cachy.cache_store = Moneta.new(:File, dir: 'cache') # temporary
7
9
 
10
+ require 'kabutops/parameterable'
8
11
  require 'kabutops/recipe'
9
12
  require 'kabutops/recipe_item'
13
+ require 'kabutops/adapters/base'
10
14
  require 'kabutops/adapters/callback'
11
15
  require 'kabutops/adapters/database_adapter'
12
16
  require 'kabutops/adapters/elastic_search'
@@ -15,4 +19,5 @@ require 'kabutops/crawler_extensions/callback'
15
19
  require 'kabutops/crawler_extensions/elastic_search'
16
20
  require 'kabutops/crawler_extensions/mysql'
17
21
  require 'kabutops/crawler_extensions/pstore_storage'
22
+ require 'kabutops/crawler_extensions/debugging'
18
23
  require 'kabutops/crawler'
@@ -0,0 +1,17 @@
1
+ module Kabutops
2
+
3
+ module Adapters
4
+
5
+ class Base
6
+ def enable_debug
7
+ @debug = true
8
+ end
9
+
10
+ def debug
11
+ @debug == true
12
+ end
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -1,6 +1,6 @@
1
1
  module Kabutops
2
2
  module Adapters
3
- class Callback
3
+ class Callback < Base
4
4
  attr_accessor :block
5
5
 
6
6
  def initialize block
@@ -1,6 +1,8 @@
1
1
  module Kabutops
2
+
2
3
  module Adapters
3
- class DatabaseAdapter
4
+
5
+ class DatabaseAdapter < Base
4
6
  def data &block
5
7
  @recipe = Recipe.new
6
8
  @recipe.instance_eval &block
@@ -8,7 +10,12 @@ module Kabutops
8
10
 
9
11
  def process resource, page
10
12
  result = @recipe.process(resource, page)
11
- store(result)
13
+ if debug
14
+ puts "#{self.class.to_s} outputs:"
15
+ p result.to_hash
16
+ else
17
+ store(result)
18
+ end
12
19
  end
13
20
 
14
21
  def store result
@@ -19,5 +26,7 @@ module Kabutops
19
26
  raise NotImplementedError
20
27
  end
21
28
  end
29
+
22
30
  end
31
+
23
32
  end
@@ -1,23 +1,27 @@
1
1
  module Kabutops
2
+
2
3
  module Adapters
4
+
3
5
  class ElasticSearch < DatabaseAdapter
4
- def index value
5
- @index = value
6
- end
6
+ include Parameterable
7
7
 
8
- def document value
9
- @document = value
10
- end
8
+ params :host, :port, :index, :type
11
9
 
12
10
  def store result
13
- p result
14
- p result
15
- p result
11
+ @@client ||= Elasticsearch::Client.new
12
+ @@client.index(
13
+ index: @params[:index] || 'default',
14
+ type: @params[:type] || 'default',
15
+ id: result[:id],
16
+ body: result.to_hash,
17
+ )
16
18
  end
17
19
 
18
20
  def nested?
19
21
  true
20
22
  end
21
23
  end
24
+
22
25
  end
26
+
23
27
  end
@@ -1,13 +1,17 @@
1
1
  module Kabutops
2
+
2
3
  module Adapters
4
+
3
5
  class MySQL < DatabaseAdapter
4
- def table value
5
- @table = value
6
- end
6
+ include Parameterable
7
+
8
+ params :host, :port, :database, :user, :password, :table
7
9
 
8
10
  def nested?
9
11
  false
10
12
  end
11
13
  end
14
+
12
15
  end
16
+
13
17
  end
@@ -1,40 +1,23 @@
1
1
  module Kabutops
2
+
2
3
  class Crawler
3
- include CrawlerExtensions::ElasticSearch
4
+ include CrawlerExtensions::Debugging
5
+ include CrawlerExtensions::PStoreStorage
4
6
  include CrawlerExtensions::Callback
7
+ include CrawlerExtensions::ElasticSearch
5
8
 
6
9
  class << self
7
- include CrawlerExtensions::PStoreStorage
8
-
9
- attr_reader :params
10
-
11
- [
12
- :collection,
13
- :workers,
14
- :proxy,
15
- :cache
16
- ].each do |name|
17
- define_method name do |*args|
18
- @params ||= {}
19
- if args.size == 1
20
- @params[name] = args[0]
21
- else
22
- @params[name] = args
23
- end
24
- end
25
- end
10
+ include Parameterable
26
11
 
27
- def params
28
- @params
29
- end
12
+ params :collection, :proxy, :cache
30
13
 
31
14
  def adapters
32
15
  @adapters
33
16
  end
34
17
 
35
18
  def crawl! collection=nil
36
- if storage(:status) == :none
37
- @collection = collection || @params[:collection] || []
19
+ if storage[:status] == :none
20
+ @collection = collection || params[:collection] || []
38
21
  @collection.each do |resource|
39
22
  raise "url must be specified" if resource[:id].nil?
40
23
  perform_async(resource)
@@ -48,9 +31,9 @@ module Kabutops
48
31
  end
49
32
 
50
33
  def perform resource
51
- resource = resource.inject({}) { |h, (k, v)| h[k.to_sym] = v; h }
34
+ resource = Hashie::Mash.new(resource)
52
35
 
53
- content = Cachy.cache_if(self.class.params[:cache], resource[:url]) do
36
+ content = Cachy.cache_if(self.class.params.cache, resource[:url]) do
54
37
  agent = Mechanize.new
55
38
  #agent.set_proxy(*self.class.params[:proxy])
56
39
  agent.get(resource[:url]).body
@@ -64,7 +47,8 @@ module Kabutops
64
47
  end
65
48
 
66
49
  def << resource
67
- self.class.perform_async(resource)
50
+ self.class.perform_async(resource.to_hash)
68
51
  end
69
52
  end
53
+
70
54
  end
@@ -0,0 +1,45 @@
1
+ module Kabutops
2
+
3
+ module CrawlerExtensions
4
+
5
+ module Debugging
6
+
7
+ def self.included base
8
+ base.extend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+
13
+ def debug_first count=1
14
+ params[:collection].take(count).map{ |r| debug_resource(r) }
15
+ end
16
+
17
+ def debug_random count=1
18
+ params[:collection].sample(count).map{ |r| debug_resource(r) }
19
+ end
20
+
21
+ def debug_last count=1
22
+ params[:collection][(0 - count)..-1].map{ |r| debug_resource(r) }
23
+ end
24
+
25
+ def debug_resource resource
26
+ enable_debug
27
+ self.new.perform(resource)
28
+ end
29
+
30
+ def enable_debug
31
+ @debug = true
32
+ adapters.each { |a| a.enable_debug }
33
+ end
34
+
35
+ def debug
36
+ @debug == true
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -3,6 +3,7 @@ module Kabutops
3
3
  module CrawlerExtensions
4
4
 
5
5
  module ElasticSearch
6
+
6
7
  def self.included base
7
8
  base.extend(ClassMethods)
8
9
  end
@@ -0,0 +1,21 @@
1
+ module Kabutops
2
+
3
+ module CrawlerExtensions
4
+
5
+ module Mysql
6
+
7
+ def self.included base
8
+ base.extend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+ def mysql
13
+ raise NotImplementedError
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -3,21 +3,36 @@ module Kabutops
3
3
  module CrawlerExtensions
4
4
 
5
5
  module PStoreStorage
6
+ class Storage
7
+ def initialize path
8
+ @storage ||= PStore.new(path)
9
+ end
10
+
11
+ def [] key
12
+ @storage.transaction { @storage[key.to_sym] }
13
+ end
14
+
15
+ def []= key, value
16
+ @storage.transaction do
17
+ @storage[key.to_sym] = value
18
+ end
19
+ end
20
+ end
6
21
 
7
- def check_storage
8
- @storage ||= PStore.new(".kabutopus.config.pstore")
22
+ def self.included base
23
+ base.extend(ClassMethods)
9
24
  end
10
25
 
11
- def storage= name, value
12
- check_storage
13
- @storage.transaction do
14
- @storage[key.to_sym] = value
26
+ module ClassMethods
27
+
28
+ def storage
29
+ @storage ||= Storage.new(".kabutopus.config.pstore")
15
30
  end
31
+
16
32
  end
17
33
 
18
- def storage key
19
- check_storage
20
- @storage.transaction { @storage[key.to_sym] }
34
+ def storage
35
+ self.class.storage
21
36
  end
22
37
 
23
38
  end
@@ -0,0 +1,33 @@
1
+ module Kabutops
2
+
3
+ module Parameterable
4
+
5
+ def self.included base
6
+ base.extend(ClassMethods)
7
+ base.class_eval do
8
+ attr_reader :params
9
+ end
10
+ end
11
+
12
+ module ClassMethods
13
+
14
+ def params *list
15
+ return @params if list.empty?
16
+
17
+ list.each do |name|
18
+ define_method name do |*args|
19
+ @params ||= Hashie::Mash.new
20
+ if args.size == 1
21
+ @params[name] = args[0]
22
+ else
23
+ @params[name] = args
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -1,7 +1,8 @@
1
1
  module Kabutops
2
+
2
3
  class Recipe
3
4
  def initialize
4
- @items = {}
5
+ @items = Hashie::Mash.new
5
6
  @nested = false
6
7
  end
7
8
 
@@ -18,7 +19,7 @@ module Kabutops
18
19
  end
19
20
 
20
21
  def process resource, page
21
- result = {}
22
+ result = Hashie::Mash.new
22
23
 
23
24
  @items.each do |name, item|
24
25
  result[name] = case item.type
@@ -31,7 +32,7 @@ module Kabutops
31
32
  when :xpath
32
33
  page.xpath(item.value).text
33
34
  when :lambda
34
- item.value.call(page)
35
+ item.value.call(resource, page)
35
36
  when :proc
36
37
  page.instance_eval &item.value
37
38
  else
@@ -46,4 +47,5 @@ module Kabutops
46
47
  @nested
47
48
  end
48
49
  end
50
+
49
51
  end
@@ -1,4 +1,5 @@
1
1
  module Kabutops
2
+
2
3
  class RecipeItem
3
4
  attr_reader :name, :type, :value
4
5
 
@@ -8,4 +9,5 @@ module Kabutops
8
9
  @value = value
9
10
  end
10
11
  end
12
+
11
13
  end
@@ -1,3 +1,3 @@
1
1
  module Kabutops
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kabutops
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rene Klacan
@@ -14,93 +14,138 @@ dependencies:
14
14
  name: mechanize
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
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
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: cachy
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: moneta
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: sidekiq
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: elasticsearch
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: hashie
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: rspec
71
99
  requirement: !ruby/object:Gem::Requirement
72
100
  requirements:
73
- - - ~>
101
+ - - "~>"
74
102
  - !ruby/object:Gem::Version
75
103
  version: 3.0.0
76
104
  type: :development
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
- - - ~>
108
+ - - "~>"
81
109
  - !ruby/object:Gem::Version
82
110
  version: 3.0.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-mocks
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  description: ''
84
126
  email: rene@klacan.sk
85
127
  executables: []
86
128
  extensions: []
87
129
  extra_rdoc_files: []
88
130
  files:
131
+ - LICENSE
132
+ - README.md
89
133
  - lib/kabutops.rb
90
- - lib/kabutops/adapters/database_adapter.rb
134
+ - lib/kabutops/adapters/base.rb
91
135
  - lib/kabutops/adapters/callback.rb
92
- - lib/kabutops/adapters/mysql.rb
136
+ - lib/kabutops/adapters/database_adapter.rb
93
137
  - lib/kabutops/adapters/elastic_search.rb
94
- - lib/kabutops/crawler_extensions/pstore_storage.rb
138
+ - lib/kabutops/adapters/mysql.rb
139
+ - lib/kabutops/crawler.rb
95
140
  - lib/kabutops/crawler_extensions/callback.rb
96
- - lib/kabutops/crawler_extensions/mysql.rb
141
+ - lib/kabutops/crawler_extensions/debugging.rb
97
142
  - lib/kabutops/crawler_extensions/elastic_search.rb
143
+ - lib/kabutops/crawler_extensions/mysql.rb
144
+ - lib/kabutops/crawler_extensions/pstore_storage.rb
145
+ - lib/kabutops/parameterable.rb
98
146
  - lib/kabutops/recipe.rb
99
- - lib/kabutops/version.rb
100
147
  - lib/kabutops/recipe_item.rb
101
- - lib/kabutops/crawler.rb
102
- - LICENSE
103
- - README.md
148
+ - lib/kabutops/version.rb
104
149
  homepage: https://github.com/reneklacan/kabutops
105
150
  licenses:
106
151
  - Beerware
@@ -111,17 +156,17 @@ require_paths:
111
156
  - lib
112
157
  required_ruby_version: !ruby/object:Gem::Requirement
113
158
  requirements:
114
- - - ~>
159
+ - - "~>"
115
160
  - !ruby/object:Gem::Version
116
161
  version: '1.9'
117
162
  required_rubygems_version: !ruby/object:Gem::Requirement
118
163
  requirements:
119
- - - '>='
164
+ - - ">="
120
165
  - !ruby/object:Gem::Version
121
166
  version: '0'
122
167
  requirements: []
123
168
  rubyforge_project:
124
- rubygems_version: 2.0.14
169
+ rubygems_version: 2.2.2
125
170
  signing_key:
126
171
  specification_version: 4
127
172
  summary: ''