saper 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +6 -6
  4. data/bin/saper +17 -36
  5. data/lib/saper.rb +63 -20
  6. data/lib/saper/actions/append_with.rb +1 -1
  7. data/lib/saper/actions/convert_to_html.rb +1 -1
  8. data/lib/saper/actions/convert_to_json.rb +6 -2
  9. data/lib/saper/actions/convert_to_markdown.rb +1 -1
  10. data/lib/saper/actions/convert_to_time.rb +38 -1
  11. data/lib/saper/actions/convert_to_xml.rb +1 -1
  12. data/lib/saper/actions/create_atom.rb +6 -2
  13. data/lib/saper/actions/fetch.rb +3 -2
  14. data/lib/saper/actions/fetch_with_token.rb +18 -0
  15. data/lib/saper/actions/find.rb +1 -1
  16. data/lib/saper/actions/find_first.rb +1 -1
  17. data/lib/saper/actions/get_attribute.rb +7 -2
  18. data/lib/saper/actions/get_contents.rb +1 -1
  19. data/lib/saper/actions/get_text.rb +1 -1
  20. data/lib/saper/actions/nothing.rb +11 -0
  21. data/lib/saper/actions/prepend_with.rb +2 -2
  22. data/lib/saper/actions/remove_after.rb +2 -2
  23. data/lib/saper/actions/remove_before.rb +2 -2
  24. data/lib/saper/actions/remove_matching.rb +2 -2
  25. data/lib/saper/actions/remove_tags.rb +1 -1
  26. data/lib/saper/actions/replace.rb +1 -1
  27. data/lib/saper/actions/run_recipe.rb +2 -2
  28. data/lib/saper/actions/run_recipe_and_save.rb +3 -3
  29. data/lib/saper/actions/save.rb +2 -2
  30. data/lib/saper/actions/select_matching.rb +2 -2
  31. data/lib/saper/actions/set_input.rb +1 -1
  32. data/lib/saper/actions/skip_tags.rb +1 -1
  33. data/lib/saper/actions/split.rb +1 -1
  34. data/lib/saper/arguments/attribute.rb +6 -0
  35. data/lib/saper/arguments/recipe.rb +12 -6
  36. data/lib/saper/arguments/service.rb +12 -0
  37. data/lib/saper/arguments/text.rb +1 -0
  38. data/lib/saper/arguments/timezone.rb +2 -1
  39. data/lib/saper/arguments/url.rb +12 -0
  40. data/lib/saper/arguments/variable.rb +2 -1
  41. data/lib/saper/arguments/xpath.rb +2 -1
  42. data/lib/saper/core/action.rb +43 -13
  43. data/lib/saper/core/argument.rb +30 -14
  44. data/lib/saper/core/browser.rb +29 -28
  45. data/lib/saper/core/dsl.rb +14 -16
  46. data/lib/saper/core/error.rb +1 -1
  47. data/lib/saper/core/item.rb +2 -2
  48. data/lib/saper/core/keychain.rb +58 -5
  49. data/lib/saper/core/namespace.rb +15 -18
  50. data/lib/saper/core/recipe.rb +53 -12
  51. data/lib/saper/core/result.rb +72 -0
  52. data/lib/saper/core/runtime.rb +44 -177
  53. data/lib/saper/core/stack.rb +57 -0
  54. data/lib/saper/items/atom.rb +18 -1
  55. data/lib/saper/items/document.rb +39 -19
  56. data/lib/saper/items/html.rb +52 -7
  57. data/lib/saper/items/json.rb +19 -1
  58. data/lib/saper/items/markdown.rb +14 -4
  59. data/lib/saper/items/nothing.rb +6 -0
  60. data/lib/saper/items/text.rb +28 -3
  61. data/lib/saper/items/time.rb +25 -2
  62. data/lib/saper/items/url.rb +8 -2
  63. data/lib/saper/items/xml.rb +51 -11
  64. data/lib/{lib → saper/patches}/mechanize.rb +0 -0
  65. data/lib/{lib → saper/patches}/nokogiri.rb +0 -0
  66. data/lib/saper/version.rb +2 -2
  67. data/spec/actions/append_with_spec.rb +29 -52
  68. data/spec/actions/convert_to_html_spec.rb +13 -30
  69. data/spec/actions/convert_to_json_spec.rb +13 -30
  70. data/spec/actions/convert_to_markdown_spec.rb +17 -19
  71. data/spec/actions/convert_to_time_spec.rb +25 -43
  72. data/spec/actions/convert_to_xml_spec.rb +15 -11
  73. data/spec/actions/create_atom_spec.rb +11 -19
  74. data/spec/actions/fetch_spec.rb +3 -8
  75. data/spec/actions/find_first_spec.rb +38 -40
  76. data/spec/actions/find_spec.rb +23 -39
  77. data/spec/actions/get_attribute_spec.rb +30 -3
  78. data/spec/actions/{get_contents.rb → get_contents_spec.rb} +0 -0
  79. data/spec/actions/{get_text.rb → get_text_spec.rb} +0 -0
  80. data/spec/actions/nothing_spec.rb +7 -0
  81. data/spec/actions/prepend_with_spec.rb +31 -18
  82. data/spec/actions/{remove_after.rb → remove_after_spec.rb} +0 -0
  83. data/spec/actions/{remove_before.rb → remove_before_spec.rb} +0 -0
  84. data/spec/actions/remove_matching_spec.rb +7 -0
  85. data/spec/actions/remove_tags_spec.rb +7 -0
  86. data/spec/actions/run_recipe_and_save_spec.rb +7 -0
  87. data/spec/actions/run_recipe_spec.rb +7 -0
  88. data/spec/arguments/attribute_spec.rb +7 -0
  89. data/spec/arguments/recipe_spec.rb +7 -0
  90. data/spec/arguments/text_spec.rb +7 -0
  91. data/spec/arguments/timezone_spec.rb +7 -0
  92. data/spec/arguments/variable_spec.rb +7 -0
  93. data/spec/arguments/xpath_spec.rb +7 -0
  94. data/spec/core/action_spec.rb +13 -142
  95. data/spec/core/argument_spec.rb +38 -71
  96. data/spec/core/browser_spec.rb +18 -3
  97. data/spec/core/dsl_spec.rb +1 -1
  98. data/spec/core/item_spec.rb +1 -1
  99. data/spec/core/namespace_spec.rb +0 -11
  100. data/spec/core/recipe_spec.rb +54 -77
  101. data/spec/core/result_spec.rb +7 -0
  102. data/spec/core/runtime_spec.rb +20 -151
  103. data/spec/core/stack_spec.rb +7 -0
  104. data/spec/integration/simple_invalid_spec.rb +39 -0
  105. data/spec/integration/simple_valid_spec.rb +39 -0
  106. data/spec/items/atom_spec.rb +6 -1
  107. data/spec/items/document_spec.rb +93 -15
  108. data/spec/items/html_spec.rb +45 -28
  109. data/spec/items/json_spec.rb +10 -10
  110. data/spec/items/markdown_spec.rb +24 -3
  111. data/spec/items/nothing_spec.rb +1 -1
  112. data/spec/items/text_spec.rb +13 -41
  113. data/spec/items/time_spec.rb +25 -4
  114. data/spec/items/url_spec.rb +1 -7
  115. data/spec/items/xml_spec.rb +46 -39
  116. data/spec/spec_helper.rb +2 -21
  117. metadata +63 -60
  118. data/lib/lib/json_search.rb +0 -54
  119. data/spec/actions/run_recipe_and_save_spec.tmp.rb +0 -52
  120. data/spec/actions/run_recipe_spec.tmp.rb +0 -53
