smoke 0.5.17 → 0.5.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/README.markdown +5 -5
  2. data/Rakefile +1 -0
  3. data/VERSION.yml +2 -2
  4. data/lib/core_ext/array.rb +12 -0
  5. data/lib/smoke.rb +24 -13
  6. data/lib/smoke/cache.rb +4 -4
  7. data/lib/smoke/origin.rb +6 -11
  8. data/lib/smoke/request.rb +5 -14
  9. data/lib/smoke/transformer.rb +7 -0
  10. data/lib/smoke/transformers/json.rb +15 -0
  11. data/lib/smoke/transformers/ruby.rb +11 -0
  12. data/lib/smoke/{output → transformers}/xml.rb +12 -6
  13. data/lib/smoke/transformers/yaml.rb +15 -0
  14. data/spec/smoke/origin_spec.rb +4 -0
  15. data/spec/smoke/request_spec.rb +7 -0
  16. data/spec/smoke/{output → transformers}/xml_spec.rb +4 -6
  17. data/spec/smoke/transformers_spec.rb +35 -0
  18. data/spec/smoke_spec.rb +18 -10
  19. data/spec/supports/twitter_timeline.json +22 -0
  20. metadata +23 -30
  21. data/rdoc/classes/Smoke.html +0 -260
  22. data/rdoc/classes/Smoke/Origin.html +0 -340
  23. data/rdoc/classes/Smoke/Source/Data.html +0 -126
  24. data/rdoc/classes/Smoke/Source/Feed.html +0 -117
  25. data/rdoc/classes/Smoke/Source/YQL.html +0 -223
  26. data/rdoc/created.rid +0 -1
  27. data/rdoc/files/README_markdown.html +0 -180
  28. data/rdoc/files/lib/core_ext/hash_rb.html +0 -49
  29. data/rdoc/files/lib/smoke/origin_rb.html +0 -49
  30. data/rdoc/files/lib/smoke/request_rb.html +0 -49
  31. data/rdoc/files/lib/smoke/source/data_rb.html +0 -49
  32. data/rdoc/files/lib/smoke/source/feed_rb.html +0 -49
  33. data/rdoc/files/lib/smoke/source/join_rb.html +0 -49
  34. data/rdoc/files/lib/smoke/source/yql_rb.html +0 -49
  35. data/rdoc/files/lib/smoke_rb.html +0 -65
  36. data/rdoc/fr_class_index.html +0 -21
  37. data/rdoc/fr_file_index.html +0 -28
  38. data/rdoc/fr_method_index.html +0 -4459
  39. data/rdoc/index.html +0 -15
  40. data/rdoc/rdoc-style.css +0 -319
  41. data/spec/smoke/input/xls_spec.rb +0 -15
  42. data/spec/smoke/shared_spec.rb +0 -182
  43. data/spec/supports/gov_act_toliets.xls +0 -0
