facile 0.0.1 → 0.1.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.
data/README.md CHANGED
@@ -23,20 +23,19 @@ Or install it yourself as:
23
23
 
24
24
  ## Usage
25
25
 
26
- TODO: Write usage instructions here
27
-
28
26
  An example script, to fetch the weather data from the BBC.
29
27
  ```ruby
30
28
  require 'facile'
31
29
 
32
- class Foo < Facile::Api
33
- self.url = 'http://open.live.bbc.co.uk/weather/feeds/en/{id}/3dayforecast.json'
30
+ class Foo
31
+ include ::Facile::Api
32
+ url 'http://open.live.bbc.co.uk/weather/feeds/en/{id}/3dayforecast.json'
34
33
  end
35
34
 
36
35
  foo = Foo.find('2643743')
37
36
 
38
37
  # gets forecast date for the first day.
39
- foo.forecastContent.forecasts.first.date
38
+ foo.forecast_content.forecasts.first.date
40
39
  ```
41
40
 
42
41
  ## Contributing
data/lib/facile/api.rb CHANGED
@@ -1,55 +1,14 @@
1
1
  require 'addressable/template'
2
- require 'active_support/core_ext/class/attribute_accessors'
2
+ require 'forwardable'
3
3
 
4
- class Facile::Api
5
- cattr_accessor :url, :headers, :body, :params, :options
4
+ require 'facile/api/http_methods'
5
+ require 'facile/api/request_methods'
6
+ require 'facile/api/forward_methods'
6
7
 
7
- def self.find(*args)
8
- id, options = args[0] || nil, args[1] || {}
9
- new().find(id, options)
10
- end
11
-
12
- def initialize(response = {})
13
- @response = response if !response.empty?
14
- end
15
-
16
- def method_missing(method, *args, &block)
17
- raise NoMethodError, "'#{method}' doesn't exist" if response.nil?
18
-
19
- response.send(method)
20
- end
21
-
22
- def find(id, options = {})
23
- url = generate_url(id, self.class.url)
24
- req_options = request_options(url)
25
-
26
- self.class.new(create_request(req_options).body)
27
- end
28
-
29
- protected
30
- attr_reader :response
31
-
32
- def create_request(req_options = {})
33
- req = Facile::Request.new(req_options)
34
-
35
- req.go
36
- end
37
-
38
- def generate_url(id, url)
39
- template = Addressable::Template.new(url)
40
- expanded = template.partial_expand(:id => id)
41
-
42
- expanded.pattern
43
- end
44
-
45
- def request_options(url)
46
- {
47
- :url => url,
48
- :method => :get,
49
- :headers => self.class.headers || {},
50
- :options => self.class.options || {},
51
- :body => self.class.body,
52
- :params => self.class.params
53
- }
8
+ module Facile::Api
9
+ def self.included(base)
10
+ base.extend(::Facile::Api::HttpMethods)
11
+ base.extend(::Facile::Api::RequestMethods)
12
+ base.extend(::Facile::Api::ForwardMethods)
54
13
  end
55
14
  end
