smoke 0.5.16 → 0.5.17
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.
- data/README.markdown +5 -1
- data/Rakefile +1 -1
- data/VERSION.yml +2 -1
- data/lib/smoke.rb +20 -7
- data/lib/smoke/origin.rb +13 -4
- data/lib/smoke/request.rb +6 -2
- data/lib/smoke/source/data.rb +33 -35
- data/lib/smoke/source/feed.rb +18 -20
- data/lib/smoke/source/join.rb +42 -44
- data/lib/smoke/source/yql.rb +76 -78
- data/spec/smoke/cache_spec.rb +1 -1
- data/spec/smoke/input/xls_spec.rb +15 -0
- data/spec/smoke/origin_spec.rb +2 -2
- data/spec/smoke/output/xml_spec.rb +1 -1
- data/spec/smoke/request_spec.rb +2 -2
- data/spec/smoke/shared_spec.rb +2 -2
- data/spec/smoke/source/data_spec.rb +3 -3
- data/spec/smoke/source/feed_spec.rb +2 -2
- data/spec/smoke/source/join_spec.rb +2 -2
- data/spec/smoke/source/yql_spec.rb +4 -4
- data/spec/smoke_spec.rb +43 -0
- data/spec/supports/gov_act_toliets.xls +0 -0
- metadata +15 -12
data/README.markdown
CHANGED
@@ -18,6 +18,10 @@ Then you can output as a plain ruby object or one of your other favourites (JSON
|
|
18
18
|
* Early [screencast](http://vimeo.com/4272804) to get developer / peer feedback
|
19
19
|
|
20
20
|
|
21
|
+
## Install
|
22
|
+
|
23
|
+
gem install smoke -s http://gemcutter.org
|
24
|
+
|
21
25
|
## The concept
|
22
26
|
|
23
27
|
The concept comes from using [Yahoo Pipes](http://pipes.yahoo.com) to make web based mash ups: Get a list of tv shows for my torrent client, compile a recipe book or make tools to give me a list of albums that artists in my music library are about to be released.
|
@@ -69,7 +73,7 @@ Source definition:
|
|
69
73
|
|
70
74
|
Execution:
|
71
75
|
|
72
|
-
Smoke
|
76
|
+
Smoke.delicious.username("bschwarz").output
|
73
77
|
|
74
78
|
|
75
79
|
### TODO (working on, just mental notes)
|
data/Rakefile
CHANGED
@@ -11,9 +11,9 @@ begin
|
|
11
11
|
gem.homepage = "http://github.com/benschwarz/smoke"
|
12
12
|
gem.authors = ["Ben Schwarz"]
|
13
13
|
gem.files = FileList['lib/**/*.rb', 'rdoc/**/*', '[A-Z]*', 'spec/**/*', 'vendor/**/*'].to_a
|
14
|
+
gem.add_development_dependency("fakeweb", ">= 1.2.5")
|
14
15
|
gem.add_dependency("simple-rss", "1.2")
|
15
16
|
gem.add_dependency("json", ">= 1.1.3")
|
16
|
-
gem.add_dependency("fakeweb", "1.2.5")
|
17
17
|
gem.add_dependency("crack", ">= 0.1.1")
|
18
18
|
gem.add_dependency("moneta", "0.6.0")
|
19
19
|
gem.add_dependency("rest-client", "1.0.3")
|
data/VERSION.yml
CHANGED
data/lib/smoke.rb
CHANGED
@@ -28,7 +28,7 @@ module Smoke
|
|
28
28
|
# Smoke.yql(:ruby) do ....
|
29
29
|
# Then access it:
|
30
30
|
# Smoke[:ruby]
|
31
|
-
# => #<Smoke::
|
31
|
+
# => #<Smoke::YQL::0x18428d4...
|
32
32
|
def [](source)
|
33
33
|
active_sources[source]
|
34
34
|
end
|
@@ -54,8 +54,16 @@ module Smoke
|
|
54
54
|
end
|
55
55
|
|
56
56
|
# Returns all activated smoke sources
|
57
|
-
def active_sources
|
58
|
-
|
57
|
+
def active_sources; @@active_sources; end
|
58
|
+
|
59
|
+
# Returns all exposed sources
|
60
|
+
def exposed_sources
|
61
|
+
active_sources.reject{|k,v| !v.exposed? }
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns all concealed sources
|
65
|
+
def concealed_sources
|
66
|
+
active_sources.reject{|k,v| !v.concealed? }
|
59
67
|
end
|
60
68
|
|
61
69
|
# Rename a source
|
@@ -95,9 +103,9 @@ module Smoke
|
|
95
103
|
@@config
|
96
104
|
end
|
97
105
|
|
98
|
-
def yql(name, &block);
|
99
|
-
def data(name, &block); Smoke::
|
100
|
-
def feed(name, &block); Smoke::
|
106
|
+
def yql(name, &block); Smoke::YQL.new(name, &block); end
|
107
|
+
def data(name, &block); Smoke::Data.new(name, &block); end
|
108
|
+
def feed(name, &block); Smoke::Feed.new(name, &block); end
|
101
109
|
|
102
110
|
# Join multiple sources together into a single feed
|
103
111
|
# Usage:
|
@@ -105,12 +113,17 @@ module Smoke
|
|
105
113
|
# name :stream
|
106
114
|
# path :photos, :photo
|
107
115
|
# end
|
108
|
-
def join(*names, &block); Smoke::
|
116
|
+
def join(*names, &block); Smoke::Join.new(names, &block); end
|
109
117
|
end
|
110
118
|
end
|
111
119
|
|
112
120
|
%w(core_ext/hash core_ext/string smoke/cache smoke/request smoke/origin smoke/output/xml).each {|r| require File.join(File.dirname(__FILE__), r)}
|
113
121
|
|
122
|
+
# Autoload the source classes
|
123
|
+
%w(YQL Data Feed Join).each do |r|
|
124
|
+
Smoke.autoload(r.to_sym, File.join(File.dirname(__FILE__), "smoke", "source", r.downcase))
|
125
|
+
end
|
126
|
+
|
114
127
|
class Object # :nodoc:
|
115
128
|
include Smoke
|
116
129
|
end
|
data/lib/smoke/origin.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module Smoke
|
2
2
|
class Origin
|
3
|
-
attr_reader :items, :requirements
|
3
|
+
attr_reader :items, :requirements, :exposed
|
4
4
|
attr_accessor :name
|
5
5
|
|
6
6
|
def initialize(name, &block)
|
7
7
|
raise StandardError, "Sources must have a name" unless name
|
8
8
|
@name = name
|
9
|
+
@exposed = true
|
9
10
|
@items, @prepare, @requirements, @transformation = [], [], [], []
|
10
11
|
|
11
12
|
activate!
|
@@ -237,6 +238,14 @@ module Smoke
|
|
237
238
|
@items = @items[0..(length - 1)]
|
238
239
|
end
|
239
240
|
|
241
|
+
# Expose and conceal, this is stictly a feature of rack/smoke.
|
242
|
+
# concealed sources will not be "available"
|
243
|
+
# Simply marking off sources, more than anything else
|
244
|
+
def expose; @exposed = true; end
|
245
|
+
def conceal; @exposed = false; end
|
246
|
+
def exposed?; @exposed; end
|
247
|
+
def concealed?; !@exposed; end
|
248
|
+
|
240
249
|
private
|
241
250
|
def prepare!
|
242
251
|
@prepare.each{|block| block.call} unless @prepare.empty?
|
@@ -247,6 +256,8 @@ module Smoke
|
|
247
256
|
end
|
248
257
|
|
249
258
|
def symbolize_keys!
|
259
|
+
# If its an array, we flatten it and symbolise the keys.
|
260
|
+
# Otherwise, we leave it as is.
|
250
261
|
@items = items.flatten.map{|i| i.symbolize_keys! } if items.respond_to? :flatten
|
251
262
|
end
|
252
263
|
|
@@ -260,6 +271,4 @@ module Smoke
|
|
260
271
|
Smoke.activate(@name, self)
|
261
272
|
end
|
262
273
|
end
|
263
|
-
end
|
264
|
-
|
265
|
-
Dir["#{File.dirname(__FILE__)}/source/*.rb"].each &method(:require)
|
274
|
+
end
|
data/lib/smoke/request.rb
CHANGED
@@ -9,10 +9,10 @@ module Smoke
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
SUPPORTED_TYPES = %w(json xml javascript)
|
12
|
+
SUPPORTED_TYPES = %w(json xml javascript excel)
|
13
13
|
@@request_options = {
|
14
14
|
:user_agent => Smoke.config[:user_agent],
|
15
|
-
:accept_encoding => "gzip"
|
15
|
+
:accept_encoding => "gzip, deflate"
|
16
16
|
}
|
17
17
|
|
18
18
|
attr_reader :uri, :content_type, :body
|
@@ -44,6 +44,10 @@ module Smoke
|
|
44
44
|
@body = ::Crack::JSON.parse(@body).symbolize_keys!
|
45
45
|
when :xml
|
46
46
|
@body = ::Crack::XML.parse(@body).symbolize_keys!
|
47
|
+
when :excel
|
48
|
+
# Convert the excel document into an XML document
|
49
|
+
doc = @body
|
50
|
+
::Crack::XML.parse().symbolize_keys!
|
47
51
|
when :unknown
|
48
52
|
Smoke.log.warn "Smoke Request: Format unknown for #{@uri} (#{@content_type})"
|
49
53
|
end
|
data/lib/smoke/source/data.rb
CHANGED
@@ -1,39 +1,37 @@
|
|
1
1
|
module Smoke
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
self.items = @request.body
|
36
|
-
end
|
2
|
+
# The "Data" source allows you to query
|
3
|
+
# datasources that are "complete" urls
|
4
|
+
# and rely on the automagic object parsing
|
5
|
+
# that smoke provides.
|
6
|
+
#
|
7
|
+
# For example, you may use this source
|
8
|
+
# to query a complete restful api call
|
9
|
+
# unpackage the xml response and get a
|
10
|
+
# clean ruby object.
|
11
|
+
#
|
12
|
+
# Data can take as many urls as you'd like
|
13
|
+
# to throw at it.
|
14
|
+
#
|
15
|
+
# Usage:
|
16
|
+
# Smoke.data(:ruby) do
|
17
|
+
# url "http://api.flickr.com/services/rest/?user_id=36821533%40N00&tags=benschwarz-site&nojsoncallback=1&method=flickr.photos.search&format=json&api_key=your_api_key_here
|
18
|
+
# path :photos, :photo
|
19
|
+
# end
|
20
|
+
class Data < Origin
|
21
|
+
attr_reader :request
|
22
|
+
|
23
|
+
# The URL that you'd like smoke to source its data from
|
24
|
+
# You can also set the type for silly servers that don't set a correct content-type (Flickr!)
|
25
|
+
# Example:
|
26
|
+
# url "http://site.com/resource.json", :type => :json
|
27
|
+
def url(source_url, options = {})
|
28
|
+
@url, @options = source_url, options
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
def dispatch
|
33
|
+
@request = Smoke::Request.new(@url, @options)
|
34
|
+
self.items = @request.body
|
37
35
|
end
|
38
36
|
end
|
39
37
|
end
|
data/lib/smoke/source/feed.rb
CHANGED
@@ -1,24 +1,22 @@
|
|
1
1
|
module Smoke
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
self.items = @requests.map{|r| ::SimpleRSS.parse(r.body).items }.flatten
|
21
|
-
end
|
2
|
+
# Feed can take multiple rss or atom feeds and munge them up together.
|
3
|
+
#
|
4
|
+
# Usage:
|
5
|
+
# Smoke.feed(:ruby) do
|
6
|
+
# url "domain.tld/rss"
|
7
|
+
# url "site.tld/atom"
|
8
|
+
# end
|
9
|
+
class Feed < Origin
|
10
|
+
attr_reader :requests
|
11
|
+
|
12
|
+
def url(feed_uri)
|
13
|
+
(@feeds ||= [] ) << feed_uri
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
def dispatch
|
18
|
+
@requests = @feeds.map{|f| Smoke::Request.new(f, {:raw_response => true}) }
|
19
|
+
self.items = @requests.map{|r| ::SimpleRSS.parse(r.body).items }.flatten
|
22
20
|
end
|
23
21
|
end
|
24
22
|
end
|
data/lib/smoke/source/join.rb
CHANGED
@@ -1,56 +1,54 @@
|
|
1
1
|
module Smoke
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
# The "Joiner" source is a special source
|
3
|
+
# that can be used to join multiple sources together
|
4
|
+
# and proxy call dispatch for each source
|
5
|
+
#
|
6
|
+
# Usage:
|
7
|
+
# Smoke.join(:delicious, :twitter, :flickr) do
|
8
|
+
# path :photos, :photo
|
9
|
+
# end
|
10
|
+
class Join < Origin # :nodoc:
|
11
|
+
def initialize(names, &block)
|
12
|
+
@names = names
|
13
|
+
super((names << "joined").join("_").to_sym, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Rename sources immediately after they've been joined together
|
7
17
|
# Usage:
|
8
18
|
# Smoke.join(:delicious, :twitter, :flickr) do
|
9
|
-
#
|
19
|
+
# name :web_stream
|
10
20
|
# end
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# Usage:
|
19
|
-
# Smoke.join(:delicious, :twitter, :flickr) do
|
20
|
-
# name :web_stream
|
21
|
-
# end
|
22
|
-
def name(rename = nil)
|
23
|
-
return @name if rename.nil?
|
24
|
-
Smoke.rename(@name => rename)
|
25
|
-
end
|
26
|
-
|
27
|
-
def method_missing(symbol, *args, &block)
|
28
|
-
ivar = "@#{symbol}"
|
21
|
+
def name(rename = nil)
|
22
|
+
return @name if rename.nil?
|
23
|
+
Smoke.rename(@name => rename)
|
24
|
+
end
|
25
|
+
|
26
|
+
def method_missing(symbol, *args, &block)
|
27
|
+
ivar = "@#{symbol}"
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
29
|
+
unless args.empty?
|
30
|
+
sources.each do |source|
|
31
|
+
source.last.instance_variable_set(ivar, args.last)
|
34
32
|
end
|
35
|
-
|
36
|
-
return self
|
37
33
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
34
|
+
|
35
|
+
return self
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
def sources
|
40
|
+
Smoke.active_sources.find_all{|k, v| @names.include?(k) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def dispatch
|
44
|
+
# Recall dispatch
|
45
|
+
sources.each do |source|
|
46
|
+
source.last.send(:prepare!)
|
47
|
+
source.last.send(:dispatch) if source.last.respond_to?(:dispatch)
|
42
48
|
end
|
43
49
|
|
44
|
-
|
45
|
-
|
46
|
-
sources.each do |source|
|
47
|
-
source.last.send(:prepare!)
|
48
|
-
source.last.send(:dispatch) if source.last.respond_to?(:dispatch)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Re-map items
|
52
|
-
@items = sources.map {|source| source.last.items }.flatten
|
53
|
-
end
|
50
|
+
# Re-map items
|
51
|
+
@items = sources.map {|source| source.last.items }.flatten
|
54
52
|
end
|
55
53
|
end
|
56
54
|
end
|
data/lib/smoke/source/yql.rb
CHANGED
@@ -1,85 +1,83 @@
|
|
1
1
|
module Smoke
|
2
|
-
|
3
|
-
|
2
|
+
# YQL will call to Yahoo YQL services
|
3
|
+
#
|
4
|
+
# Usage:
|
5
|
+
# Smoke.yql(:ruby) do
|
6
|
+
# select :all
|
7
|
+
# from "search.web"
|
8
|
+
# where :query, "ruby"
|
9
|
+
# end
|
10
|
+
class YQL < Origin
|
11
|
+
API_BASE = "http://query.yahooapis.com/v1/public/yql"
|
12
|
+
attr_reader :request
|
13
|
+
|
14
|
+
# Select indicates what YQL will be selecting
|
15
|
+
# Usage:
|
16
|
+
# select :all
|
17
|
+
# => "SELECT *"
|
18
|
+
# select :title
|
19
|
+
# => "SELECT title"
|
20
|
+
# select :title, :description
|
21
|
+
# => "SELECT title, description"
|
22
|
+
def select(what = :all)
|
23
|
+
@select = what.join(",") and return if what.is_a? Array
|
24
|
+
@select = "*" and return if what == :all
|
25
|
+
@select = what and return
|
26
|
+
end
|
27
|
+
|
28
|
+
# from corresponds to the from fragment of the YQL query
|
29
|
+
# Usage:
|
30
|
+
# from "search.web"
|
31
|
+
# or
|
32
|
+
# from :html
|
33
|
+
def from(source)
|
34
|
+
@from = source.join(',') and return if source.is_a? Array
|
35
|
+
@from = source.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
# where is a straight up match, no fancy matchers
|
39
|
+
# are currently supported
|
40
|
+
# Usage:
|
41
|
+
# where :xpath, "//div/div/a"
|
42
|
+
# or
|
43
|
+
# where :query, "python"
|
44
|
+
def where(column, value)
|
45
|
+
@where = @where || []
|
46
|
+
@where << "#{column.to_s} = '#{value}'"
|
47
|
+
end
|
48
|
+
|
49
|
+
# `use` can be used to set the url location of the data-table
|
50
|
+
# that you want YQL to search upon
|
4
51
|
#
|
5
52
|
# Usage:
|
6
|
-
#
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
# from corresponds to the from fragment of the YQL query
|
30
|
-
# Usage:
|
31
|
-
# from "search.web"
|
32
|
-
# or
|
33
|
-
# from :html
|
34
|
-
def from(source)
|
35
|
-
@from = source.join(',') and return if source.is_a? Array
|
36
|
-
@from = source.to_s
|
37
|
-
end
|
38
|
-
|
39
|
-
# where is a straight up match, no fancy matchers
|
40
|
-
# are currently supported
|
41
|
-
# Usage:
|
42
|
-
# where :xpath, "//div/div/a"
|
43
|
-
# or
|
44
|
-
# where :query, "python"
|
45
|
-
def where(column, value)
|
46
|
-
@where = @where || []
|
47
|
-
@where << "#{column.to_s} = '#{value}'"
|
48
|
-
end
|
49
|
-
|
50
|
-
# `use` can be used to set the url location of the data-table
|
51
|
-
# that you want YQL to search upon
|
52
|
-
#
|
53
|
-
# Usage:
|
54
|
-
# use "http://datatables.org/alltables.env"
|
55
|
-
def use(url)
|
56
|
-
params.merge!({:env => url})
|
57
|
-
end
|
58
|
-
|
59
|
-
protected
|
60
|
-
def params
|
61
|
-
@params || @params = {}
|
62
|
-
end
|
63
|
-
|
64
|
-
def dispatch
|
65
|
-
@request = Smoke::Request.new(build_uri)
|
66
|
-
self.items = @request.body
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
def build_uri
|
71
|
-
chunks = []
|
72
|
-
default_opts = {
|
73
|
-
:q => build_query,
|
74
|
-
:format => "json"
|
75
|
-
}.merge(params).each {|k,v| chunks << "#{k}=#{v}" }
|
76
|
-
|
77
|
-
return URI.encode(API_BASE + "?" + chunks.join("&"))
|
78
|
-
end
|
53
|
+
# use "http://datatables.org/alltables.env"
|
54
|
+
def use(url)
|
55
|
+
params.merge!({:env => url})
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
def params
|
60
|
+
@params || @params = {}
|
61
|
+
end
|
62
|
+
|
63
|
+
def dispatch
|
64
|
+
@request = Smoke::Request.new(build_uri)
|
65
|
+
self.items = @request.body
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
def build_uri
|
70
|
+
chunks = []
|
71
|
+
default_opts = {
|
72
|
+
:q => build_query,
|
73
|
+
:format => "json"
|
74
|
+
}.merge(params).each {|k,v| chunks << "#{k}=#{v}" }
|
79
75
|
|
80
|
-
|
81
|
-
|
82
|
-
|
76
|
+
return URI.encode(API_BASE + "?" + chunks.join("&"))
|
77
|
+
end
|
78
|
+
|
79
|
+
def build_query
|
80
|
+
"SELECT #{@select} FROM #{@from} WHERE #{@where.join(" AND ")}"
|
83
81
|
end
|
84
82
|
end
|
85
83
|
end
|
data/spec/smoke/cache_spec.rb
CHANGED
@@ -53,7 +53,7 @@ describe Smoke::Cache do
|
|
53
53
|
end
|
54
54
|
|
55
55
|
@url = "http://memory.tld/store"
|
56
|
-
FakeWeb.register_uri(@url, :
|
56
|
+
FakeWeb.register_uri(:get, @url, :body => File.join(SPEC_DIR, 'supports', 'slashdot.xml'))
|
57
57
|
|
58
58
|
require 'moneta/memory'
|
59
59
|
@store = Moneta::Memory.new
|
@@ -0,0 +1,15 @@
|
|
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
|
data/spec/smoke/origin_spec.rb
CHANGED
@@ -111,7 +111,7 @@ describe Smoke::Origin do
|
|
111
111
|
describe "call order" do
|
112
112
|
before :all do
|
113
113
|
@url = "http://domain.tld/benschwarz/feed"
|
114
|
-
FakeWeb.register_uri(@url, :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
114
|
+
FakeWeb.register_uri(:get, @url, :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
115
115
|
|
116
116
|
Smoke.data :feed_preperation_call_order do
|
117
117
|
prepare do
|
@@ -144,7 +144,7 @@ describe Smoke::Origin do
|
|
144
144
|
end
|
145
145
|
|
146
146
|
it "should chain the source when setting a property" do
|
147
|
-
Smoke.feed_preperation_call_order.abstract(:value).should be_an_instance_of(Smoke::
|
147
|
+
Smoke.feed_preperation_call_order.abstract(:value).should be_an_instance_of(Smoke::Data)
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
@@ -29,7 +29,7 @@ end
|
|
29
29
|
describe "Smoke XML output with real data" do
|
30
30
|
before :all do
|
31
31
|
@url = "http://domain.tld/feed.json"
|
32
|
-
FakeWeb.register_uri(@url, :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
32
|
+
FakeWeb.register_uri(:get, @url, :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
33
33
|
|
34
34
|
Smoke.data :real_xml_output do
|
35
35
|
url "http://domain.tld/feed.json", :type => :json
|
data/spec/smoke/request_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe Smoke::Request do
|
|
4
4
|
before do
|
5
5
|
@url = "http://fake.tld/canned/"
|
6
6
|
@web_search = File.join(SPEC_DIR, 'supports', 'flickr-photo.json')
|
7
|
-
FakeWeb.register_uri(@url, :response => @web_search)
|
7
|
+
FakeWeb.register_uri(:get, @url, :response => @web_search)
|
8
8
|
@request = Smoke::Request.new(@url)
|
9
9
|
end
|
10
10
|
|
@@ -26,7 +26,7 @@ describe Smoke::Request do
|
|
26
26
|
# Gzip response should come out exactly the same as the plain text response
|
27
27
|
@gzip_response = File.join(SPEC_DIR, 'supports', 'gzip_response.txt')
|
28
28
|
@url = "http://fake.tld/gzip"
|
29
|
-
FakeWeb.register_uri(@url, :response => @gzip_response, :content_encoding => "gzip")
|
29
|
+
FakeWeb.register_uri(:get, @url, :response => @gzip_response, :content_encoding => "gzip")
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should transparently handle a gzipped response" do
|
data/spec/smoke/shared_spec.rb
CHANGED
@@ -137,7 +137,7 @@ shared_examples_for "all sources" do
|
|
137
137
|
describe "call order" do
|
138
138
|
before :all do
|
139
139
|
@url = "http://domain.tld/benschwarz/feed"
|
140
|
-
FakeWeb.register_uri(@url, :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
140
|
+
FakeWeb.register_uri(:get, @url, :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
141
141
|
|
142
142
|
Smoke.data :feed_preperation_call_order do
|
143
143
|
prepare do
|
@@ -165,7 +165,7 @@ shared_examples_for "all sources" do
|
|
165
165
|
end
|
166
166
|
|
167
167
|
it "should chain the source when setting a property" do
|
168
|
-
@source.abstract(:value).should be_an_instance_of(Smoke::
|
168
|
+
@source.abstract(:value).should be_an_instance_of(Smoke::Data)
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), "..", "..", "spec_helper.rb")
|
|
2
2
|
|
3
3
|
describe "'Data' source" do
|
4
4
|
before :all do
|
5
|
-
FakeWeb.register_uri("http://photos.tld/index.json", :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
5
|
+
FakeWeb.register_uri(:get, "http://photos.tld/index.json", :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
6
6
|
|
7
7
|
@source = Smoke.data(:photos) do
|
8
8
|
url "http://photos.tld/index.json", :type => :json
|
@@ -14,7 +14,7 @@ describe "'Data' source" do
|
|
14
14
|
# it_should_behave_like "all sources"
|
15
15
|
|
16
16
|
it "should have been activated" do
|
17
|
-
Smoke[:photos].should(be_an_instance_of(Smoke::
|
17
|
+
Smoke[:photos].should(be_an_instance_of(Smoke::Data))
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should be a list of things" do
|
@@ -43,7 +43,7 @@ describe "'Data' source" do
|
|
43
43
|
|
44
44
|
describe "making a request to a web service without a correctly set content-type in return" do
|
45
45
|
before :each do
|
46
|
-
FakeWeb.register_uri("http://photos.tld/no-format", :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'), :content_type => "text/plain")
|
46
|
+
FakeWeb.register_uri(:get, "http://photos.tld/no-format", :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'), :content_type => "text/plain")
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should fail" do
|
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), "..", "..", "spec_helper.rb")
|
|
2
2
|
|
3
3
|
describe "Feed" do
|
4
4
|
before :all do
|
5
|
-
FakeWeb.register_uri("http://slashdot.org/index.rdf", :
|
5
|
+
FakeWeb.register_uri(:get, "http://slashdot.org/index.rdf", :body => File.join(SPEC_DIR, 'supports', 'slashdot.xml'))
|
6
6
|
|
7
7
|
@source = Smoke.feed(:slashdot) do
|
8
8
|
url "http://slashdot.org/index.rdf"
|
@@ -17,7 +17,7 @@ describe "Feed" do
|
|
17
17
|
# it_should_behave_like "all sources"
|
18
18
|
|
19
19
|
it "should have been activated" do
|
20
|
-
Smoke[:slashdot].should(be_an_instance_of(Smoke::
|
20
|
+
Smoke[:slashdot].should(be_an_instance_of(Smoke::Feed))
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should be a list of things" do
|
@@ -13,7 +13,7 @@ describe "Join" do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should be named in a_b_joined" do
|
16
|
-
Smoke[:a_b_joined].should be_an_instance_of(Smoke::
|
16
|
+
Smoke[:a_b_joined].should be_an_instance_of(Smoke::Join)
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should contain items from sources a and b" do
|
@@ -49,7 +49,7 @@ describe "Join" do
|
|
49
49
|
|
50
50
|
describe "dispatching" do
|
51
51
|
before :all do
|
52
|
-
FakeWeb.register_uri("http://photos.tld", :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
52
|
+
FakeWeb.register_uri(:get, "http://photos.tld", :response => File.join(SPEC_DIR, 'supports', 'flickr-photo.json'))
|
53
53
|
|
54
54
|
Smoke.data(:should_dispatch) do
|
55
55
|
url "http://photos.tld"
|
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), "..", "..", "spec_helper.rb")
|
|
2
2
|
|
3
3
|
describe "YQL" do
|
4
4
|
before :all do
|
5
|
-
FakeWeb.register_uri("http://query.yahooapis.com:80/v1/public/yql?q=SELECT%20*%20FROM%20search.web%20WHERE%20query%20=%20'ruby'&format=json", :response => File.join(SPEC_DIR, 'supports', 'search-web.json.yql'))
|
5
|
+
FakeWeb.register_uri(:get, "http://query.yahooapis.com:80/v1/public/yql?q=SELECT%20*%20FROM%20search.web%20WHERE%20query%20=%20'ruby'&format=json", :response => File.join(SPEC_DIR, 'supports', 'search-web.json.yql'))
|
6
6
|
|
7
7
|
@source = Smoke.yql(:search) do
|
8
8
|
select :all
|
@@ -19,7 +19,7 @@ describe "YQL" do
|
|
19
19
|
# it_should_behave_like "all sources"
|
20
20
|
|
21
21
|
it "should have been activated" do
|
22
|
-
Smoke[:search].should(be_an_instance_of(Smoke::
|
22
|
+
Smoke[:search].should(be_an_instance_of(Smoke::YQL))
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should be a list of things" do
|
@@ -28,7 +28,7 @@ describe "YQL" do
|
|
28
28
|
|
29
29
|
describe "select" do
|
30
30
|
before do
|
31
|
-
FakeWeb.register_uri("http://query.yahooapis.com:80/v1/public/yql?q=SELECT%20url%20FROM%20search.images%20WHERE%20query%20=%20'amc%20pacer'&format=json", :response => File.join(SPEC_DIR, 'supports', 'amc_pacer.json.yql'))
|
31
|
+
FakeWeb.register_uri(:get, "http://query.yahooapis.com:80/v1/public/yql?q=SELECT%20url%20FROM%20search.images%20WHERE%20query%20=%20'amc%20pacer'&format=json", :response => File.join(SPEC_DIR, 'supports', 'amc_pacer.json.yql'))
|
32
32
|
|
33
33
|
Smoke.yql(:pacer) do
|
34
34
|
select :url
|
@@ -81,7 +81,7 @@ describe "YQL" do
|
|
81
81
|
|
82
82
|
describe "yql definitions" do
|
83
83
|
before do
|
84
|
-
FakeWeb.register_uri("http://query.yahooapis.com:80/v1/public/yql?q=SELECT%20*%20FROM%20github.repo%20WHERE%20id%20=%20'benschwarz'%20AND%20repo%20=%20'smoke'&format=json&env=http://datatables.org/alltables.env", :response => File.join(SPEC_DIR, 'supports', 'datatables.yql'))
|
84
|
+
FakeWeb.register_uri(:get, "http://query.yahooapis.com:80/v1/public/yql?q=SELECT%20*%20FROM%20github.repo%20WHERE%20id%20=%20'benschwarz'%20AND%20repo%20=%20'smoke'&format=json&env=http://datatables.org/alltables.env", :response => File.join(SPEC_DIR, 'supports', 'datatables.yql'))
|
85
85
|
|
86
86
|
Smoke.yql(:smoke) do
|
87
87
|
use "http://datatables.org/alltables.env"
|
data/spec/smoke_spec.rb
CHANGED
@@ -11,6 +11,15 @@ describe Smoke do
|
|
11
11
|
Smoke[:a].should == @source_a
|
12
12
|
end
|
13
13
|
|
14
|
+
it "should be a hash" do
|
15
|
+
Smoke.active_sources.should be_an_instance_of(Hash)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have its name as the hash key" do
|
19
|
+
key = Smoke.active_sources.keys.first
|
20
|
+
Smoke.active_sources[key].name.should == key
|
21
|
+
end
|
22
|
+
|
14
23
|
describe "accessing via method call" do
|
15
24
|
it "should allow access to the sources via a method call" do
|
16
25
|
Smoke.a.should == @source_a
|
@@ -58,4 +67,38 @@ describe Smoke do
|
|
58
67
|
end
|
59
68
|
end
|
60
69
|
end
|
70
|
+
|
71
|
+
describe "exposed and concealed" do
|
72
|
+
before :all do
|
73
|
+
TestSource.source :exposed_by_default
|
74
|
+
|
75
|
+
TestSource.source :exposed do
|
76
|
+
expose
|
77
|
+
end
|
78
|
+
|
79
|
+
TestSource.source :concealed do
|
80
|
+
conceal
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "exposed_sources" do
|
85
|
+
it "should be a hash" do
|
86
|
+
Smoke.exposed_sources.should be_an_instance_of(Hash)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should be exposed sources only" do
|
90
|
+
Smoke.exposed_sources.values.should_not include(Smoke.concealed)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "concealed_sources" do
|
95
|
+
it "should be a hash" do
|
96
|
+
Smoke.concealed_sources.should be_an_instance_of(Hash)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should be concealed sources only" do
|
100
|
+
Smoke.concealed_sources.values.should_not include(Smoke.exposed)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
61
104
|
end
|
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smoke
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Schwarz
|
@@ -9,38 +9,38 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-10-29 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
type: :
|
16
|
+
name: fakeweb
|
17
|
+
type: :development
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
|
-
- - "
|
21
|
+
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
23
|
+
version: 1.2.5
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
26
|
+
name: simple-rss
|
27
27
|
type: :runtime
|
28
28
|
version_requirement:
|
29
29
|
version_requirements: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
33
|
+
version: "1.2"
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
36
|
+
name: json
|
37
37
|
type: :runtime
|
38
38
|
version_requirement:
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
|
-
- - "
|
41
|
+
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.
|
43
|
+
version: 1.1.3
|
44
44
|
version:
|
45
45
|
- !ruby/object:Gem::Dependency
|
46
46
|
name: crack
|
@@ -129,6 +129,7 @@ files:
|
|
129
129
|
- rdoc/rdoc-style.css
|
130
130
|
- spec/core_ext/hash_spec.rb
|
131
131
|
- spec/smoke/cache_spec.rb
|
132
|
+
- spec/smoke/input/xls_spec.rb
|
132
133
|
- spec/smoke/origin_spec.rb
|
133
134
|
- spec/smoke/output/xml_spec.rb
|
134
135
|
- spec/smoke/request_spec.rb
|
@@ -143,6 +144,7 @@ files:
|
|
143
144
|
- spec/supports/amc_pacer.json.yql
|
144
145
|
- spec/supports/datatables.yql
|
145
146
|
- spec/supports/flickr-photo.json
|
147
|
+
- spec/supports/gov_act_toliets.xls
|
146
148
|
- spec/supports/gzip_response.txt
|
147
149
|
- spec/supports/search-web.json.yql
|
148
150
|
- spec/supports/search-web.xml.yql
|
@@ -179,6 +181,7 @@ summary: smoke is a Ruby based DSL that allows you to query web services such as
|
|
179
181
|
test_files:
|
180
182
|
- spec/core_ext/hash_spec.rb
|
181
183
|
- spec/smoke/cache_spec.rb
|
184
|
+
- spec/smoke/input/xls_spec.rb
|
182
185
|
- spec/smoke/origin_spec.rb
|
183
186
|
- spec/smoke/output/xml_spec.rb
|
184
187
|
- spec/smoke/request_spec.rb
|