@@ -1,15 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
2
- <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
3
- <head>
4
- <title>smoke</title>
5
- <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
6
- </head>
7
- <frameset border='1' bordercolor='gray' cols='20%, *' frameborder='1'>
8
- <frameset rows='15%, 35%, 50%'>
9
- <frame name='Files' src='fr_file_index.html' title='Files'></frame>
10
- <frame name='Classes' src='fr_class_index.html'></frame>
11
- <frame name='Methods' src='fr_method_index.html'></frame>
12
- </frameset>
13
- <frame name='docwin' src='files/README_markdown.html'></frame>
14
- </frameset>
15
- </html>
@@ -1,319 +0,0 @@
1
- html, body {
2
- height: 100%; }
3
-
4
- body {
5
- font-family: Lucida Grande , Verdana, Arial, Helvetica, sans-serif;
6
- font-size: 90%;
7
- margin: 0;
8
- padding: 0;
9
- background: white;
10
- color: black; }
11
-
12
- #wrapper {
13
- min-height: 100%;
14
- height: auto !important;
15
- height: 100%;
16
- margin: 0 auto -43px; }
17
-
18
- #footer-push {
19
- height: 43px; }
20
-
21
- div.header, #footer {
22
- background: #eee; }
23
-
24
- #footer {
25
- border-top: 1px solid silver;
26
- margin-top: 12px;
27
- padding: 0 2em;
28
- line-height: 30px;
29
- text-align: center;
30
- font-variant: small-caps;
31
- font-size: 95%; }
32
-
33
- .clearing:after {
34
- content: ".";
35
- visibility: hidden;
36
- height: 0;
37
- display: block;
38
- clear: both; }
39
- * html .clearing {
40
- height: 1px; }
41
- .clearing *:first-child + html {
42
- overflow: hidden; }
43
-
44
- h1, h2, h3, h4, h5, h6 {
45
- margin: 0;
46
- font-weight: normal; }
47
-
48
- a {
49
- color: #0b3e71; }
50
- a:hover {
51
- background: #336699;
52
- text-decoration: none;
53
- color: #eef; }
54
-
55
- #diagram img {
56
- border: 0; }
57
-
58
- #description a, .method .description a, .header a {
59
- color: #336699; }
60
- #description a:hover, .method .description a:hover, .header a:hover {
61
- color: #eee; }
62
- #description h1 a, #description h2 a, #description h3 a, #description h4 a, #description h5 a, #description h6 a, .method .description h1 a, .method .description h2 a, .method .description h3 a, .method .description h4 a, .method .description h5 a, .method .description h6 a, .header h1 a, .header h2 a, .header h3 a, .header h4 a, .header h5 a, .header h6 a {
63
- color: #0b3e71; }
64
-
65
- ol {
66
- margin: 0;
67
- padding: 0;
68
- list-style: none; }
69
- ol li {
70
- margin-left: 0;
71
- white-space: nowrap; }
72
- ol li.other {
73
- display: none; }
74
-
75
- ol.expanded li.other {
76
- display: list-item; }
77
-
78
- table {
79
- margin-bottom: 1em;
80
- font-size: 1em;
81
- border-collapse: collapse; }
82
- table td, table th {
83
- padding: .4em .8em; }
84
- table thead {
85
- background-color: #e8e8e8; }
86
- table thead th {
87
- font-variant: small-caps;
88
- color: #666666; }
89
- table tr {
90
- border-bottom: 1px solid silver; }
91
-
92
- #index a.show, div.header a.show {
93
- text-decoration: underline;
94
- font-style: italic;
95
- color: #666666; }
96
- #index a.show:after, div.header a.show:after {
97
- content: " ..."; }
98
- #index a.show:hover, div.header a.show:hover {
99
- color: black;
100
- background: #ffe; }
101
-
102
- #index {
103
- font: 85%/1.2 Arial, Helvetica, sans-serif; }
104
- #index a {
105
- text-decoration: none; }
106
- #index h1 {
107
- padding: .2em .5em .1em;
108
- background: #ccc;
109
- font: small-caps 1.2em Georgia, serif;
110
- color: #333;
111
- border-bottom: 1px solid gray; }
112
- #index form {
113
- margin: 0;
114
- padding: 0; }
115
- #index form input {
116
- margin: .4em;
117
- margin-bottom: 0;
118
- width: 90%; }
119
- #index form #search.untouched {
120
- color: #777777; }
121
- #index ol {
122
- padding: .4em .5em; }
123
- #index ol li {
124
- white-space: nowrap; }
125
- #index #index-entries li a {
126
- padding: 1px 2px; }
127
- #index #index-entries.classes {
128
- font-size: 1.1em; }
129
- #index #index-entries.classes ol {
130
- padding: 0; }
131
- #index #index-entries.classes span.nodoc {
132
- display: none; }
133
- #index #index-entries.classes span.nodoc, #index #index-entries.classes a {
134
- font-weight: bold; }
135
- #index #index-entries.classes .parent {
136
- font-weight: normal; }
137
- #index #index-entries.methods li, #index #search-results.methods li {
138
- margin-bottom: 0.2em; }
139
- #index #index-entries.methods li a .method_name, #index #search-results.methods li a .method_name {
140
- margin-right: 0.25em; }
141
- #index #index-entries.methods li a .module_name, #index #search-results.methods li a .module_name {
142
- color: #666666; }
143
- #index #index-entries.methods li a:hover .module_name, #index #search-results.methods li a:hover .module_name {
144
- color: #ddd; }
145
-
146
- div.header {
147
- font-size: 80%;
148
- padding: .5em 2%;
149
- font-family: Arial, Helvetica, sans-serif;
150
- border-bottom: 1px solid silver; }
151
- div.header .name {
152
- font-size: 1.6em;
153
- font-family: Georgia, serif; }
154
- div.header .name .type {
155
- color: #666666;
156
- font-size: 80%;
157
- font-variant: small-caps; }
158
- div.header h1.name {
159
- font-size: 2.2em; }
160
- div.header .paths, div.header .last-update, div.header .parent {
161
- color: #666666; }
162
- div.header .last-update .datetime {
163
- color: #484848; }
164
- div.header .parent {
165
- margin-top: .3em; }
166
- div.header .parent strong {
167
- font-weight: normal;
168
- color: #484848; }
169
-
170
- #content {
171
- padding: 12px 2%; }
172
- div.class #content {
173
- position: relative;
174
- width: 72%; }
175
- #content pre, #content .method .synopsis {
176
- font: 14px Monaco, DejaVu Sans Mono , Bitstream Vera Sans Mono , Courier New , monospace; }
177
- #content pre {
178
- color: black;
179
- background: #eee;
180
- border: 1px solid silver;
181
- padding: .5em .8em;
182
- overflow: auto; }
183
- #content p code, #content p tt, #content li code, #content li tt, #content dl code, #content dl tt {
184
- font: 14px Monaco, DejaVu Sans Mono , Bitstream Vera Sans Mono , Courier New , monospace;
185
- background: #ffffe3;
186
- padding: 2px 3px;
187
- line-height: 1.4; }
188
- #content h1 code, #content h1 tt, #content h2 code, #content h2 tt, #content h3 code, #content h3 tt, #content h4 code, #content h4 tt, #content h5 code, #content h5 tt, #content h6 code, #content h6 tt {
189
- font-size: 1.1em; }
190
- #content #text {
191
- position: relative; }
192
- #content #description p {
193
- margin-top: .5em; }
194
- #content #description h1, #content #description h2, #content #description h3, #content #description h4, #content #description h5, #content #description h6 {
195
- font-family: Georgia, serif; }
196
- #content #description h1 {
197
- font-size: 2.2em;
198
- margin-bottom: .2em;
199
- border-bottom: 3px double #d8d8d8;
200
- padding-bottom: .1em; }
201
- #content #description h2 {
202
- font-size: 1.8em;
203
- color: #0e3062;
204
- margin: .8em 0 .3em 0; }
205
- #content #description h3 {
206
- font-size: 1.6em;
207
- margin: .8em 0 .3em 0;
208
- color: #666666; }
209
- #content #description h4 {
210
- font-size: 1.4em;
211
- margin: .8em 0 .3em 0; }
212
- #content #description h5 {
213
- font-size: 1.2em;
214
- margin: .8em 0 .3em 0;
215
- color: #0e3062; }
216
- #content #description h6 {
217
- font-size: 1.0em;
218
- margin: .8em 0 .3em 0;
219
- color: #666666; }
220
- #content #description ul, #content #description ol, #content .method .description ul, #content .method .description ol {
221
- margin: .8em 0;
222
- padding-left: 1.5em; }
223
- #content #description ol, #content .method .description ol {
224
- list-style: decimal; }
225
- #content #description ol li, #content .method .description ol li {
226
- white-space: normal; }
227
-
228
- #method-list {
229
- position: absolute;
230
- top: 0px;
231
- right: -33%;
232
- width: 28%;
233
- background: #eee;
234
- border: 1px solid silver;
235
- padding: .4em 1%;
236
- overflow: hidden; }
237
- #method-list h2 {
238
- font-size: 1.3em; }
239
- #method-list h3 {
240
- font-variant: small-caps;
241
- text-transform: capitalize;
242
- font-family: Georgia, serif;
243
- color: #666;
244
- font-size: 1.1em; }
245
- #method-list ol {
246
- padding: 0 0 .5em .5em; }
247
-
248
- #context {
249
- border-top: 1px dashed silver;
250
- margin-top: 1em;
251
- margin-bottom: 1em; }
252
-
253
- #context h2, #section h2 {
254
- font: small-caps 1.2em Georgia, serif;
255
- color: #444;
256
- margin: 1em 0 .2em 0; }
257
-
258
- #methods .method {
259
- border: 1px solid silver;
260
- margin-top: .5em;
261
- background: #eee; }
262
- #methods .method .synopsis {
263
- color: black;
264
- background: silver;
265
- padding: .2em 1em; }
266
- #methods .method .synopsis .name {
267
- font-weight: bold; }
268
- #methods .method .synopsis a {
269
- text-decoration: none; }
270
- #methods .method .description {
271
- padding: 0 1em; }
272
- #methods .method .description pre {
273
- background: #f8f8f8; }
274
- #methods .method .source {
275
- margin: .5em 0; }
276
- #methods .method .source-toggle {
277
- font-size: 85%;
278
- margin-left: 1em; }
279
- #methods .public-class {
280
- background: #ffffe4; }
281
- #methods .public-instance .synopsis {
282
- color: #eee;
283
- background: #336699; }
284
-
285
- #content .method .source pre {
286
- background: #262626;
287
- color: #ffdead;
288
- margin: 1em;
289
- padding: 0.5em;
290
- border: 1px dashed #999;
291
- overflow: auto; }
292
- #content .method .source pre .ruby-constant {
293
- color: #7fffd4;
294
- background: transparent; }
295
- #content .method .source pre .ruby-keyword {
296
- color: #00ffff;
297
- background: transparent; }
298
- #content .method .source pre .ruby-ivar {
299
- color: #eedd82;
300
- background: transparent; }
301
- #content .method .source pre .ruby-operator {
302
- color: #00ffee;
303
- background: transparent; }
304
- #content .method .source pre .ruby-identifier {
305
- color: #ffdead;
306
- background: transparent; }
307
- #content .method .source pre .ruby-node {
308
- color: #ffa07a;
309
- background: transparent; }
310
- #content .method .source pre .ruby-comment {
311
- color: #b22222;
312
- font-weight: bold;
313
- background: transparent; }
314
- #content .method .source pre .ruby-regexp {
315
- color: #ffa07a;
316
- background: transparent; }
317
- #content .method .source pre .ruby-value {
318
- color: #7fffd4;
319
- background: transparent; }
@@ -1,15 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "..", "..", "spec_helper.rb")
2
-
3
- describe "parsing excel" do
4
- before :all do
5
- @url = "http://fake.tld/canned/xls"
6
- @web_search = File.join(SPEC_DIR, 'supports', 'gov_act_toliets.xls')
7
- FakeWeb.register_uri(:get, @url, :response => @web_search)
8
-
9
- @request = Smoke::Request.new(@url, {:type => :excel})
10
- end
11
-
12
- it "should automagically parse it" do
13
- puts @request.body.keys
14
- end
15
- end
@@ -1,182 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "..", "spec_helper.rb")
2
-
3
- shared_examples_for "all sources" do
4
- describe "transforms" do
5
-
6
- it "emit should require a block" do
7
- lambda { @source.emit }.should raise_error
8
- lambda { @source.emit {} }.should_not raise_error
9
- end
10
-
11
- it "should respond to transform" do
12
- @source.should respond_to(:transform)
13
- end
14
-
15
- it "transform should require a block" do
16
- lambda { @source.transform }.should raise_error
17
- lambda { @source.transform {} }.should_not raise_error
18
- end
19
-
20
- it "should have at least one transformation" do
21
- @source.transformation.size.should_not be_nil
22
- end
23
- end
24
-
25
- describe "key insertion" do
26
- it "should respond to insert" do
27
- @source.should respond_to(:insert)
28
- end
29
-
30
- it "should insert values into each key" do
31
- @source.insert(:source, "twitter").output.first.should have_key :source
32
- @source.insert(:source, "twitter").output.first[:source].should == "twitter"
33
- end
34
- end
35
-
36
- describe "general object transformations" do
37
- it "should respond to emit" do
38
- @source.should respond_to(:emit)
39
- end
40
-
41
- it "should rename properties" do
42
- @source.rename(:title => :header).output.first.should have_key(:header)
43
- end
44
-
45
- it "should sort by a given property" do
46
- @source.sort(:header).output.first[:header].should == "Kangaroo"
47
- end
48
-
49
- it "should reverse the results" do
50
- @source.sort(:header).reverse.output.should == [{:header => "Platypus", :name => "Peter"}, {:header => "Kangaroo", :name => "Kelly"}]
51
- end
52
-
53
- it "should truncate results given a length" do
54
- @source.truncate(1).output.should be_an_instance_of(Hash)
55
- end
56
-
57
- describe "filtering" do
58
- before do
59
- TestSource.source(:keep) do
60
- emit do
61
- transform :head do |head|
62
- head.gsub(/Animal: /, '')
63
- end
64
- end
65
- end
66
-
67
- TestSource.source(:discard) do
68
- emit do
69
- transform :head do |head|
70
- head.gsub(/Animal: /, '')
71
- end
72
- end
73
- end
74
- end
75
-
76
- it "should keep items" do
77
- @source.should(respond_to(:keep))
78
- end
79
-
80
- it "should only contain items that match" do
81
- @source.keep(:head, /^K/).output.should == {:head => "Kangaroo", :name => "Kelly"}
82
- end
83
-
84
- it "should discard items" do
85
- @source.should(respond_to(:discard))
86
- end
87
-
88
- it "should not contain items that match" do
89
- @source.discard(:head, /^K/).output.should == {:head => "Platypus", :name => "Peter"}
90
- end
91
- end
92
- end
93
-
94
- describe "output" do
95
- it "should output" do
96
- @source.output.should be_an_instance_of(Array)
97
- end
98
-
99
- it "should output a single hash when there is only one result" do
100
- @source.truncate(1).output.should be_an_instance_of(Hash)
101
- end
102
-
103
- it "should output two items" do
104
- @source.output.size.should == 2
105
- end
106
-
107
- it "should output json" do
108
- @source.output(:json).should =~ /^\[\{/
109
- end
110
-
111
- it "should output yml" do
112
- @source.output(:yaml).should =~ /^--- \n- :/
113
- end
114
-
115
- it "should dispatch when output is called" do
116
- TestSource.source(:dispatch)
117
- @source.should_receive(:dispatch)
118
- @source.output
119
- end
120
- end
121
-
122
- describe "preperation" do
123
- before :all do
124
- @source = TestSource.source(:preperation)
125
- end
126
-
127
- it "should respond to prepare" do
128
- @source.should respond_to(:prepare)
129
- end
130
-
131
- it "should require a block" do
132
- lambda { @source.prepare }.should raise_error
133
- lambda { @source.prepare {} }.should_not raise_error
134
- end
135
- end
136
-
137
- describe "call order" do
138
- before :all do
139
- @url = "http://domain.tld/benschwarz/feed"
140
- FakeWeb.register_uri(:get, @url, :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
141
-
142
- Smoke.data :feed_preperation_call_order do
143
- prepare do
144
- url "http://domain.tld/#{username}/feed"
145
- end
146
-
147
- path :photos, :photo
148
- end
149
- end
150
-
151
- describe "before setting variables" do
152
- it "should fail" do
153
- lambda { @source.output }.should raise_error(NameError)
154
- end
155
- end
156
-
157
- describe "setting abstract properties" do
158
- it "should not respond to a property that hasn't been set" do
159
- lambda { @source.abstract }.should raise_error(NoMethodError)
160
- end
161
-
162
- it "should allow setting a property" do
163
- lambda { @source.abstract(:value) }.should_not raise_error(NoMethodError)
164
- @source.abstract.should == :value
165
- end
166
-
167
- it "should chain the source when setting a property" do
168
- @source.abstract(:value).should be_an_instance_of(Smoke::Data)
169
- end
170
- end
171
-
172
- describe "after setting variables" do
173
- it "should output successfully" do
174
- lambda { @source.username("benschwarz").output }.should_not raise_error
175
- end
176
-
177
- it "should have used the correct url" do
178
- @source.request.uri.should == @url
179
- end
180
- end
181
- end
182
- end