@@ -1,22 +1,3 @@
1
+ require 'minitest/spec'
2
+ require 'minitest/autorun'
1
3
  require 'saper'
2
-
3
- class EmptyAction < Saper::Action
4
- # default configuration
5
- end
6
-
7
- class TestAction < Saper::Action
8
- accepts :text
9
- end
10
-
11
- class ActionWithMandatoryArgument < Saper::Action
12
- accepts :text
13
- argument :text
14
- run { |input, string| "%s %s" % [string, input] }
15
- end
16
-
17
- class ActionWithOptionalArgument < Saper::Action
18
- accepts :text
19
- argument :text, :optional => true
20
- run { |input, string| "%s %s" % [string, input] }
21
- end
22
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Serebryakov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-05 00:00:00.000000000 Z
11
+ date: 2014-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mechanize
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.8.1
55
- - !ruby/object:Gem::Dependency
56
- name: vremya
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 1.0.0
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ~>
67
- - !ruby/object:Gem::Version
68
- version: 1.0.0
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: reverse_markdown
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -95,75 +81,61 @@ dependencies:
95
81
  - !ruby/object:Gem::Version
96
82
  version: 2.0.0
97
83
  - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ~>
102
- - !ruby/object:Gem::Version
103
- version: 10.3.1
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ~>
109
- - !ruby/object:Gem::Version
110
- version: 10.3.1
111
- - !ruby/object:Gem::Dependency
112
- name: rspec
84
+ name: jpath
113
85
  requirement: !ruby/object:Gem::Requirement
