saper 0.5.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 +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,37 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Actions::ConvertToTime do
|
4
|
+
|
5
|
+
let(:action_without_tz) do
|
6
|
+
Saper::Action.new(:convert_to_time, '%d-%m-%Y %H:%M')
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:action_with_tz) do
|
10
|
+
Saper::Action.new(:convert_to_time, '%d-%m-%Y %H:%M', 'Europe/Moscow')
|
11
|
+
end
|
12
|
+
|
13
|
+
context ".new" do
|
14
|
+
it "raises InvalidArgument when argument is missing" do
|
15
|
+
expect { subject }.to raise_error(Saper::InvalidArgument)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context ".accepts" do
|
20
|
+
it "returns acceptable input types" do
|
21
|
+
Saper::Actions::ConvertToTime.accepts.should == [:text]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "#run" do
|
26
|
+
it "raises InvalidInput when input is nil" do
|
27
|
+
expect { action_without_tz.run(nil) }.to raise_error(Saper::InvalidInput)
|
28
|
+
end
|
29
|
+
it "returns valid time when input is a valid date with timezone" do
|
30
|
+
action_with_tz.run('19-04-2014 18:56').should == '2014-04-19T18:56:00+04:00'
|
31
|
+
end
|
32
|
+
it "returns valid time when input is a valid date without timezone" do
|
33
|
+
action_without_tz.run('19-04-2014 18:56').should == '2014-04-19T18:56:00+00:00'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Actions::ConvertToXML do
|
4
|
+
|
5
|
+
let(:action) do
|
6
|
+
Saper::Action.new(:convert_to_xml)
|
7
|
+
end
|
8
|
+
|
9
|
+
context ".accepts" do
|
10
|
+
it "returns acceptable input types" do
|
11
|
+
Saper::Actions::ConvertToXML.accepts.should == [:text, :document]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "#run" do
|
16
|
+
it "raises InvalidInput when input is nil" do
|
17
|
+
expect { action.run(nil) }.to raise_error(Saper::InvalidInput)
|
18
|
+
end
|
19
|
+
it "raises no errors when input is a valid Text" do
|
20
|
+
expect { action.run('<root>test</root>') }.to_not raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Actions::CreateAtom do
|
4
|
+
|
5
|
+
let(:action) do
|
6
|
+
Saper::Action.new(:create_atom)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:runtime) do
|
10
|
+
Saper::Runtime.new
|
11
|
+
end
|
12
|
+
|
13
|
+
context ".accepts" do
|
14
|
+
it "returns acceptable input types" do
|
15
|
+
Saper::Actions::CreateAtom.accepts.should == [:atom, :document, :html, :json, :markdown, :nothing, :text, :time, :url, :xml]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "#run" do
|
20
|
+
it "raises RuntimeMissing when runtime is missing" do
|
21
|
+
expect { action.run(nil) }.to raise_error(Saper::RuntimeMissing)
|
22
|
+
end
|
23
|
+
it "raises no errors when runtime is defined and input is nil" do
|
24
|
+
expect { action.run(nil, runtime) }.to_not raise_error
|
25
|
+
end
|
26
|
+
it "returns Saper::Atom" do
|
27
|
+
action.run(nil, runtime).should be_a(Saper::Items::Atom)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Actions::PrependWith do
|
4
|
+
|
5
|
+
let(:action) do
|
6
|
+
Saper::Action.new(:prepend_with, '!')
|
7
|
+
end
|
8
|
+
|
9
|
+
context ".accepts" do
|
10
|
+
it "returns acceptable input types" do
|
11
|
+
Saper::Actions::AppendWith.accepts.should == [:text]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context ".new" do
|
16
|
+
it "raises InvalidArgument when argument is missing" do
|
17
|
+
expect { subject }.to raise_error(Saper::InvalidArgument)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "#run" do
|
22
|
+
it "raises InvalidInput when input is nil" do
|
23
|
+
expect { action.run(nil) }.to raise_error(Saper::InvalidInput)
|
24
|
+
end
|
25
|
+
it "returns valid output when input is Text" do
|
26
|
+
action.run('string').should == '!string'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Actions::RunRecipeAndSave 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
|
+
context "when argument is missing" do
|
17
|
+
it "raises InvalidArgument" do
|
18
|
+
expect { Saper::Action.new(:run_recipe_and_save).run }.to raise_error(Saper::InvalidArgument)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when input is invalid" do
|
23
|
+
let(:runtime) do
|
24
|
+
namespace.run(:parent, nil)
|
25
|
+
end
|
26
|
+
it "raises no errors" do
|
27
|
+
expect { runtime }.to_not raise_error
|
28
|
+
end
|
29
|
+
it "returns valid output" do
|
30
|
+
runtime.results.should == nil
|
31
|
+
end
|
32
|
+
it "sets error flag in runtime" do
|
33
|
+
runtime.error?.should be_true
|
34
|
+
end
|
35
|
+
it "records error in runtime" do
|
36
|
+
runtime.error.should be_a(Saper::InvalidInput)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when input and arguments are valid" do
|
41
|
+
let(:runtime) do
|
42
|
+
Saper::Action.new(:run_recipe_and_save, :variable, :child).run('string', :namespace => namespace)
|
43
|
+
end
|
44
|
+
it "raises no errors" do
|
45
|
+
expect { runtime }.to_not raise_error
|
46
|
+
end
|
47
|
+
it "returns valid output" do
|
48
|
+
runtime.results.should == ['test-string']
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Actions::RunRecipe do
|
4
|
+
|
5
|
+
let(:child) do
|
6
|
+
Saper::Recipe.new do |recipe|
|
7
|
+
recipe << Saper::Action.new(:prepend_with, 'test-')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:namespace) do
|
12
|
+
Saper::Namespace.new do |ns|
|
13
|
+
ns[:child] = child
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when argument is missing" do
|
18
|
+
it "raises InvalidArgument" do
|
19
|
+
expect { Saper::Action.new(:run_recipe).run }.to raise_error(Saper::InvalidArgument)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when input is invalid" do
|
24
|
+
let(:runtime) do
|
25
|
+
Saper::Action.new(:run_recipe, :child).run(nil, :namespace => namespace)
|
26
|
+
end
|
27
|
+
it "raises no errors" do
|
28
|
+
expect { runtime }.to_not raise_error
|
29
|
+
end
|
30
|
+
it "returns valid output" do
|
31
|
+
runtime.results.should == nil
|
32
|
+
end
|
33
|
+
it "sets error flag in runtime" do
|
34
|
+
runtime.error?.should be_true
|
35
|
+
end
|
36
|
+
it "records error in runtime" do
|
37
|
+
runtime.error.should be_a(Saper::InvalidInput)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when input and arguments are valid" do
|
42
|
+
let(:runtime) do
|
43
|
+
Saper::Action.new(:run_recipe, :child).run('string', :namespace => namespace)
|
44
|
+
end
|
45
|
+
it "raises no errors" do
|
46
|
+
expect { runtime }.to_not raise_error
|
47
|
+
end
|
48
|
+
it "returns valid output" do
|
49
|
+
runtime.results.should == 'test-string'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Saper::Action do
|
4
|
+
|
5
|
+
context ".[]" do
|
6
|
+
it "raises ActionNotFound with unrecognized type" do
|
7
|
+
expect { Saper::Action[:unknown] }.to raise_error(Saper::ActionNotFound)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context ".new with unrecognized type" do
|
12
|
+
it "raises ActionNotFound" do
|
13
|
+
expect { Saper::Action.new(:unknown) }.to raise_error(Saper::ActionNotFound)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context ".accepts" do
|
18
|
+
it "returns an empty array" do
|
19
|
+
Saper::Action.accepts.should == []
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context ".unserialize(Hash)" do
|
24
|
+
it "returns Action instance" do
|
25
|
+
Saper::Action.unserialize({ :type => :test_action }).should be_a(Saper::Action)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context ".unserialize(Array)" do
|
30
|
+
it "returns an Array" do
|
31
|
+
Saper::Action.unserialize([{ :type => :test_action }, { :type => :test_action }]).should be_a(Array)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context ".unserialize(nil)" do
|
36
|
+
it "raises InvalidAction" do
|
37
|
+
expect { Saper::Action.unserialize(nil) }.to raise_error(Saper::InvalidAction)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
describe TestAction do
|
44
|
+
|
45
|
+
context ".type" do
|
46
|
+
it "returns underscored class name" do
|
47
|
+
TestAction.type.should == 'test_action'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context ".accepts" do
|
52
|
+
it "returns an array of acceptable input types" do
|
53
|
+
TestAction.accepts.should == [:text]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context ".[]" do
|
58
|
+
it "returns new class" do
|
59
|
+
Saper::Action[:test_action].should == TestAction
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context ".new" do
|
64
|
+
it "returns an instance of new class" do
|
65
|
+
Saper::Action.new(:test_action).should be_a(TestAction)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "#name" do
|
70
|
+
it "returns human readable name" do
|
71
|
+
TestAction.new.name.should == 'Test Action'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "#options" do
|
76
|
+
it "returns empty Hash by default" do
|
77
|
+
TestAction.new.options.should == {}
|
78
|
+
end
|
79
|
+
it "returns Hash when options are set" do
|
80
|
+
TestAction.new(:test => true).options.should == { :test => true }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "#namespace" do
|
85
|
+
it "returns nil by default" do
|
86
|
+
TestAction.new.namespace.should be_nil
|
87
|
+
end
|
88
|
+
it "returns Saper::Namespace when set" do
|
89
|
+
TestAction.new(:namespace => Saper::Namespace.new).namespace.should be_a(Saper::Namespace)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context "#run with valid input" do
|
94
|
+
it "returns input by default" do
|
95
|
+
TestAction.new.run("OK").should == 'OK'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "#run with invalid input" do
|
100
|
+
it "raises InvalidInput" do
|
101
|
+
expect { TestAction.new.run(nil) }.to raise_error(Saper::InvalidInput)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "#serialize" do
|
106
|
+
it "returns a Hash" do
|
107
|
+
TestAction.new.serialize.should be_a(Hash)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
describe ActionWithMandatoryArgument do
|
114
|
+
|
115
|
+
context ".new" do
|
116
|
+
it "raises InvalidArgument when argument is missing" do
|
117
|
+
expect { ActionWithMandatoryArgument.new }.to raise_error(Saper::InvalidArgument)
|
118
|
+
end
|
119
|
+
it "raises no errors when argument is present" do
|
120
|
+
expect { ActionWithMandatoryArgument.new("text") }.to_not raise_error
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context "#run with valid input" do
|
125
|
+
it "returns valid output" do
|
126
|
+
ActionWithMandatoryArgument.new("append this").run("with that").should == 'append this with that'
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "#run with invalid input" do
|
131
|
+
it "raises InvalidInput" do
|
132
|
+
expect { ActionWithMandatoryArgument.new("text").run(nil) }.to raise_error(Saper::InvalidInput)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
describe ActionWithOptionalArgument do
|
139
|
+
|
140
|
+
context ".new" do
|
141
|
+
it "raises no errors when argument is missing" do
|
142
|
+
expect { ActionWithOptionalArgument.new }.to_not raise_error
|
143
|
+
end
|
144
|
+
it "raises no errors when argument is present" do
|
145
|
+
expect { ActionWithOptionalArgument.new("text") }.to_not raise_error
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
|