@@ -0,0 +1,29 @@
1
+ require 'forwardable'
2
+
3
+ module Facile::Api
4
+ module ForwardMethods
5
+ include Forwardable
6
+
7
+ def self.extended(base)
8
+ base.instance_variable_set(:@response, nil)
9
+ base.instance_eval { attr_accessor :response }
10
+ end
11
+
12
+ def create_instance(body = nil)
13
+ class_instance = new
14
+ class_instance.response = body
15
+
16
+ create_delegators(class_instance)
17
+ class_instance
18
+ end
19
+
20
+ def create_delegators(class_instance)
21
+ if class_instance.response && class_instance.response.respond_to?(:keys)
22
+ class_instance.response.keys.each do |key|
23
+ class_instance.class.def_delegator :@response, key.to_sym
24
+ class_instance.class.def_delegator :@response, "#{key}=".to_sym
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,44 @@
1
+ module Facile::Api
2
+ module HttpMethods
3
+ def self.extended(base)
4
+ base.instance_variable_set(:@defaults, {})
5
+ end
6
+
7
+ def url(url = nil)
8
+ return defaults[:url] if url.nil?
9
+
10
+ defaults[:url] = url
11
+ end
12
+
13
+ def body(body = nil)
14
+ return defaults[:body] if body.nil?
15
+
16
+ defaults[:body] = body
17
+ end
18
+
19
+ def headers(headers = nil)
20
+ return defaults[:headers] if headers.nil?
21
+
22
+ defaults[:headers] = headers
23
+ end
24
+
25
+ def params(params = nil)
26
+ return defaults[:params] if params.nil?
27
+
28
+ defaults[:params] = params
29
+ end
30
+
31
+ def options(options = nil)
32
+ return defaults[:options] if options.nil?
33
+
34
+ defaults[:options] = options
35
+ end
36
+
37
+
38
+ protected
39
+
40
+ def defaults
41
+ @defaults
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,42 @@
1
+ require 'forwardable'
2
+
3
+ module Facile::Api
4
+ module RequestMethods
5
+ include Forwardable
6
+
7
+ def find(*args)
8
+ id, options = args[0] || nil, args[1] || {}
9
+
10
+ url = generate_url(id, self.url)
11
+ req_options = request_options(url)
12
+
13
+ body = create_request(req_options).body
14
+
15
+ create_instance(body)
16
+ end
17
+
18
+ def create_request(req_options = {})
19
+ req = Facile::Request.new(req_options)
20
+
21
+ req.go
22
+ end
23
+
24
+ def generate_url(id, url)
25
+ template = Addressable::Template.new(url)
26
+ expanded = template.partial_expand(:id => id)
27
+
28
+ expanded.pattern
29
+ end
30
+
31
+ def request_options(url)
32
+ {
33
+ :url => url,
34
+ :method => :get,
35
+ :headers => self.headers || {},
36
+ :options => self.options || {},
37
+ :body => self.body,
38
+ :params => self.params || {}
39
+ }
40
+ end
41
+ end
42
+ end
@@ -1,3 +1,3 @@
1
1
  module Facile
2
- VERSION = '0.0.1'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -1,38 +1,135 @@
1
1
  require 'spec_helper'
2
+ require 'hashie'
2
3
  require 'faraday'
3
4
 
4
- describe 'test api' do
5
- it 'can create an api instance' do
6
- api = ::Facile::Api.new
5
+ describe Facile::Api::HttpMethods do
6
+ before do
7
+ class TestClass
8
+ include ::Facile::Api
9
+ url 'http://bbc.co.uk'
10
+ end
11
+ end
12
+
13
+ context 'able to set values' do
14
+ it 'http methods work' do
15
+ # there's no real need to test this any further
16
+ expect(TestClass.url).to eq('http://bbc.co.uk')
17
+ end
18
+ end
19
+
20
+ context 'does not share state' do
21
+ it 'other classes using the same method have different values' do
22
+ class Zomg
23
+ include ::Facile::Api
24
+ end
25
+
26
+ expect(TestClass.url).to eq('http://bbc.co.uk')
27
+ expect(Zomg.url).to eq(nil)
28
+ end
29
+ end
30
+ end
7
31
 
8
- expect(api).to be_kind_of(::Facile::Api)
32
+ describe Facile::Api::RequestMethods do
33
+ before do
34
+ class TestClass
35
+ include ::Facile::Api
36
+
37
+ url 'http://bbc.co.uk'
38
+ end
9
39
  end
10
40
 
11
- it 'can find items' do
12
- ::Facile::Request.any_instance.stub(:go => ::Facile::Response.new(
13
- :status => 200,
14
- :headers => {'content-type' => 'application/json'},
15
- :raw_body => '{"foo": "bar"}'
16
- ))
41
+ context 'request options' do
42
+ it 'can be generated' do
43
+ expected = {
44
+ :url => 'http://bbc.co.uk',
45
+ :method => :get,
46
+ :headers => {},
47
+ :params => {},
48
+ :body => nil,
49
+ :options => {}
50
+ }
51
+
52
+ expect(TestClass.request_options(TestClass.url)).to eq(expected)
53
+ end
54
+ end
17
55
 