114
86
  requirements:
115
87
  - - ~>
116
88
  - !ruby/object:Gem::Version
117
- version: 2.14.1
118
- type: :development
89
+ version: 0.1.0
90
+ type: :runtime
119
91
  prerelease: false
120
92
  version_requirements: !ruby/object:Gem::Requirement
121
93
  requirements:
122
94
  - - ~>
123
95
  - !ruby/object:Gem::Version
124
- version: 2.14.1
96
+ version: 0.1.0
125
97
  - !ruby/object:Gem::Dependency
126
- name: yard
98
+ name: vremya
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - ~>
130
102
  - !ruby/object:Gem::Version
131
- version: 0.8.7
132
- type: :development
103
+ version: 1.0.0
104
+ type: :runtime
133
105
  prerelease: false
134
106
  version_requirements: !ruby/object:Gem::Requirement
135
107
  requirements:
136
108
  - - ~>
137
109
  - !ruby/object:Gem::Version
138
- version: 0.8.7
110
+ version: 1.0.0
139
111
  - !ruby/object:Gem::Dependency
140
- name: guard
112
+ name: rake
141
113
  requirement: !ruby/object:Gem::Requirement
142
114
  requirements:
143
115
  - - ~>
144
116
  - !ruby/object:Gem::Version
145
- version: 2.6.0
117
+ version: 10.3.2
146
118
  type: :development
147
119
  prerelease: false
148
120
  version_requirements: !ruby/object:Gem::Requirement
149
121
  requirements:
150
122
  - - ~>
151
123
  - !ruby/object:Gem::Version
152
- version: 2.6.0
124
+ version: 10.3.2
153
125
  - !ruby/object:Gem::Dependency
154
- name: guard-rspec
126
+ name: yard
155
127
  requirement: !ruby/object:Gem::Requirement
156
128
  requirements:
157
129
  - - ~>
158
130
  - !ruby/object:Gem::Version
159
- version: 4.2.8
131
+ version: 0.8.7
160
132
  type: :development
161
133
  prerelease: false
162
134
  version_requirements: !ruby/object:Gem::Requirement
163
135
  requirements:
164
136
  - - ~>
165
137
  - !ruby/object:Gem::Version
166
- version: 4.2.8
138
+ version: 0.8.7
167
139
  description: Web automation library that allows to crawl websites and extract data
168
140
  in an efficient and fault-tolerant manner.
169
141
  email: alex@merimond.com
@@ -173,9 +145,6 @@ extensions: []
173
145
  extra_rdoc_files: []
174
146
  files:
175
147
  - bin/saper
176
- - lib/lib/json_search.rb
177
- - lib/lib/mechanize.rb
178
- - lib/lib/nokogiri.rb
179
148
  - lib/saper/actions/append_with.rb
180
149
  - lib/saper/actions/convert_to_html.rb
181
150
  - lib/saper/actions/convert_to_json.rb
@@ -184,11 +153,13 @@ files:
184
153
  - lib/saper/actions/convert_to_xml.rb
185
154
  - lib/saper/actions/create_atom.rb
186
155
  - lib/saper/actions/fetch.rb
156
+ - lib/saper/actions/fetch_with_token.rb
187
157
  - lib/saper/actions/find.rb
188
158
  - lib/saper/actions/find_first.rb
189
159
  - lib/saper/actions/get_attribute.rb
190
160
  - lib/saper/actions/get_contents.rb
191
161
  - lib/saper/actions/get_text.rb
162
+ - lib/saper/actions/nothing.rb
192
163
  - lib/saper/actions/prepend_with.rb
