crabfarm 0.0.19 → 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 +4 -4
- data/lib/crabfarm/assertion/context.rb +13 -0
- data/lib/crabfarm/assertion/parsers.rb +105 -0
- data/lib/crabfarm/assertion/validations.rb +28 -0
- data/lib/crabfarm/assertion/wrapper.rb +101 -0
- data/lib/crabfarm/base_parser.rb +3 -0
- data/lib/crabfarm/base_state.rb +2 -0
- data/lib/crabfarm/cli.rb +9 -4
- data/lib/crabfarm/errors.rb +2 -0
- data/lib/crabfarm/modes/generator.rb +6 -3
- data/lib/crabfarm/modes/publisher.rb +89 -24
- data/lib/crabfarm/templates/dot_crabfarm.erb +3 -3
- data/lib/crabfarm/version.rb +1 -1
- metadata +34 -18
- data/lib/crabfarm/event_store.rb +0 -20
- data/lib/crabfarm/helpers/value_helper.rb +0 -131
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f93ecc74ca65159efaed6eeeb3ff85abbb13fe78
|
4
|
+
data.tar.gz: 1b1690612566628e7a9d3a8a8d8adef8e8c9291b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 130fee56339b38ccead67d986354622e6608c5cdc5f703ff6a5791d3b0995e88750163888cfdb09017522b67e369745b2a5e5949048905b8a81ac1b8098f82fb
|
7
|
+
data.tar.gz: 550b31026059c8a31795eab00f0928d22d773adeab91ab16b5ae9b2b83534677292a60bb1cfd6b85f3fe23d2a19214a7424a8ca30ebd418e9f9ab02c449645a5
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Crabfarm
|
2
|
+
module Assertion
|
3
|
+
module Parsers
|
4
|
+
|
5
|
+
def parse_integer _value, _options={}
|
6
|
+
parse_number :to_i, _value, _options
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse_float _value, _options={}
|
10
|
+
parse_number :to_f, _value, _options
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse_phrase _value, _options={}
|
14
|
+
fail_with_nil if _value.nil?
|
15
|
+
|
16
|
+
if _value.is_a? String
|
17
|
+
clean_string _value, _options
|
18
|
+
else
|
19
|
+
if _value.respond_to? :to_s
|
20
|
+
clean_string _value.to_s, _options
|
21
|
+
else
|
22
|
+
fail_with "Value cannot be transformed to string"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_boolean _value, _options={}
|
28
|
+
truthy = Array(_options.fetch(:truthy, ['true']))
|
29
|
+
falsy = Array(_options.fetch(:falsy, ['false']))
|
30
|
+
|
31
|
+
mapping = { :empty => false, true => true, false => false }
|
32
|
+
truthy.each { |k| mapping[k] = true }
|
33
|
+
falsy.each { |k| mapping[k] = false }
|
34
|
+
|
35
|
+
parse_by_map _value, mapping
|
36
|
+
end
|
37
|
+
|
38
|
+
def parse_by_map _value, _map={}
|
39
|
+
fail_with_nil if _value.nil?
|
40
|
+
|
41
|
+
case _value
|
42
|
+
when String, Symbol
|
43
|
+
_value = _value.strip if _value.is_a? String
|
44
|
+
return parse_by_map :empty, _map if _value.empty?
|
45
|
+
fail_with "#'{_value.to_s}' is and invalid keyword" unless _map.key? _value
|
46
|
+
_map[_value]
|
47
|
+
else
|
48
|
+
fail_with "'#{_value}' cannot be mapped"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def parse_number _to_fun, _value, _options={}
|
53
|
+
fail_with_nil if _value.nil?
|
54
|
+
|
55
|
+
if _value.is_a? String
|
56
|
+
_value.strip!
|
57
|
+
if _value.empty?
|
58
|
+
return_default _options
|
59
|
+
else
|
60
|
+
extract_number_from_string(_value, _options).send _to_fun
|
61
|
+
end
|
62
|
+
elsif _value.respond_to? _to_fun
|
63
|
+
_value.send _to_fun
|
64
|
+
else
|
65
|
+
fail_with "'#{_value}' cannot be transformed to number"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def clean_string _string, _options
|
70
|
+
normalized = _string.strip.gsub(/\s+/, ' ')
|
71
|
+
if normalized.empty?
|
72
|
+
return_default _options
|
73
|
+
else normalized end
|
74
|
+
end
|
75
|
+
|
76
|
+
def fail_with_nil
|
77
|
+
fail_with "'nil' cant be parsed"
|
78
|
+
end
|
79
|
+
|
80
|
+
def return_default _options
|
81
|
+
fail_with "Value is an empty" unless _options.key? :default
|
82
|
+
_options[:default]
|
83
|
+
end
|
84
|
+
|
85
|
+
def extract_number_from_string _value, _options
|
86
|
+
decimal_mark = _options.fetch(:decimal_mark, '.') # TODO: make default decimal mark configurable
|
87
|
+
thousand_mark = _options.fetch(:thousand_mark, infer_thousand_separator(decimal_mark))
|
88
|
+
num_rgx = /(?:\.\d+|\d{1,3}(?:\,\d{3})+(?:\.\d+)?|\d+(?:\.\d+)?)/
|
89
|
+
num_rgx = Regexp.new "(?:\\#{decimal_mark}\\d+|\\d{1,3}(?:\\#{thousand_mark}\\d{3})+(?:\\#{decimal_mark}\\d+)?|\\d+(?:\\#{decimal_mark}\\d+)?)"
|
90
|
+
matches = _value.scan num_rgx
|
91
|
+
fail_with "'#{_value}' has an ambiguous numeric format" if matches.count > 1
|
92
|
+
fail_with "'#{_value}' does not contain any number" if matches.count < 1
|
93
|
+
matches.first.gsub(thousand_mark,'').gsub(decimal_mark, '.')
|
94
|
+
end
|
95
|
+
|
96
|
+
def infer_thousand_separator _decimal_mark
|
97
|
+
case _decimal_mark
|
98
|
+
when '.' then ','
|
99
|
+
when ',' then '.'
|
100
|
+
else '' end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Crabfarm
|
2
|
+
module Assertion
|
3
|
+
module Validations
|
4
|
+
|
5
|
+
def validate_number _value, _options={}
|
6
|
+
fail_with "#{_value} out of range" if _options.key? :greater_than and _value <= _options[:greater_than]
|
7
|
+
fail_with "#{_value} out of range" if _options.key? :greater_or_equal_to and _value < _options[:greater_or_equal_to]
|
8
|
+
fail_with "#{_value} out of range" if _options.key? :less_than and _value >= _options[:less_than]
|
9
|
+
fail_with "#{_value} out of range" if _options.key? :less_or_equal_to and _value > _options[:less_or_equal_to]
|
10
|
+
fail_with "#{_value} out of range" if _options.key? :between and not _options[:between].include? _value
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate_word _value, _options={}
|
14
|
+
fail_with "'#{_value}' is not a single word" if /\s/ === _value
|
15
|
+
validate_string _value, _options
|
16
|
+
end
|
17
|
+
|
18
|
+
def validate_string _value, _options={}
|
19
|
+
fail_with "#{_value} does not match expression" if _options.key? :matches and not _options[:matches] === _value
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate_general _value, _options={}
|
23
|
+
fail_with "#{_value} is not recognized" if _options.key? :in and not _options[:in].include? _value
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require "crabfarm/assertion/parsers"
|
2
|
+
require "crabfarm/assertion/validations"
|
3
|
+
|
4
|
+
module Crabfarm
|
5
|
+
module Assertion
|
6
|
+
class Wrapper
|
7
|
+
include Parsers
|
8
|
+
include Validations
|
9
|
+
|
10
|
+
def initialize(_value, _context=nil)
|
11
|
+
@value = if _value.respond_to? :text
|
12
|
+
_value.text
|
13
|
+
else _value end
|
14
|
+
|
15
|
+
@context = _context
|
16
|
+
end
|
17
|
+
|
18
|
+
def is_integer(_options={})
|
19
|
+
perform_assertion(_options) {
|
20
|
+
@value = parse_integer @value, _options
|
21
|
+
validate_number @value, _options
|
22
|
+
validate_general @value, _options
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
alias :is_i :is_integer
|
27
|
+
|
28
|
+
def is_float(_options={})
|
29
|
+
perform_assertion(_options) {
|
30
|
+
@value = parse_float @value, _options
|
31
|
+
validate_number @value, _options
|
32
|
+
validate_general @value, _options
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
alias :is_f :is_float
|
37
|
+
|
38
|
+
def is_word(_options={})
|
39
|
+
perform_assertion(_options) {
|
40
|
+
@value = parse_phrase @value, _options
|
41
|
+
validate_word @value, _options
|
42
|
+
validate_general @value, _options
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
alias :is_w :is_word
|
47
|
+
def is_string(_options={})
|
48
|
+
perform_assertion(_options) {
|
49
|
+
@value = parse_phrase @value, _options
|
50
|
+
validate_string @value, _options
|
51
|
+
validate_general @value, _options
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
alias :is_s :is_string
|
56
|
+
|
57
|
+
def is_boolean(_options={})
|
58
|
+
perform_assertion(_options) {
|
59
|
+
@value = parse_boolean @value, _options
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
alias :is_b :is_boolean
|
64
|
+
|
65
|
+
def matches(_rgx, _options={})
|
66
|
+
perform_assertion(_options) {
|
67
|
+
match = _rgx.match @value
|
68
|
+
fail_with "#{@value} does not match #{_rgx.to_s}" if match.nil?
|
69
|
+
match
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
def method_missing(_method, *_args)
|
74
|
+
if @value.respond_to? :method
|
75
|
+
@value = @value.send(*_args)
|
76
|
+
else super end
|
77
|
+
end
|
78
|
+
|
79
|
+
def respond_to?(*args)
|
80
|
+
@value.respond_to?(*args)
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def perform_assertion(_options)
|
86
|
+
begin
|
87
|
+
yield
|
88
|
+
@value
|
89
|
+
rescue AssertionError # => exc
|
90
|
+
# for now just raise, in the future event could be hooked here...
|
91
|
+
raise
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def fail_with(_message)
|
96
|
+
raise AssertionError.new _message
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/crabfarm/base_parser.rb
CHANGED
data/lib/crabfarm/base_state.rb
CHANGED
data/lib/crabfarm/cli.rb
CHANGED
@@ -75,9 +75,12 @@ module Crabfarm
|
|
75
75
|
|
76
76
|
c.desc "Generates a new crabfarm application"
|
77
77
|
c.command :app do |app|
|
78
|
+
app.desc "Set the remote used by the crawler"
|
79
|
+
app.flag [:r, :remote]
|
80
|
+
|
78
81
|
app.action do |global_options,options,args|
|
79
82
|
require "crabfarm/modes/generator"
|
80
|
-
Crabfarm::Modes::Generator.
|
83
|
+
Crabfarm::Modes::Generator.generate_app(Dir.pwd, args[0], options[:remote])
|
81
84
|
end
|
82
85
|
end
|
83
86
|
|
@@ -85,7 +88,7 @@ module Crabfarm
|
|
85
88
|
c.command :parser do |parser|
|
86
89
|
parser.action do |global_options,options,args|
|
87
90
|
require "crabfarm/modes/generator"
|
88
|
-
Crabfarm::Modes::Generator.
|
91
|
+
Crabfarm::Modes::Generator.generate_parser(args[0])
|
89
92
|
end
|
90
93
|
end
|
91
94
|
|
@@ -93,7 +96,7 @@ module Crabfarm
|
|
93
96
|
c.command :state do |parser|
|
94
97
|
parser.action do |global_options,options,args|
|
95
98
|
require "crabfarm/modes/generator"
|
96
|
-
Crabfarm::Modes::Generator.
|
99
|
+
Crabfarm::Modes::Generator.generate_state(args[0])
|
97
100
|
end
|
98
101
|
end
|
99
102
|
end
|
@@ -108,7 +111,7 @@ module Crabfarm
|
|
108
111
|
end
|
109
112
|
end
|
110
113
|
|
111
|
-
desc "Publish the crawler to
|
114
|
+
desc "Publish the crawler to the crabfarm.io cloud"
|
112
115
|
command :publish do |c|
|
113
116
|
c.desc "Just list the files that are beign packaged"
|
114
117
|
c.switch :dry, :default_value => false
|
@@ -119,6 +122,8 @@ module Crabfarm
|
|
119
122
|
c.action do |global_options,options,args|
|
120
123
|
next puts "This command can only be run inside a crabfarm application" unless defined? CF_PATH
|
121
124
|
|
125
|
+
options[:remote] = args[0]
|
126
|
+
|
122
127
|
require "crabfarm/modes/publisher"
|
123
128
|
Crabfarm::Modes::Publisher.publish CF_PATH, options
|
124
129
|
end
|
data/lib/crabfarm/errors.rb
CHANGED
@@ -6,12 +6,13 @@ require 'ostruct'
|
|
6
6
|
|
7
7
|
module Crabfarm
|
8
8
|
module Modes
|
9
|
-
|
9
|
+
module Generator
|
10
10
|
|
11
|
-
def generate_app(_name,
|
11
|
+
def generate_app(_target, _name, _default_remote=nil)
|
12
12
|
with_external_path _target do
|
13
13
|
binding = {
|
14
14
|
name: _name,
|
15
|
+
remote: _default_remote,
|
15
16
|
version: Crabfarm::VERSION
|
16
17
|
}
|
17
18
|
|
@@ -83,7 +84,7 @@ module Crabfarm
|
|
83
84
|
self
|
84
85
|
end
|
85
86
|
|
86
|
-
|
87
|
+
private
|
87
88
|
|
88
89
|
def generate_dir(_path, _silent)
|
89
90
|
path = File.join(*_path)
|
@@ -123,6 +124,8 @@ module Crabfarm
|
|
123
124
|
def render_op(_op, _message, _color)
|
124
125
|
puts _op.rjust(10).color(_color) + ' ' + _message
|
125
126
|
end
|
127
|
+
|
128
|
+
extend self
|
126
129
|
end
|
127
130
|
end
|
128
131
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'json'
|
2
3
|
require 'git'
|
3
4
|
require 'zlib'
|
5
|
+
require 'inquirer'
|
4
6
|
require 'rubygems/package'
|
5
|
-
require '
|
7
|
+
require 'base64'
|
6
8
|
require 'rainbow'
|
7
9
|
require 'rainbow/ext/string'
|
8
10
|
require 'digest/sha1'
|
@@ -20,7 +22,7 @@ module Crabfarm
|
|
20
22
|
@options = _options
|
21
23
|
|
22
24
|
load_config
|
23
|
-
return unless dry_run or
|
25
|
+
return unless dry_run or check_credentials
|
24
26
|
detect_git_repo
|
25
27
|
|
26
28
|
if inside_git_repo?
|
@@ -37,7 +39,7 @@ module Crabfarm
|
|
37
39
|
compress_package
|
38
40
|
generate_signature
|
39
41
|
|
40
|
-
send_package
|
42
|
+
send_package if not dry_run and ensure_valid_remote
|
41
43
|
end
|
42
44
|
|
43
45
|
private
|
@@ -59,27 +61,76 @@ module Crabfarm
|
|
59
61
|
end
|
60
62
|
|
61
63
|
def load_config
|
62
|
-
|
64
|
+
@local_config = YAML.load_file config_path
|
63
65
|
|
64
|
-
if File.exists? home_config_path
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
@home_config = if File.exists? home_config_path
|
67
|
+
YAML.load_file home_config_path
|
68
|
+
else {} end
|
69
|
+
|
70
|
+
config = @home_config.merge @local_config
|
68
71
|
|
69
72
|
@token = config['token']
|
70
|
-
@
|
73
|
+
@url = @options[:remote] || config['remote']
|
71
74
|
@host = config['host'] || DEFAULT_HOST
|
72
75
|
@include = config['files']
|
73
76
|
end
|
74
77
|
|
75
|
-
def
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
78
|
+
def ensure_valid_remote
|
79
|
+
if @url.nil?
|
80
|
+
@url = Ask.input 'Enter default remote for crawler'
|
81
|
+
return false unless validate_remote @url
|
82
|
+
@local_config['remote'] = @url
|
83
|
+
save_local_config
|
84
|
+
return true
|
85
|
+
else
|
86
|
+
validate_remote @url
|
80
87
|
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def validate_remote(_url)
|
91
|
+
return true if /^\w+\/\w+$/i === _url
|
92
|
+
puts "Invalid remote syntax: #{_url}".color :red
|
93
|
+
return false
|
94
|
+
end
|
95
|
+
|
96
|
+
def check_credentials
|
97
|
+
if @token.nil?
|
98
|
+
puts 'No credential data found, please identify yourself'
|
99
|
+
email = Ask.input 'Enter your crabfarm.io email'
|
100
|
+
password = Ask.input 'Enter your crabfarm.io password'
|
101
|
+
|
102
|
+
resp = send_request Net::HTTP::Post, 'api/tokens', {
|
103
|
+
'email' => email,
|
104
|
+
'password' => password
|
105
|
+
}
|
106
|
+
|
107
|
+
case resp
|
108
|
+
when Net::HTTPCreated
|
109
|
+
@token = JSON.parse(resp.body)['token']
|
110
|
+
@home_config['token'] = @token
|
111
|
+
save_home_config
|
112
|
+
when Net::HTTPUnauthorized
|
113
|
+
puts "The provided credentials are invalid!".color(:red)
|
114
|
+
else
|
115
|
+
puts "Unknown error when asking for token!".color(:red)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
not @token.nil?
|
120
|
+
end
|
121
|
+
|
122
|
+
def save_local_config
|
123
|
+
save_config config_path, @local_config
|
124
|
+
end
|
81
125
|
|
82
|
-
|
126
|
+
def save_home_config
|
127
|
+
save_config home_config_path, @home_config
|
128
|
+
end
|
129
|
+
|
130
|
+
def save_config(_path, _config)
|
131
|
+
data = YAML.dump _config
|
132
|
+
data = data.split("\n", 2).last # remove first line to make it more readable
|
133
|
+
File.open(_path, 'w') { |f| f.write data }
|
83
134
|
end
|
84
135
|
|
85
136
|
def is_tree_dirty?
|
@@ -167,21 +218,35 @@ module Crabfarm
|
|
167
218
|
end
|
168
219
|
|
169
220
|
def send_package
|
170
|
-
|
171
|
-
|
172
|
-
req = Net::HTTP::Put::Multipart.new(url.path, {
|
173
|
-
"repo" => UploadIO.new(StringIO.new(@cpackage.string), "application/x-gzip", "tree.tar.gz"),
|
221
|
+
resp = send_request(Net::HTTP::Put, "api/bots/#{@url}", {
|
222
|
+
"repo" => Base64.encode64(@cpackage.string),
|
174
223
|
"sha" => @signature,
|
175
224
|
"ref" => @ref
|
176
|
-
}, {
|
177
|
-
'X-Api-Token' => @token
|
178
225
|
})
|
179
226
|
|
180
|
-
|
181
|
-
|
227
|
+
case resp
|
228
|
+
when Net::HTTPSuccess
|
229
|
+
sha = JSON.parse(resp.body)['sha']
|
230
|
+
puts "#{@url} updated!"
|
231
|
+
when Net::HTTPUnauthorized
|
232
|
+
puts "You are not authorized to update crawler: #{@url}".color(:red)
|
233
|
+
when Net::HTTPNotFound
|
234
|
+
puts "Crawler not found: #{@url}".color(:red)
|
235
|
+
else
|
236
|
+
puts "Unknown error when updating crawler information!".color(:red)
|
182
237
|
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def send_request(_class, _path, _data=nil)
|
241
|
+
uri = URI.join(@host, _path)
|
183
242
|
|
184
|
-
|
243
|
+
req = req = _class.new uri.path
|
244
|
+
req.set_form_data _data
|
245
|
+
req['X-User-Token'] = @token unless @token.nil?
|
246
|
+
|
247
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
248
|
+
http.request(req)
|
249
|
+
end
|
185
250
|
end
|
186
251
|
|
187
252
|
end
|
data/lib/crabfarm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crabfarm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ignacio Baixas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
@@ -72,6 +72,20 @@ dependencies:
|
|
72
72
|
- - ~>
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: 2.12.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: inquirer
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ~>
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.2.0
|
82
|
+
type: :runtime
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.2.0
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
90
|
name: rainbow
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,20 +142,6 @@ dependencies:
|
|
128
142
|
- - '>='
|
129
143
|
- !ruby/object:Gem::Version
|
130
144
|
version: '0'
|
131
|
-
- !ruby/object:Gem::Dependency
|
132
|
-
name: multipart-post
|
133
|
-
requirement: !ruby/object:Gem::Requirement
|
134
|
-
requirements:
|
135
|
-
- - '>='
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
version: '0'
|
138
|
-
type: :runtime
|
139
|
-
prerelease: false
|
140
|
-
version_requirements: !ruby/object:Gem::Requirement
|
141
|
-
requirements:
|
142
|
-
- - '>='
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
version: '0'
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
146
|
name: bundler
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -338,6 +338,20 @@ dependencies:
|
|
338
338
|
- - ~>
|
339
339
|
- !ruby/object:Gem::Version
|
340
340
|
version: 2.2.0
|
341
|
+
- !ruby/object:Gem::Dependency
|
342
|
+
name: fakefs
|
343
|
+
requirement: !ruby/object:Gem::Requirement
|
344
|
+
requirements:
|
345
|
+
- - ~>
|
346
|
+
- !ruby/object:Gem::Version
|
347
|
+
version: 0.6.7
|
348
|
+
type: :development
|
349
|
+
prerelease: false
|
350
|
+
version_requirements: !ruby/object:Gem::Requirement
|
351
|
+
requirements:
|
352
|
+
- - ~>
|
353
|
+
- !ruby/object:Gem::Version
|
354
|
+
version: 0.6.7
|
341
355
|
description:
|
342
356
|
email:
|
343
357
|
- ignacio@platan.us
|
@@ -354,6 +368,10 @@ files:
|
|
354
368
|
- lib/crabfarm/adapters/output/ostruct.rb
|
355
369
|
- lib/crabfarm/adapters/parser/nokogiri.rb
|
356
370
|
- lib/crabfarm/adapters/parser/pdf_reader.rb
|
371
|
+
- lib/crabfarm/assertion/context.rb
|
372
|
+
- lib/crabfarm/assertion/parsers.rb
|
373
|
+
- lib/crabfarm/assertion/validations.rb
|
374
|
+
- lib/crabfarm/assertion/wrapper.rb
|
357
375
|
- lib/crabfarm/base_parser.rb
|
358
376
|
- lib/crabfarm/base_state.rb
|
359
377
|
- lib/crabfarm/cli.rb
|
@@ -369,9 +387,7 @@ files:
|
|
369
387
|
- lib/crabfarm/dsl/surfer.rb
|
370
388
|
- lib/crabfarm/engines/safe_state_loop.rb
|
371
389
|
- lib/crabfarm/errors.rb
|
372
|
-
- lib/crabfarm/event_store.rb
|
373
390
|
- lib/crabfarm/forked_state.rb
|
374
|
-
- lib/crabfarm/helpers/value_helper.rb
|
375
391
|
- lib/crabfarm/http_client.rb
|
376
392
|
- lib/crabfarm/mocks/noop_driver.rb
|
377
393
|
- lib/crabfarm/modes/console.rb
|
data/lib/crabfarm/event_store.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module Crabfarm
|
2
|
-
class EventStore
|
3
|
-
|
4
|
-
def initialize
|
5
|
-
@events = []
|
6
|
-
@mutex = Mutex.new
|
7
|
-
end
|
8
|
-
|
9
|
-
def event(_category, _message)
|
10
|
-
@mutex.synchronize do
|
11
|
-
@events << {
|
12
|
-
created_at: Time.current,
|
13
|
-
category: _category,
|
14
|
-
msg: _message
|
15
|
-
}
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
@@ -1,131 +0,0 @@
|
|
1
|
-
module Crabfarm
|
2
|
-
module AssertionHelper
|
3
|
-
|
4
|
-
|
5
|
-
class Assert
|
6
|
-
|
7
|
-
assert_int('20', min: -10, max: 4, in: [1,2,3,4] )
|
8
|
-
assert_float()
|
9
|
-
assert_boolean()
|
10
|
-
assert val, is: :integer|float, between: xxx, default: nil
|
11
|
-
assert val, is: :boolean
|
12
|
-
|
13
|
-
test = assert(val).is_i between: 1..2, empty: 20, in: [1, 2, 3], default: nil # default when empty
|
14
|
-
assert(val).is_b empty: 20 # trims, downcase
|
15
|
-
assert(val).trimmed.downcased.is_s in: ['test', 'peo', 'hola'], matches: /asadad/, empty: :nil|false|true
|
16
|
-
assert(products.count).is_i greater_than: 20
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
matches
|
22
|
-
assert(val).is_i between: 1..2, default: 20
|
23
|
-
assert(val).is_f
|
24
|
-
assert(val).is_s default: 'hello', in: ['servicentro', nil]
|
25
|
-
assert(val).is_boolean default: true, truthy: 'servicentro', falsy: ['falso', 'caca']
|
26
|
-
assert(val).downcased.is_one_of 'hola'
|
27
|
-
assert(val).is_not_nil
|
28
|
-
assert(val).is_of_size
|
29
|
-
assert(val).is_date 'YYYY-MM-dd'
|
30
|
-
|
31
|
-
class AssertionWrapper
|
32
|
-
|
33
|
-
def stripped
|
34
|
-
@value = @value.strip if @value.is_a? String
|
35
|
-
self
|
36
|
-
end
|
37
|
-
|
38
|
-
def trimmed
|
39
|
-
stripped
|
40
|
-
@value = @value.gsub(/\s+/, ' ') if @value.is_a? String
|
41
|
-
self
|
42
|
-
end
|
43
|
-
|
44
|
-
def upcased
|
45
|
-
@value = @value.upcase if @value.is_a? String
|
46
|
-
self
|
47
|
-
end
|
48
|
-
|
49
|
-
def downcased
|
50
|
-
@value = @value.downcase if @value.is_a? String
|
51
|
-
self
|
52
|
-
end
|
53
|
-
|
54
|
-
def is_integer(_options={})
|
55
|
-
perform_assertion {
|
56
|
-
@value = parse_integer @value, _options
|
57
|
-
validate_numeric @value, _options
|
58
|
-
validate_general @value, _options
|
59
|
-
}
|
60
|
-
end
|
61
|
-
|
62
|
-
alias :is_integer :is_i
|
63
|
-
|
64
|
-
def is_float(_options={})
|
65
|
-
perform_assertion {
|
66
|
-
@value = parse_float @value, _options
|
67
|
-
validate_numeric @value, _options
|
68
|
-
validate_general @value, _options
|
69
|
-
}
|
70
|
-
end
|
71
|
-
|
72
|
-
alias :is_float :is_f
|
73
|
-
|
74
|
-
def is_string(_options={})
|
75
|
-
perform_assertion {
|
76
|
-
@value = parse_string @value, _options
|
77
|
-
validate_general @value, _options
|
78
|
-
}
|
79
|
-
end
|
80
|
-
|
81
|
-
alias :is_string :is_s
|
82
|
-
|
83
|
-
def is_boolean(_options={})
|
84
|
-
perform_assertion {
|
85
|
-
@value = parse_boolean @value
|
86
|
-
}
|
87
|
-
end
|
88
|
-
|
89
|
-
alias :is_string :is_b
|
90
|
-
|
91
|
-
def matches(_rgx, _)
|
92
|
-
perform_assertion {
|
93
|
-
|
94
|
-
}
|
95
|
-
end
|
96
|
-
|
97
|
-
private
|
98
|
-
|
99
|
-
def perform_assertion
|
100
|
-
end
|
101
|
-
|
102
|
-
def parse_integer _val, _options
|
103
|
-
end
|
104
|
-
|
105
|
-
def parse_float _val, _options
|
106
|
-
end
|
107
|
-
|
108
|
-
def parse_string _val, _options
|
109
|
-
end
|
110
|
-
|
111
|
-
def parse_boolean _val, _options
|
112
|
-
end
|
113
|
-
|
114
|
-
def is_numeric(_options)
|
115
|
-
end
|
116
|
-
|
117
|
-
def is_
|
118
|
-
|
119
|
-
def handle_error(_assertion)
|
120
|
-
end
|
121
|
-
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
assert_date()
|
126
|
-
assert_not_nil()
|
127
|
-
assert_count( between: 0..2, nil: true, halt: true)
|
128
|
-
assert_regex( )
|
129
|
-
|
130
|
-
end
|
131
|
-
end
|