saper 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +126 -0
- data/Rakefile +17 -0
- data/bin/saper +60 -0
- data/lib/lib/json_search.rb +54 -0
- data/lib/lib/mechanize.rb +26 -0
- data/lib/lib/nokogiri.rb +12 -0
- data/lib/saper.rb +37 -0
- data/lib/saper/actions/append_with.rb +14 -0
- data/lib/saper/actions/convert_to_html.rb +14 -0
- data/lib/saper/actions/convert_to_json.rb +14 -0
- data/lib/saper/actions/convert_to_markdown.rb +13 -0
- data/lib/saper/actions/convert_to_time.rb +15 -0
- data/lib/saper/actions/convert_to_xml.rb +14 -0
- data/lib/saper/actions/create_atom.rb +18 -0
- data/lib/saper/actions/fetch.rb +17 -0
- data/lib/saper/actions/find.rb +18 -0
- data/lib/saper/actions/find_first.rb +16 -0
- data/lib/saper/actions/get_attribute.rb +15 -0
- data/lib/saper/actions/get_contents.rb +14 -0
- data/lib/saper/actions/get_text.rb +14 -0
- data/lib/saper/actions/prepend_with.rb +14 -0
- data/lib/saper/actions/remove_after.rb +14 -0
- data/lib/saper/actions/remove_before.rb +14 -0
- data/lib/saper/actions/remove_matching.rb +14 -0
- data/lib/saper/actions/remove_tags.rb +15 -0
- data/lib/saper/actions/replace.rb +15 -0
- data/lib/saper/actions/run_recipe.rb +24 -0
- data/lib/saper/actions/run_recipe_and_save.rb +22 -0
- data/lib/saper/actions/save.rb +14 -0
- data/lib/saper/actions/select_matching.rb +14 -0
- data/lib/saper/actions/set_input.rb +19 -0
- data/lib/saper/actions/skip_tags.rb +15 -0
- data/lib/saper/actions/split.rb +24 -0
- data/lib/saper/arguments/attribute.rb +11 -0
- data/lib/saper/arguments/recipe.rb +42 -0
- data/lib/saper/arguments/text.rb +11 -0
- data/lib/saper/arguments/timezone.rb +11 -0
- data/lib/saper/arguments/variable.rb +11 -0
- data/lib/saper/arguments/xpath.rb +11 -0
- data/lib/saper/core/action.rb +209 -0
- data/lib/saper/core/argument.rb +106 -0
- data/lib/saper/core/browser.rb +87 -0
- data/lib/saper/core/dsl.rb +68 -0
- data/lib/saper/core/error.rb +47 -0
- data/lib/saper/core/item.rb +70 -0
- data/lib/saper/core/keychain.rb +18 -0
- data/lib/saper/core/logger.rb +74 -0
- data/lib/saper/core/namespace.rb +139 -0
- data/lib/saper/core/recipe.rb +134 -0
- data/lib/saper/core/runtime.rb +237 -0
- data/lib/saper/core/type.rb +45 -0
- data/lib/saper/items/atom.rb +64 -0
- data/lib/saper/items/document.rb +66 -0
- data/lib/saper/items/html.rb +85 -0
- data/lib/saper/items/json.rb +67 -0
- data/lib/saper/items/markdown.rb +36 -0
- data/lib/saper/items/nothing.rb +15 -0
- data/lib/saper/items/text.rb +54 -0
- data/lib/saper/items/time.rb +42 -0
- data/lib/saper/items/url.rb +34 -0
- data/lib/saper/items/xml.rb +79 -0
- data/lib/saper/version.rb +3 -0
- data/spec/actions/append_with_spec.rb +30 -0
- data/spec/actions/convert_to_html_spec.rb +24 -0
- data/spec/actions/convert_to_json_spec.rb +24 -0
- data/spec/actions/convert_to_markdown_spec.rb +24 -0
- data/spec/actions/convert_to_time_spec.rb +37 -0
- data/spec/actions/convert_to_xml_spec.rb +24 -0
- data/spec/actions/create_atom_spec.rb +31 -0
- data/spec/actions/fetch_spec.rb +7 -0
- data/spec/actions/find_first_spec.rb +7 -0
- data/spec/actions/find_spec.rb +7 -0
- data/spec/actions/get_attribute_spec.rb +7 -0
- data/spec/actions/get_contents.rb +7 -0
- data/spec/actions/get_text.rb +7 -0
- data/spec/actions/prepend_with_spec.rb +30 -0
- data/spec/actions/remove_after.rb +7 -0
- data/spec/actions/remove_before.rb +7 -0
- data/spec/actions/replace_spec.rb +7 -0
- data/spec/actions/run_recipe_and_save_spec.tmp.rb +52 -0
- data/spec/actions/run_recipe_spec.tmp.rb +53 -0
- data/spec/actions/save_spec.rb +7 -0
- data/spec/actions/select_matching_spec.rb +7 -0
- data/spec/actions/set_input_spec.rb +7 -0
- data/spec/actions/skip_tags_spec.rb +7 -0
- data/spec/actions/split_spec.rb +7 -0
- data/spec/core/action_spec.rb +151 -0
- data/spec/core/argument_spec.rb +79 -0
- data/spec/core/browser_spec.rb +7 -0
- data/spec/core/dsl_spec.rb +7 -0
- data/spec/core/item_spec.rb +7 -0
- data/spec/core/keychain_spec.rb +7 -0
- data/spec/core/logger_spec.rb +7 -0
- data/spec/core/namespace_spec.rb +18 -0
- data/spec/core/recipe_spec.rb +81 -0
- data/spec/core/runtime_spec.rb +165 -0
- data/spec/core/type_spec.rb +7 -0
- data/spec/items/atom_spec.rb +7 -0
- data/spec/items/document_spec.rb +7 -0
- data/spec/items/html_spec.rb +7 -0
- data/spec/items/json_spec.rb +7 -0
- data/spec/items/markdown_spec.rb +7 -0
- data/spec/items/nothing_spec.rb +7 -0
- data/spec/items/text_spec.rb +17 -0
- data/spec/items/time_spec.rb +7 -0
- data/spec/items/url_spec.rb +7 -0
- data/spec/items/xml_spec.rb +17 -0
- data/spec/spec_helper.rb +22 -0
- metadata +355 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Argument do
|
4
|
+
|
5
|
+
context ".new" do
|
6
|
+
context "when required value is nil" do
|
7
|
+
it "raises InvalidArgument" do
|
8
|
+
expect { Saper::Argument.new(:text, :value => nil) }.to raise_error(Saper::InvalidArgument)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
context "when required value is missing" do
|
12
|
+
it "raises InvalidArgument" do
|
13
|
+
expect { Saper::Argument.new(:text) }.to raise_error(Saper::InvalidArgument)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
context "when required value is invalid" do
|
17
|
+
it "raises InvalidArgument" do
|
18
|
+
expect { Saper::Argument.new(:text, :value => 1) }.to raise_error(Saper::InvalidArgument)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
context "when required value is valid" do
|
22
|
+
it "raises no exceptions" do
|
23
|
+
expect { Saper::Argument.new(:text, :value => "text") }.to_not raise_error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
context "when optional value is missing" do
|
27
|
+
it "raises no exceptions" do
|
28
|
+
expect { Saper::Argument.new(:text, :optional => true) }.to_not raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
context "when optional value is invalid" do
|
32
|
+
it "raises InvalidArgument" do
|
33
|
+
expect { Saper::Argument.new(:text, :optional => true, :value => 1) }.to raise_error(Saper::InvalidArgument)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
context "when optional value is valid" do
|
37
|
+
it "returns Action instance" do
|
38
|
+
expect { Saper::Argument.new(:text, :optional => true, :value => "text") }.to_not raise_error
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "#set" do
|
44
|
+
context "when required value is invalid" do
|
45
|
+
it "raises InvalidArgument" do
|
46
|
+
expect { Saper::Argument.new(:text, :value => "text").set(1) }.to raise_error(Saper::InvalidArgument)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
context "when optional value is invalid" do
|
50
|
+
it "raises InvalidArgument" do
|
51
|
+
expect { Saper::Argument.new(:text, :optional => true, :value => "text").set(1) }.to raise_error(Saper::InvalidArgument)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
context "when value is valid" do
|
55
|
+
it "returns self" do
|
56
|
+
Saper::Argument.new(:text, :optional => true).set("text").should be_a(Saper::Argument)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "#value" do
|
62
|
+
it "returns nil by default" do
|
63
|
+
Saper::Argument.new(:text, :optional => true).value.should be_nil
|
64
|
+
end
|
65
|
+
it "returns stored value" do
|
66
|
+
Saper::Argument.new(:text, :value => "text").value.should == "text"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "#optional?" do
|
71
|
+
it "returns false by default" do
|
72
|
+
Saper::Argument.new(:text, :value => "text").should_not be_optional
|
73
|
+
end
|
74
|
+
it "returns true if optionality flag is set" do
|
75
|
+
Saper::Argument.new(:text, :optional => true).should be_optional
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Namespace do
|
4
|
+
|
5
|
+
let(:namespace) do
|
6
|
+
Saper::Namespace.parse do |ns|
|
7
|
+
recipe :child do
|
8
|
+
prepend_with 'test-'
|
9
|
+
end
|
10
|
+
recipe :parent do
|
11
|
+
run_recipe_and_save :variable, :child
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it # TODO
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Recipe do
|
4
|
+
|
5
|
+
context ".unserialize(Hash)" do
|
6
|
+
it "returns a Recipe" do
|
7
|
+
Saper::Recipe.unserialize({ :id => 0 }).should be_a(Saper::Recipe)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context ".unserialize(Array)" do
|
12
|
+
it "returns an Array" do
|
13
|
+
Saper::Recipe.unserialize([{ :id => 0 }, { :id => 1 }]).should be_a(Array)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context ".unserialize(nil)" do
|
18
|
+
it "raises InvalidRecipe" do
|
19
|
+
expect { Saper::Recipe.unserialize("invalid argument") }.to raise_error(Saper::InvalidRecipe)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "#id" do
|
24
|
+
it "returns recipe ID" do
|
25
|
+
subject.id.should be_a(String)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "#actions" do
|
30
|
+
it "returns an empty array by default" do
|
31
|
+
subject.actions.should == []
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
let(:action) do
|
36
|
+
Saper::Action.new(:append_with, "!")
|
37
|
+
end
|
38
|
+
|
39
|
+
context "#<<" do
|
40
|
+
it "returns self with valid action" do
|
41
|
+
(subject << action).should be_a(Saper::Recipe)
|
42
|
+
end
|
43
|
+
it "raises ActionExpected with invalid argument" do
|
44
|
+
expect { subject << 'not an action' }.to raise_error(Saper::ActionExpected)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "#push" do
|
49
|
+
it "returns self with valid action" do
|
50
|
+
subject.push(action).should be_a(Saper::Recipe)
|
51
|
+
end
|
52
|
+
it "raises ActionExpected with invalid argument" do
|
53
|
+
expect { subject.push('not an action') }.to raise_error(Saper::ActionExpected)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "#run" do
|
58
|
+
it "returns self" do
|
59
|
+
subject.run.should be_a(Saper::Runtime)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "#serialize" do
|
64
|
+
it "returns a Hash" do
|
65
|
+
subject.serialize.should be_a(Hash)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "#to_string" do
|
70
|
+
it "returns a string" do
|
71
|
+
subject.to_string.should be_a(String)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "#to_json" do
|
76
|
+
it "returns a string" do
|
77
|
+
subject.to_json.should be_a(String)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Runtime do
|
4
|
+
|
5
|
+
context "#browser" do
|
6
|
+
it "returns Browser instance" do
|
7
|
+
subject.browser.should be_a(Saper::Browser)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context "#bytes_received" do
|
12
|
+
it "returns zero by default" do
|
13
|
+
subject.bytes_received.should == 0
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "#bytes_sent" do
|
18
|
+
it "returns zero by default" do
|
19
|
+
subject.bytes_sent.should == 0
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "#http_requests" do
|
24
|
+
it "returns zero by default" do
|
25
|
+
subject.http_requests.should == 0
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "#keychain" do
|
30
|
+
it "returns Keychain instance" do
|
31
|
+
subject.keychain.should be_a(Saper::Keychain)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "#credentials" do
|
36
|
+
it "returns nil if serivce not found" do
|
37
|
+
subject.credentials(:services).should == nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
#context "#namespace" do
|
42
|
+
# it "returns nil" do
|
43
|
+
# subject.namespace.should be_nil
|
44
|
+
# end
|
45
|
+
#end
|
46
|
+
|
47
|
+
context "#depth" do
|
48
|
+
it "returns zero by default" do
|
49
|
+
subject.depth.should == 0
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "#descendants" do
|
54
|
+
it "returns self by default" do
|
55
|
+
subject.descendants.should == [subject]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "#results" do
|
60
|
+
it "returns nil by default" do
|
61
|
+
subject.results.should == nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "#results" do
|
66
|
+
it "returns input by default" do
|
67
|
+
Saper::Runtime.new([], "input").results.should == "input"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "#[]" do
|
72
|
+
it "returns nil if variable is not defined" do
|
73
|
+
subject[:varname].should be_nil
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "#[]=" do
|
78
|
+
it "stores variale value" do
|
79
|
+
subject[:var] = 'OK'; subject[:var].should == 'OK'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "#variables" do
|
84
|
+
it "returns list of variable names" do
|
85
|
+
subject[:var] = 'OK'; subject.variables.should == { :var => 'OK' }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
let(:simple_recipe) do
|
90
|
+
Saper::Recipe.parse do
|
91
|
+
convert_to_html
|
92
|
+
find_first "p"
|
93
|
+
get_contents
|
94
|
+
append_with "!"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "#results" do
|
99
|
+
context "with failed single-output recipe" do
|
100
|
+
it "returns nil" do
|
101
|
+
Saper::Runtime.new(simple_recipe, nil).results.should == nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
context "with successful single-output recipe" do
|
105
|
+
it "returns result" do
|
106
|
+
Saper::Runtime.new(simple_recipe, "<p>a</p><p>b</p>").results.should == "a!"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
let(:multiple_recipe) do
|
112
|
+
Saper::Recipe.parse do
|
113
|
+
convert_to_html
|
114
|
+
find "p"
|
115
|
+
get_contents
|
116
|
+
append_with "!"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context "#results" do
|
121
|
+
context "with failed multiple-output recipe" do
|
122
|
+
it "returns empty array" do
|
123
|
+
Saper::Runtime.new(multiple_recipe, nil).results.should == []
|
124
|
+
end
|
125
|
+
end
|
126
|
+
context "with successful multiple-output recipe" do
|
127
|
+
it "returns array with results" do
|
128
|
+
Saper::Runtime.new(multiple_recipe, "<p>a</p><p>b</p>").results.should == ["a!", "b!"]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
let(:namespaced_recipes) do
|
134
|
+
Saper::Namespace.parse do |ns|
|
135
|
+
recipe :child_multiple do
|
136
|
+
find "p"
|
137
|
+
get_contents
|
138
|
+
end
|
139
|
+
recipe :child_single do
|
140
|
+
find_first "p"
|
141
|
+
get_contents
|
142
|
+
end
|
143
|
+
recipe :parent_multiple do
|
144
|
+
run_recipe :child_multiple
|
145
|
+
end
|
146
|
+
recipe :parent_single do
|
147
|
+
run_recipe :child_single
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
context "#results" do
|
153
|
+
context "with embedded multiple-output recipe" do
|
154
|
+
it "returns correct ouput" do
|
155
|
+
Saper::Runtime.new(namespaced_recipes[:parent_multiple], "<p>a</p><p>b</p>").results.should == ['a', 'b']
|
156
|
+
end
|
157
|
+
end
|
158
|
+
context "with embedded single-output recipe" do
|
159
|
+
it "returns correct ouput" do
|
160
|
+
Saper::Runtime.new(namespaced_recipes[:parent_single], "<p>a</p><p>b</p>").results.should == 'a'
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|