56
+ context 'generate url' do
57
+ it 'can insert placeholder' do
58
+ class OtherTestClass
59
+ include ::Facile::Api
18
60
 
19
- api = ::Facile::Api.new
20
- api.class.url = 'http://foo.com'
61
+ url 'http://bbc.co.uk/{id}'
62
+ end
21
63
 
22
- returned_api = api.find('2643743')
64
+ generated_url = OtherTestClass.generate_url(1, OtherTestClass.url)
23
65
 
24
- expect(returned_api.foo).to eq('bar')
66
+ expect(generated_url).to eq('http://bbc.co.uk/1')
67
+ end
25
68
  end
26
69
 
27
- it 'can use class method' do
28
- ::Facile::Request.any_instance.stub(:go => ::Facile::Response.new(
29
- :status => 200,
30
- :headers => {'content-type' => 'application/json'},
31
- :raw_body => '{"foo": "bar"}'
32
- ))
70
+ context 'request things' do
71
+ it 'can request things' do
72
+ faraday_response = Faraday::Response.new({
73
+ :method => :get,
74
+ :response_headers => {'content-type' => 'text/plain'},
75
+ :body => 'foo',
76
+ :url => 'http://bbc.com'
77
+ })
78
+
79
+ Faraday::Connection.any_instance.stub(:get => faraday_response)
80
+
81
+ inst = TestClass.find()
82
+
83
+ expect(inst).to be_kind_of(TestClass)
84
+ expect(inst.response).to eq('foo')
85
+ end
86
+ end
87
+ end
88
+
89
+ describe Facile::Api::ForwardMethods do
90
+ before do
91
+ class TestClass
92
+ include ::Facile::Api
93
+ end
94
+ end
95
+
96
+ context 'can create instance' do
97
+ it 'create instance of test class' do
98
+ inst = TestClass.create_instance
99
+
100
+ expect(inst).to be_kind_of(TestClass)
101
+ end
102
+
103
+ it 'can create instance with string data' do
104
+ inst = TestClass.create_instance('test')
105
+
106
+ expect(inst.response).to eq('test')
107
+ end
108
+
109
+ it 'can create instance with hash' do
110
+ hash = Hashie::Mash.new({:foo => 'bar'})
111
+ inst = TestClass.create_instance(hash)
112
+
113
+ expect(inst.response).to eq(hash)
114
+ end
115
+ end
116
+
117
+ context 'can delegate methods' do
118
+ it 'can read from a method' do
119
+ hash = Hashie::Mash.new({:foo => 'bar'})
120
+ inst = TestClass.create_instance(hash)
121
+
122
+ expect(inst.foo).to eq('bar')
123
+ end
124
+
125
+ it 'can write from a method' do
126
+ hash = Hashie::Mash.new({:foo => 'bar'})
127
+ inst = TestClass.create_instance(hash)
33
128
 
34
- ::Facile::Api.url = 'http://foo.com'
129
+ expect(inst.foo).to eq('bar')
35
130
 
36
- ::Facile::Api.find(123)
131
+ inst.foo = 'zomg'
132
+ expect(inst.foo).to eq('zomg')
133
+ end
37
134
  end
38
135
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: facile
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-27 00:00:00.000000000 Z
12
+ date: 2013-12-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -190,6 +190,9 @@ files:
190
190
  - facile.gemspec
191
191
  - lib/facile.rb
192
192
  - lib/facile/api.rb
193
+ - lib/facile/api/forward_methods.rb
194
+ - lib/facile/api/http_methods.rb
195
+ - lib/facile/api/request_methods.rb
193
196
  - lib/facile/request.rb
194
197
  - lib/facile/response.rb
195
198
  - lib/facile/response/wrapper.rb