kabuto 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 423e9736fa20a0d6e8b92706735ebe5e5defa1f2
4
+ data.tar.gz: fd248d8dd39138b18ff39baa2165642fd8a49f90
5
+ SHA512:
6
+ metadata.gz: 2a262727ee888c8c987e3240aced55c67bf9d8faeb60f23077651a0310304f506751e344e65b82e11dcce258da4a91baff8abf0e8527b849ff58ea6b0cc4fbb5
7
+ data.tar.gz: c897e8b6fb8fcc2fad359ef40d7d9179fd8f4ab66371c4581a1e37f9ea680f1e2ccace809ba8257a4acb30022a0ff7cf813a58b528de8fd31f19664a3b47a7bf
data/LICENSE ADDED
@@ -0,0 +1,8 @@
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
+ */
@@ -0,0 +1,19 @@
1
+ # Kabuto [![Code Climate](https://codeclimate.com/github/reneklacan/kabuto.png)](https://codeclimate.com/github/reneklacan/kabuto) [![Coverage](https://codeclimate.com/github/reneklacan/kabuto/coverage.png)](https://codeclimate.com/github/reneklacan/kabuto)
2
+
3
+ ## Installation
4
+
5
+ You can install it via gem
6
+
7
+ ```bash
8
+ gem install kabuto
9
+ ```
10
+
11
+ Or you can put it in your Gemfile
12
+
13
+ ```ruby
14
+ gem 'kabuto'
15
+ ```
16
+
17
+ ## License
18
+
19
+ This library is distributed under the Beerware license.
@@ -0,0 +1,8 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ require 'json'
4
+ require 'hashie'
5
+ require 'nokogiri'
6
+
7
+ require 'kabuto/recipe'
8
+ require 'kabuto/recipe_item'
@@ -0,0 +1,53 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Kabuto
4
+
5
+ class Recipe
6
+ attr_reader :items, :params, :nested
7
+
8
+ def initialize params={}, &block
9
+ @params = Hashie::Mash.new(params)
10
+ @items = Hashie::Mash.new
11
+ @nested = false
12
+
13
+ instance_eval(&block) if block_given?
14
+ end
15
+
16
+ def method_missing name, *args, &block
17
+ if block_given?
18
+ recipe = Recipe.new
19
+ recipe.instance_eval(&block)
20
+ @items[name] = RecipeItem.new(:recipe, recipe)
21
+ @nested = true
22
+ else
23
+ type, value, convert_to = args[0..2]
24
+ @items[name] = RecipeItem.new(type, value, convert_to)
25
+ end
26
+ end
27
+
28
+ def process page, meta = nil
29
+ if @params[:each]
30
+ page.xpath(@params[:each]).map{ |n| process_one(n, meta) }
31
+ elsif @params[:each_css]
32
+ page.css(@params[:each_css]).map{ |n| process_one(n, meta) }
33
+ else
34
+ process_one(page, meta)
35
+ end
36
+ end
37
+
38
+ def process_one node, meta = nil
39
+ result = Hashie::Mash.new
40
+
41
+ items.each do |name, item|
42
+ result[name] = item.process(node, meta)
43
+ end
44
+
45
+ result
46
+ end
47
+
48
+ def nested?
49
+ @nested
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,53 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Kabuto
4
+
5
+ class RecipeItem
6
+ TYPES = [:var, :recipe, :css, :xpath, :lambda, :proc, :const, :static]
7
+
8
+ attr_reader :type, :value
9
+
10
+ def initialize type, value, convert_to=nil
11
+ raise "Unknown recipe item type '#{type}'" unless TYPES.include?(type.to_sym)
12
+
13
+ @type = type.to_sym
14
+ @value = value
15
+ @convert_to = convert_to
16
+ end
17
+
18
+ def process page, meta
19
+ convert(get(page, meta))
20
+ end
21
+
22
+ protected
23
+
24
+ def get page, meta
25
+ case type
26
+ when :var
27
+ meta[value]
28
+ when :recipe
29
+ value.process(page, meta)
30
+ when :css
31
+ page.css(value).text.gsub(/\u00a0/, ' ').strip
32
+ when :xpath
33
+ page.xpath(value).text.gsub(/\u00a0/, ' ').strip
34
+ when :lambda, :proc
35
+ value.call(page, meta)
36
+ when :const, :static
37
+ value
38
+ end
39
+ end
40
+
41
+ def convert v
42
+ return nil if v.nil?
43
+
44
+ case @convert_to
45
+ when nil then v
46
+ when :int then v[/\d+/].to_i
47
+ when :float then v.gsub(',', '.')[/\d+(\.\d+)?/].to_f
48
+ else raise "Unknown conversion type '#{@convert_to}'"
49
+ end
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,5 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Kabuto
4
+ VERSION = '0.1.0'
5
+ end
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kabuto
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Rene Klacan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hashie
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-mocks
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ description: ''
98
+ email: rene@klacan.sk
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - LICENSE
104
+ - README.md
105
+ - lib/kabuto.rb
106
+ - lib/kabuto/recipe.rb
107
+ - lib/kabuto/recipe_item.rb
108
+ - lib/kabuto/version.rb
109
+ homepage: https://github.com/reneklacan/kabuto
110
+ licenses:
111
+ - Beerware
112
+ metadata: {}
113
+ post_install_message:
114
+ rdoc_options: []
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '1.9'
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ requirements: []
128
+ rubyforge_project:
129
+ rubygems_version: 2.4.5.1
130
+ signing_key:
131
+ specification_version: 4
132
+ summary: ''
133
+ test_files: []