193
164
  - lib/saper/actions/remove_after.rb
194
165
  - lib/saper/actions/remove_before.rb
@@ -204,8 +175,10 @@ files:
204
175
  - lib/saper/actions/split.rb
205
176
  - lib/saper/arguments/attribute.rb
206
177
  - lib/saper/arguments/recipe.rb
178
+ - lib/saper/arguments/service.rb
207
179
  - lib/saper/arguments/text.rb
208
180
  - lib/saper/arguments/timezone.rb
181
+ - lib/saper/arguments/url.rb
209
182
  - lib/saper/arguments/variable.rb
210
183
  - lib/saper/arguments/xpath.rb
211
184
  - lib/saper/core/action.rb
@@ -218,7 +191,9 @@ files:
218
191
  - lib/saper/core/logger.rb
219
192
  - lib/saper/core/namespace.rb
220
193
  - lib/saper/core/recipe.rb
194
+ - lib/saper/core/result.rb
221
195
  - lib/saper/core/runtime.rb
196
+ - lib/saper/core/stack.rb
222
197
  - lib/saper/core/type.rb
223
198
  - lib/saper/items/atom.rb
224
199
  - lib/saper/items/document.rb
@@ -230,6 +205,8 @@ files:
230
205
  - lib/saper/items/time.rb
231
206
  - lib/saper/items/url.rb
232
207
  - lib/saper/items/xml.rb
208
+ - lib/saper/patches/mechanize.rb
209
+ - lib/saper/patches/nokogiri.rb
233
210
  - lib/saper/version.rb
234
211
  - lib/saper.rb
235
212
  - Rakefile
@@ -246,19 +223,28 @@ files:
246
223
  - spec/actions/find_first_spec.rb
247
224
  - spec/actions/find_spec.rb
248
225
  - spec/actions/get_attribute_spec.rb
249
- - spec/actions/get_contents.rb
250
- - spec/actions/get_text.rb
226
+ - spec/actions/get_contents_spec.rb
227
+ - spec/actions/get_text_spec.rb
228
+ - spec/actions/nothing_spec.rb
251
229
  - spec/actions/prepend_with_spec.rb
252
- - spec/actions/remove_after.rb
253
- - spec/actions/remove_before.rb
230
+ - spec/actions/remove_after_spec.rb
231
+ - spec/actions/remove_before_spec.rb
232
+ - spec/actions/remove_matching_spec.rb
233
+ - spec/actions/remove_tags_spec.rb
254
234
  - spec/actions/replace_spec.rb
255
- - spec/actions/run_recipe_and_save_spec.tmp.rb
256
- - spec/actions/run_recipe_spec.tmp.rb
235
+ - spec/actions/run_recipe_and_save_spec.rb
236
+ - spec/actions/run_recipe_spec.rb
257
237
  - spec/actions/save_spec.rb
258
238
  - spec/actions/select_matching_spec.rb
259
239
  - spec/actions/set_input_spec.rb
260
240
  - spec/actions/skip_tags_spec.rb
261
241
  - spec/actions/split_spec.rb
242
+ - spec/arguments/attribute_spec.rb
243
+ - spec/arguments/recipe_spec.rb
244
+ - spec/arguments/text_spec.rb
245
+ - spec/arguments/timezone_spec.rb
246
+ - spec/arguments/variable_spec.rb
247
+ - spec/arguments/xpath_spec.rb
262
248
  - spec/core/action_spec.rb
263
249
  - spec/core/argument_spec.rb
264
250
  - spec/core/browser_spec.rb
@@ -268,8 +254,12 @@ files:
268
254
  - spec/core/logger_spec.rb
269
255
  - spec/core/namespace_spec.rb
270
256
  - spec/core/recipe_spec.rb
257
+ - spec/core/result_spec.rb
271
258
  - spec/core/runtime_spec.rb
259
+ - spec/core/stack_spec.rb
272
260
  - spec/core/type_spec.rb
261
+ - spec/integration/simple_invalid_spec.rb
262
+ - spec/integration/simple_valid_spec.rb
273
263
  - spec/items/atom_spec.rb
274
264
  - spec/items/document_spec.rb
275
265
  - spec/items/html_spec.rb
@@ -301,7 +291,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
301
291
  version: '0'
302
292
  requirements: []
303
293
  rubyforge_project:
304
- rubygems_version: 2.0.3
294
+ rubygems_version: 2.0.14
305
295
  signing_key:
306
296
  specification_version: 4
307
297
  summary: Ruby data scraping library
@@ -317,19 +307,28 @@ test_files:
317
307
  - spec/actions/find_first_spec.rb
318
308
  - spec/actions/find_spec.rb
319
309
  - spec/actions/get_attribute_spec.rb
320
- - spec/actions/get_contents.rb
321
- - spec/actions/get_text.rb
310
+ - spec/actions/get_contents_spec.rb
311
+ - spec/actions/get_text_spec.rb
312
+ - spec/actions/nothing_spec.rb
322
313
  - spec/actions/prepend_with_spec.rb
323
- - spec/actions/remove_after.rb
324
- - spec/actions/remove_before.rb
314
+ - spec/actions/remove_after_spec.rb
315
+ - spec/actions/remove_before_spec.rb
316
+ - spec/actions/remove_matching_spec.rb
317
+ - spec/actions/remove_tags_spec.rb
325
318
  - spec/actions/replace_spec.rb
326
- - spec/actions/run_recipe_and_save_spec.tmp.rb
327
- - spec/actions/run_recipe_spec.tmp.rb
319
+ - spec/actions/run_recipe_and_save_spec.rb
320
+ - spec/actions/run_recipe_spec.rb
328
321
  - spec/actions/save_spec.rb
329
322
  - spec/actions/select_matching_spec.rb
330
323
  - spec/actions/set_input_spec.rb
331
324
  - spec/actions/skip_tags_spec.rb
332
325
  - spec/actions/split_spec.rb
326
+ - spec/arguments/attribute_spec.rb
327
+ - spec/arguments/recipe_spec.rb
328
+ - spec/arguments/text_spec.rb
329
+ - spec/arguments/timezone_spec.rb
330
+ - spec/arguments/variable_spec.rb
331
+ - spec/arguments/xpath_spec.rb
333
332
  - spec/core/action_spec.rb
334
333
  - spec/core/argument_spec.rb
335
334
  - spec/core/browser_spec.rb
@@ -339,8 +338,12 @@ test_files:
339
338
  - spec/core/logger_spec.rb
340
339
  - spec/core/namespace_spec.rb
341
340
  - spec/core/recipe_spec.rb
341
+ - spec/core/result_spec.rb
342
342
  - spec/core/runtime_spec.rb
343
+ - spec/core/stack_spec.rb
343
344
  - spec/core/type_spec.rb
345
+ - spec/integration/simple_invalid_spec.rb
346
+ - spec/integration/simple_valid_spec.rb
344
347
  - spec/items/atom_spec.rb
345
348
  - spec/items/document_spec.rb
346
349
  - spec/items/html_spec.rb
@@ -1,54 +0,0 @@
1
- # XPath-style library for JSON
2
-
3
- module JSONSearch
4
-
5
- def self.find(object, selector)
6
- if object.is_a?(Array)
7
- return object.map { |item|
8
- find(item, selector)
9
- }.flatten.compact
10
- end
11
- case selector
12
- when /\A\/([^\/]+)/
13
- name = $1
14
- sub = selector.sub($&, "")
15
- children(object, name).map { |child|
16
- find(child, sub)
17
- }.flatten.compact
18
- when /\A\/\/([^\/]+)/
19
- name = $1
20
- sub = selector.sub($&, "")
21
- descendants(object, name).map { |descendant|
22
- find(descendant, sub)
23
- }.flatten.compact
24
- when /\A\z/
25
- object
26
- else
27
- raise "Unsupported selector"
28
- end
29
- end
30
-
31
- def self.children(object, name)
32
- case object
33
- when Array
34
- object.map { |item|
35
- children(item, name)
36
- }.flatten
37
- when Hash
38
- if name == "*"
39
- object.values
40
- else
41
- [object[name]]
42
- end
43
- else
44
- []
45
- end
46
- end
47
-
48
- def self.descendants(object, name)
49
- children(object, "*").map { |child|
50
- descendants(child, name)
51
- }.push(*children(object, name))
52
- end
53
-
54
- end
@@ -1,52 +0,0 @@
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
@@ -1,53 +0,0 @@
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