plaza 0.0.4 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b733efabb58c0d5ed5220b881edeb953fb1df5e6
4
- data.tar.gz: a2868546c5f666fbf160134481584049efd8a813
3
+ metadata.gz: 7b1ce8fd7612e0e70f87446757ae861a500800d4
4
+ data.tar.gz: 509e260bbdf978f2c5624a19c5419ae59e9c542d
5
5
  SHA512:
6
- metadata.gz: 1f02c45778f2763dce6d67fa1bd9122e957cb9de19f0bbd50b1c7b0fa969b2f2bb3c1c894933be6cf9e7e76b3bb80f035143cebd6d73d0842477bccabe17d7be
7
- data.tar.gz: 589532ff59a223dbfd0a32d29be2c8badfce4740b2f5e129c45aebfc52166ffbd570ca1c1e9247b3d7b14dbc09820b2d507fbb780e56e96bcb211924740194fc
6
+ metadata.gz: 4915af07edad5d501e7b4aac700907d109838ff991a44a7d366c2ad45250b8436f570369caf4f3efb5d0fdf9cbc2ab3fc3b6dc61b611906177d1f0eac77ff345
7
+ data.tar.gz: 69efd7d83468172a51310e3f0ee3220bcf259dfaba2c51d63105fdeb231e08c0104785e553e6093f48d0d3451f091504a3205f7beb6f4aab8699855b42d3f87f
data/README.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # Plaza
2
2
 
3
- TODO: Write a gem description
3
+ _Because rest areas are more fun with a service plaza_
4
+
5
+ Plaza is a client side gem that works with [RestArea][1] to provide an ActiveRecord like experience
6
+ in dealing with a JSON rest API. Plaza uses [Virtus][2] and [Faraday][3] under the hood to access a
7
+ json api, so most things that work with those projects will also work with Plaza.
4
8
 
5
9
  ## Installation
6
10
 
@@ -20,12 +24,143 @@ Or install it yourself as:
20
24
 
21
25
  ## Usage
22
26
 
23
- TODO: Write usage instructions here
27
+ ### Creating a Plaza Model
28
+
29
+ Rest API backed plaza models can be created like any other class, here's an example
30
+
31
+ ```ruby
32
+ require 'plaza'
33
+
34
+ class Thing
35
+ include Plaza::RestfulModel
36
+
37
+ attribute :name, String
38
+ attribute :amajig_id, Integer
39
+
40
+ has_many :amabobs, 'Amajing' # 1
41
+ end
42
+ ```
43
+
44
+ **Note 1**: Valid: plural symbols: `:amabobs`, classes: `MyModule::Amabob`, strings: `'MyModule::Amabob'`
45
+
46
+ See [Virtus][2] for more information on configuring attributes.
47
+
48
+ ### Configuring Plaza
49
+
50
+ At some point before you use a Plaza model, you need to configure Plaza, at the bare minimum you
51
+ need to tell plaza the base url to use for the rest_area api. You can optionally configure the
52
+ logger, cache store, and faraday middleware that plaza models will use.
53
+
54
+ ```ruby
55
+ Plaza.configure do
56
+ base_url 'http://www.example.com/rest' # Required
57
+ logger Logger.new(STDOUT) # Default
58
+ cache_store MemoryStore.new # Default, recommend `Rails.cache` for rails apps
59
+ use Faraday::SomeMiddleware # Add faraday middleware useing use
60
+ end
61
+ ```
62
+
63
+ #### Cache Store
64
+
65
+ The store where cached responses are stored, for rails apps we recommend that you just set this
66
+ to `Rails.cache`. Plaza uses [Faraday Http Cache][4] for caching, refer to their documentation for
67
+ more information on what the store can be.
68
+
69
+ #### Faraday Middleware
70
+
71
+ Becasue Plaza works on top of [Faraday][3], you can optionaly add additional middleware to Plaza using the
72
+ `use` keyword inside the `Plaza.configure` block
73
+
74
+ ```ruby
75
+ Plaza.configure do
76
+ base_url 'http://my_domain.com/rest'
77
+ use Foobar::SomeMiddleware, Goobar::MoreMiddleware
78
+ use Moobar::MoreMiddleware
79
+ end
80
+ ```
81
+
82
+ Middleware is applied in the same order that Faraday would apply it; the first middleware listed
83
+ wraps the second middleware which wraps the thrid middleware and so forth until the request is made.
84
+
85
+ #### Multiple Services
86
+
87
+ If your plaza models need to connect to multiple services with different base urls, they can be
88
+ configured as such:
89
+
90
+ ```ruby
91
+ Plaza.configure :my_first_service do
92
+ base_url 'http://www.first_example.com/rest'
93
+ end
94
+
95
+ Plaza.configure :my_second_service do
96
+ base_url 'http://www.later_example.com/rest'
97
+ end
98
+
99
+ class Amabob
100
+ include Plaza::RestfulModel
101
+ plaza_config :my_first_service # <-- This tells the model to use the :my_first_service configuration
102
+
103
+ attribute :thing_id, Integer
104
+ end
105
+ ```
106
+
107
+ ### Using Plaza Models
108
+
109
+ You can:
110
+
111
+ Create new models: `my_thing = Thing.new(:name => 'Fred')` (not persisted to api)
112
+
113
+ Create models: `my_thing = Thing.create(:name => 'Bob')`. This results in an POST api call like
114
+ `POST http://example.com/rest/things`
115
+
116
+ Find existing models: `my_thing = Thing.find(10)`. This results in a GET API call like `GET
117
+ http://example.com/things/10`
118
+
119
+ Pass query string to API: `Thing.were(:name = 'bob')`. This results in an api call like `GET
120
+ http://example.com/rest/things?name=bob`. Returns an array.
121
+
122
+ Update model attributes: `my_thing.name = 'Kevin'`
123
+
124
+ Save new or update existing models: `my_thing.save`. This results in either a PUT or POST to the api
125
+ depending on if `my_thing.id` is `nil` or not.
126
+
127
+ Delete Models: `my_thing.delete`
128
+
129
+ Get associated objects: `amabobs_array = my_thing.amabobs`. This requires that you define the
130
+ `has_many` relationship in the class definition. (See Thing definition above)
131
+
132
+ If you need make associations as part of a module, you will need to specify the `has_many` association as follows
133
+
134
+ module Foobar
135
+ class Thing
136
+ include Plaza::RestfulModel
137
+ has_many Foobar::Amajig # Perfered Method, but you may run into issues with load order
138
+ has_many 'Foobar::Amajig' # Alternative you can specify the class as a string.
139
+ end
140
+ end
141
+
142
+ Get related models for which you have the foreign key: `my_thing = a_mabob.thing`
143
+ Note on this: If you ask a rest model for a attribute and it doesn't have it, but it has the
144
+ same attribute with an underscore id, it's smart enough to know thats a foreign key and go off and
145
+ fetch the related rest model.
146
+
147
+ Want to know more, go checkout the code, the guts of it are located at
148
+ `lib/plaza/models/restful_model.rb`
24
149
 
25
150
  ## Contributing
26
151
 
27
152
  1. Fork it ( https://github.com/[my-github-username]/plaza/fork )
28
153
  2. Create your feature branch (`git checkout -b my-new-feature`)
154
+ 3. Add Specs!
29
155
  3. Commit your changes (`git commit -am 'Add some feature'`)
30
156
  4. Push to the branch (`git push origin my-new-feature`)
31
157
  5. Create a new Pull Request
158
+
159
+ ## STD (Stuff To Do) before 1.0.0
160
+
161
+ 4. Add Support for messages (see rest_area)
162
+
163
+ [1]:https://github.com/bguest/rest_area
164
+ [2]:https://github.com/solnic/virtus
165
+ [3]:https://github.com/lostisland/faraday
166
+ [4]:https://github.com/plataformatec/faraday-http-cache
data/lib/plaza.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'virtus'
2
- require "rack/cache"
3
2
 
4
3
  require 'plaza/configuration'
5
4
  require "plaza/version"
@@ -8,21 +7,10 @@ require 'plaza/request'
8
7
  require 'plaza/response'
9
8
  require 'plaza/adapters'
10
9
  require 'plaza/inflector'
11
- require 'restclient/components'
10
+ require 'plaza/connection'
12
11
 
13
12
  module Plaza
14
13
 
15
- class << self
16
- def enable_cache
17
- #this makes it so that we adhere to http cache headers when issuing
18
- #requests
19
- require 'rack/cache'
20
- RestClient.enable Rack::Cache,
21
- :metastore => self.configuration.meta_store,
22
- :entitystore => self.configuration.entity_store
23
- end
24
- end
25
-
26
14
  def self.configuration(component_name = :default)
27
15
  @configurations ||= {}
28
16
  @configurations[component_name] ||= Plaza::Configuration.new
@@ -32,6 +20,11 @@ module Plaza
32
20
  self.configuration(component_name).instance_eval(&block) if block_given?
33
21
  end
34
22
 
23
+ def self.connection(component_name = :default)
24
+ @connections ||= {}
25
+ @connections[component_name] ||= Plaza::Connection.for(component_name)
26
+ end
27
+
35
28
  def self.adapter(class_name)
36
29
  Plaza.const_get("#{class_name}Adapter").new
37
30
  end
@@ -3,31 +3,40 @@ require 'logger'
3
3
  module Plaza
4
4
  class Configuration
5
5
 
6
- #things that do have defaults only get writers
7
- attr_writer :use_cache, :cache_entity_store, :cache_meta_store
6
+ attr_accessor :middleware
7
+ attr_accessor :default_middleware
8
+
9
+ def initialize
10
+ @default_middleware = [
11
+ Plaza::Middleware::Exceptions,
12
+ Plaza::Middleware::UserId
13
+ ]
14
+ @middleware = []
15
+ end
16
+
17
+ def middleware
18
+ @middleware + default_middleware
19
+ end
8
20
 
9
21
  def base_url(url = nil)
10
22
  url ? @url = url : @url
11
23
  end
12
24
  alias_method :base_url=, :base_url
13
25
 
26
+ def cache_store(store = nil)
27
+ store ? @cache_store = store : @cache_store
28
+ end
29
+ alias_method :cache_store=, :cache_store
30
+
14
31
  def logger(logger = nil)
15
32
  @logger ||= Logger.new(STDOUT)
16
33
  logger ? @logger = logger : @logger
17
34
  end
18
35
  alias_method :logger=, :logger
19
36
 
20
- def use_cache?
21
- @use_cache ||= false
37
+ def use(*ware)
38
+ @middleware << ware
39
+ @middleware.flatten!
22
40
  end
23
-
24
- def cache_meta_store
25
- @cache_meta_store ||= 'file:/tmp/cache/meta'
26
- end
27
-
28
- def cache_entity_store
29
- @cache_meta_store ||= 'file:/tmp/cache/body'
30
- end
31
-
32
41
  end
33
42
  end
@@ -0,0 +1,22 @@
1
+ module Plaza
2
+ module Connection
3
+
4
+ def self.for(config_sym= :default)
5
+ config = Plaza.configuration(config_sym)
6
+ Faraday.new(config.base_url) do |conn|
7
+ conn.request :json
8
+ conn.response :json, :content_type => /\bjson$/
9
+
10
+ config.middleware.each do |middleware|
11
+ conn.use middleware
12
+ end
13
+ conn.use :http_cache, store: config.cache_store, logger: config.logger
14
+
15
+ conn.headers[:accept] = 'application/json'
16
+
17
+ conn.adapter Faraday.default_adapter
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -2,14 +2,36 @@ module Plaza
2
2
  module Inflector
3
3
  extend self
4
4
 
5
+ def classify(table_name)
6
+ singularize(table_name.split('_').map(&:capitalize).join)
7
+ end
8
+
9
+ def pluralize(str)
10
+ str.strip!
11
+ str.gsub!(/y$/,'ies')
12
+ str << 's' unless str[-1] == 's'
13
+ str
14
+ end
15
+
5
16
  def singularize(str)
6
17
  str.strip!
7
18
  str.gsub!(/ies$/,'y')
8
19
  str.chomp('s')
9
20
  end
10
21
 
11
- def classify(table_name)
12
- singularize(table_name.split('_').map(&:capitalize).join)
22
+ def tableize(str)
23
+ pluralize(underscore(str))
13
24
  end
25
+
26
+ def underscore(str)
27
+ return str unless str =~ /[A-Z-]|::/
28
+ word = str.to_s.gsub(/::/, '/')
29
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
30
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
31
+ word.tr!("-", "_")
32
+ word.downcase!
33
+ word
34
+ end
35
+
14
36
  end
15
37
  end
@@ -59,9 +59,8 @@ module Plaza
59
59
  #
60
60
  def has_many(*relations)
61
61
  relations.each do |r|
62
- define_method(r) do
63
- class_name = Plaza::Inflector.classify(r.to_s)
64
- Plaza.const_get(class_name).collection(adapter.has_many(self.id,r))
62
+ define_method(sym = has_many_symbol_for(r)) do
63
+ class_for(r).collection(adapter.has_many(self.id,sym))
65
64
  end
66
65
  end
67
66
  end
@@ -72,6 +71,22 @@ module Plaza
72
71
  end
73
72
 
74
73
  alias_method :plaza_config=, :plaza_config
74
+
75
+ private
76
+
77
+ def has_many_symbol_for(identifier)
78
+ if identifier.kind_of? Class
79
+ identifier.plural_name
80
+ elsif identifier.kind_of? String
81
+ Inflector.tableize(identifier.split('::').last)
82
+ elsif identifier.kind_of? Symbol
83
+ identifier
84
+ else
85
+ raise TypeError.new("Can't convert to has_many symbol")
86
+ end
87
+ end
88
+
89
+
75
90
  end
76
91
 
77
92
  def plaza_config
@@ -135,5 +150,19 @@ module Plaza
135
150
  end
136
151
  end
137
152
 
153
+ protected
154
+
155
+ def class_for(identifier)
156
+ if identifier.kind_of?(Symbol)
157
+ klass = Plaza.const_get(Plaza::Inflector.classify(identifier.to_s))
158
+ elsif identifier.kind_of?(String)
159
+ klass = Object.const_get(identifier)
160
+ elsif identifier.kind_of?(Class)
161
+ klass = identifier
162
+ else
163
+ raise TypeError.new("Can't convert to has_many relation")
164
+ end
165
+ end
166
+
138
167
  end
139
168
  end
data/lib/plaza/request.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'faraday'
2
+ require 'faraday/http_cache'
2
3
  require 'faraday_middleware'
3
4
  require_relative 'middleware/user_id'
4
5
  require_relative 'middleware/exceptions'
@@ -9,23 +10,10 @@ module Plaza
9
10
  attr_reader :logger
10
11
 
11
12
  def initialize(config_sym= :default)
12
- config = Plaza.configuration(config_sym)
13
- @connection = Faraday.new(config.base_url) do |conn|
14
- conn.request :json
15
- conn.response :json, :content_type => /\bjson$/
16
-
17
- conn.use Plaza::Middleware::Exceptions
18
- conn.use Plaza::Middleware::UserId
19
-
20
- conn.headers[:accept] = 'application/json'
21
- yield(conn) if block_given?
22
-
23
- conn.adapter Faraday.default_adapter
24
- end
25
- @logger = config.logger
13
+ @connection = Plaza.connection(config_sym)
14
+ @logger = Plaza.configuration(config_sym).logger
26
15
  end
27
16
 
28
-
29
17
  def get(*args)
30
18
  Response.new(connection.get *args)
31
19
  end
data/lib/plaza/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Plaza
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
data/plaza.gemspec CHANGED
@@ -23,10 +23,8 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency 'rspec', '~> 2.99'
24
24
  spec.add_development_dependency 'mocha', '~> 1.1'
25
25
 
26
- spec.add_runtime_dependency "rest-client", "~> 1.6"
27
- spec.add_runtime_dependency "rest-client-components"
28
26
  spec.add_runtime_dependency 'faraday', '~> 0.9.0'
29
27
  spec.add_runtime_dependency 'faraday_middleware', '~>0.9.1'
30
- spec.add_runtime_dependency "rack-cache", '~> 1.2'
28
+ spec.add_runtime_dependency 'faraday-http-cache', '~>0.4.2'
31
29
  spec.add_runtime_dependency "virtus", '~> 1.0'
32
30
  end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require_relative 'support/middleware'
3
+
4
+ describe Plaza::Configuration do
5
+
6
+ let(:config){Plaza::Configuration.new}
7
+
8
+ describe '#use' do
9
+ expected_stack= [
10
+ Example::HelloMiddleware,
11
+ Example::GoodbyeMiddleware,
12
+ Plaza::Middleware::Exceptions,
13
+ Plaza::Middleware::UserId
14
+ ]
15
+
16
+ it 'should add middleware to the faraday stack' do
17
+ config.use Example::HelloMiddleware
18
+ config.use Example::GoodbyeMiddleware
19
+ config.middleware.should == expected_stack
20
+ end
21
+
22
+ it 'should add middleware if added as a list' do
23
+ config.use Example::HelloMiddleware, Example::GoodbyeMiddleware
24
+ config.middleware.should == expected_stack
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require_relative 'support/middleware'
3
+
4
+ Plaza.configure :connection_spec do
5
+ logger NullLogger.new
6
+ use Example::HelloMiddleware
7
+ use Example::GoodbyeMiddleware
8
+ end
9
+
10
+ describe Plaza::Connection do
11
+
12
+ context 'with custom middeware' do
13
+ it 'should run middleware in correct order' do
14
+ stub_request(:get, "http://example.com/").
15
+ with(:headers => {
16
+ 'Accept'=>'application/json',
17
+ 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
18
+ 'Greetings'=>'HelloGoodbye',
19
+ 'User-Agent'=>'Faraday v0.9.0',
20
+ 'X-User-Id'=>''}
21
+ ).to_return(:status => 200, :body => "", :headers => {})
22
+ connection = Plaza::Connection.for(:connection_spec)
23
+ response = connection.get('http://example.com')
24
+ expect(response.headers).to eq( {'Greetings' => 'GoodbyeHello'} )
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -3,33 +3,63 @@ include Plaza
3
3
 
4
4
  describe Plaza::Inflector do
5
5
 
6
+ describe '#classify' do
7
+ it 'should classify strings with and s at the end' do
8
+ expect(Inflector.classify('foobars ')).to eq 'Foobar'
9
+ end
10
+
11
+ it 'should classify strings that end in ies' do
12
+ expect(Inflector.classify('entries')).to eq('Entry')
13
+ end
14
+
15
+ it 'should work with underscores' do
16
+ expect(Inflector.classify('targeting_entries')).to eq('TargetingEntry')
17
+ expect(Inflector.classify('events_collections')).to eq('EventsCollection')
18
+ end
19
+ end
20
+
21
+ describe '#pluralize' do
22
+ it 'should add s to end of thing' do
23
+ expect(Inflector.pluralize('thing')).to eq('things')
24
+ end
25
+
26
+ it 'should change y to ies' do
27
+ expect(Inflector.pluralize('entry')).to eq('entries')
28
+ end
29
+
30
+ it 'should not add another s' do
31
+ expect(Inflector.pluralize('things')).to eq('things')
32
+ end
33
+ end
34
+
6
35
  describe '#singularize' do
7
36
  it 'should return singularized random word with s at the end' do
8
- Inflector.singularize('foobars').should == 'foobar'
9
- Inflector.singularize('intentss').should == 'intents'
37
+ expect(Inflector.singularize('foobars')).to eq 'foobar'
38
+ expect(Inflector.singularize('intentss')).to eq 'intents'
10
39
  end
11
40
 
12
41
  it 'should change ies to y' do
13
- Inflector.singularize('entries').should == 'entry'
42
+ expect(Inflector.singularize('entries')).to eq 'entry'
14
43
  end
15
44
 
16
45
  it 'should not change ies in middle of word' do
17
- Inflector.singularize('fiesties ').should == 'fiesty'
46
+ expect(Inflector.singularize('fiesties ')).to eq 'fiesty'
18
47
  end
19
48
  end
20
49
 
21
- describe '#classify' do
22
- it 'should classify strings with and s at the end' do
23
- Inflector.classify('foobars ').should == 'Foobar'
24
- end
25
-
26
- it 'should classify strings that end in ies' do
27
- Inflector.classify('entries').should == 'Entry'
50
+ describe '#tableize' do
51
+ it 'convert rails examples' do
52
+ expect(Inflector.tableize('RawScaledScorer')).to eq 'raw_scaled_scorers'
53
+ expect(Inflector.tableize('egg_and_ham')).to eq 'egg_and_hams'
54
+ expect(Inflector.tableize('fancyCategory')).to eq 'fancy_categories'
28
55
  end
56
+ end
29
57
 
30
- it 'should work with underscores' do
31
- Inflector.classify('targeting_entries').should == 'TargetingEntry'
32
- Inflector.classify('events_collections').should == 'EventsCollection'
58
+ describe '#underscore' do
59
+ it 'convert rails examples' do
60
+ expect( Inflector.underscore('ActiveModel') ).to eq 'active_model'
61
+ expect( Inflector.underscore('ActiveModel::Errors')).to eq 'active_model/errors'
33
62
  end
34
63
  end
64
+
35
65
  end
@@ -8,23 +8,31 @@ class Thing
8
8
  attribute :amajig_id, Integer
9
9
  end
10
10
 
11
- class Amajig
12
- include Plaza::RestfulModel
13
-
14
- has_many :things, :amabobs
15
- attribute :name
16
- end
17
-
18
- Plaza.configure :amabob do
11
+ Plaza.configure :foobar do
19
12
  base_url 'http://www.example.com/rest'
20
13
  logger NullLogger.new # Specs should STFU
21
14
  end
22
15
 
23
- class Amabob
16
+ module Foobar
17
+ class Amabob
18
+ include Plaza::RestfulModel
19
+ plaza_config :foobar
20
+
21
+ has_many 'Foobar::Amajing'
22
+ attribute :amajig_id, Integer
23
+ end
24
+
25
+ class Amajing
26
+ include Plaza::RestfulModel
27
+ plaza_config :foobar
28
+ end
29
+ end
30
+
31
+ class Amajig
24
32
  include Plaza::RestfulModel
25
- plaza_config :amabob
26
33
 
27
- attribute :amajig_id, Integer
34
+ has_many :things, Foobar::Amabob
35
+ attribute :name
28
36
  end
29
37
 
30
38
  describe Thing do
@@ -63,6 +71,15 @@ describe Thing do
63
71
  }
64
72
  }
65
73
 
74
+ let(:amabob_hash){
75
+ {
76
+ 'amabob' => {
77
+ 'id' => 3,
78
+ 'amajig_id' => 2
79
+ }
80
+ }
81
+ }
82
+
66
83
  let(:amabobs_hash){
67
84
  {
68
85
  'amabobs' =>[
@@ -78,6 +95,21 @@ describe Thing do
78
95
  }
79
96
  }
80
97
 
98
+ let(:amajings_hash){
99
+ {
100
+ 'amajings'=>[
101
+ {
102
+ 'id'=> 5,
103
+ 'amabob_id'=> 4
104
+ },
105
+ {
106
+ 'id'=> 6,
107
+ 'amabob_id'=> 4
108
+ }
109
+ ]
110
+ }
111
+ }
112
+
81
113
  describe 'attributes' do
82
114
  it{ should respond_to :errors }
83
115
 
@@ -151,6 +183,17 @@ describe Thing do
151
183
  expect{Thing.find(1)}.to raise_error(Plaza::ConnectionError)
152
184
  end
153
185
  end
186
+
187
+ context 'with caching' do
188
+ it 'second request should be cached and not hit server' do
189
+ stub_request(:get, 'http://www.example.com/rest/amabobs/3.json').to_return(
190
+ headers: {'Cache-Control' => 'max-age=200'},
191
+ body:amabob_hash.to_json
192
+ ).times(1).then.to_raise('Cache Not Working')
193
+ Foobar::Amabob.find(3)
194
+ expect{ Foobar::Amabob.find(3) }.not_to raise_error
195
+ end
196
+ end
154
197
  end
155
198
 
156
199
  describe '.where()' do
@@ -219,7 +262,13 @@ describe Thing do
219
262
  it 'gets second has_many relationships' do
220
263
  amajig = Amajig.new(amajig_hash['amajig'])
221
264
  stub_request(:get, 'http://example.com/rest/amajigs/2/amabobs.json').to_return(body:amabobs_hash.to_json)
222
- expect(amajig.amabobs.first.class).to be Amabob
265
+ expect(amajig.amabobs.first.class).to be Foobar::Amabob
266
+ end
267
+
268
+ it 'gets string has_many relationships' do
269
+ amabob = Foobar::Amabob.new(id:4)
270
+ stub_request(:get, 'http://www.example.com/rest/amabobs/4/amajings.json').to_return(body:amajings_hash.to_json)
271
+ expect(amabob.amajings.first.class).to be Foobar::Amajing
223
272
  end
224
273
  end
225
274
 
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Plaza do
4
+ describe '#configure' do
5
+
6
+ end
7
+ end
@@ -6,6 +6,7 @@ describe Request do
6
6
  context 'when Thread.current[:x_user_id] is set' do
7
7
 
8
8
  before do Thread.current[:x_user_id] = 4242 end
9
+ after do Thread.current[:x_user_id] = nil end
9
10
 
10
11
  %i(get post put delete).each do |method|
11
12
  it "##{method} should add X-User-Id to headers" do
@@ -38,20 +39,14 @@ describe Request do
38
39
  end
39
40
 
40
41
  context "when trucker service is down" do
41
- let(:request){
42
- exception = Faraday::Adapter::Test::Stubs.new do |stub|
43
- %i(get put post delete).each do |method|
44
- stub.send(method, '/failblog') {raise Faraday::Error::ConnectionFailed.new('Connection Failed')}
45
- end
46
- end
47
- request = Request.new do |conn|
48
- conn.adapter :test, exception
49
- end
50
- request
51
- }
52
42
  %i(get put post delete).each do |method|
53
43
  describe "#{method}" do
54
- let(:response){request.send(method, '/failblog')}
44
+ before do
45
+ stub_request(method, "http://example.com/failblog").
46
+ to_raise(Faraday::Error::ConnectionFailed.new('Connection Failed'))
47
+ end
48
+
49
+ let(:response){Request.new.send(method, '/failblog')}
55
50
 
56
51
  it 'response code should be 503' do
57
52
  expect{response}.to raise_error(Plaza::ConnectionError)
@@ -0,0 +1,24 @@
1
+ module Example
2
+ class HelloMiddleware < Faraday::Middleware
3
+ def call(request_env)
4
+ request_env.request_headers['Greetings'] ||= ""
5
+ request_env.request_headers['Greetings'] << 'Hello'
6
+ @app.call(request_env).on_complete do |response_env|
7
+ response_env.response_headers['Greetings'] ||= ""
8
+ response_env.response_headers['Greetings'] << 'Hello'
9
+ end
10
+ end
11
+ end
12
+
13
+ class GoodbyeMiddleware < Faraday::Middleware
14
+ def call(request_env)
15
+ request_env.request_headers['Greetings'] ||= ""
16
+ request_env.request_headers['Greetings'] << 'Goodbye'
17
+ @app.call(request_env).on_complete do |response_env|
18
+ response_env.response_headers['Greetings'] ||= ""
19
+ response_env.response_headers['Greetings'] << 'Goodbye'
20
+ end
21
+ end
22
+ end
23
+ end
24
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plaza
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - VMC Engineering
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-09 00:00:00.000000000 Z
11
+ date: 2015-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,34 +66,6 @@ dependencies:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.1'
69
- - !ruby/object:Gem::Dependency
70
- name: rest-client
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- version: '1.6'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ~>
81
- - !ruby/object:Gem::Version
82
- version: '1.6'
83
- - !ruby/object:Gem::Dependency
84
- name: rest-client-components
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - '>='
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - '>='
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
69
  - !ruby/object:Gem::Dependency
98
70
  name: faraday
99
71
  requirement: !ruby/object:Gem::Requirement
@@ -123,19 +95,19 @@ dependencies:
123
95
  - !ruby/object:Gem::Version
124
96
  version: 0.9.1
125
97
  - !ruby/object:Gem::Dependency
126
- name: rack-cache
98
+ name: faraday-http-cache
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - ~>
130
102
  - !ruby/object:Gem::Version
131
- version: '1.2'
103
+ version: 0.4.2
132
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: '1.2'
110
+ version: 0.4.2
139
111
  - !ruby/object:Gem::Dependency
140
112
  name: virtus
141
113
  requirement: !ruby/object:Gem::Requirement
@@ -168,6 +140,7 @@ files:
168
140
  - lib/plaza/adapters/base_adapter.rb
169
141
  - lib/plaza/adapters/restful_adapter.rb
170
142
  - lib/plaza/configuration.rb
143
+ - lib/plaza/connection.rb
171
144
  - lib/plaza/inflector.rb
172
145
  - lib/plaza/middleware/exceptions.rb
173
146
  - lib/plaza/middleware/user_id.rb
@@ -180,9 +153,13 @@ files:
180
153
  - lib/plaza/version.rb
181
154
  - plaza.gemspec
182
155
  - spec/plaza/adapters/restful_adapter_spec.rb
156
+ - spec/plaza/configuration_spec.rb
157
+ - spec/plaza/connection_spec.rb
183
158
  - spec/plaza/inflector_spec.rb
184
159
  - spec/plaza/models/restful_model_spec.rb
160
+ - spec/plaza/plaza_spec.rb
185
161
  - spec/plaza/request_spec.rb
162
+ - spec/plaza/support/middleware.rb
186
163
  - spec/spec_helper.rb
187
164
  homepage: ''
188
165
  licenses:
@@ -210,7 +187,11 @@ specification_version: 4
210
187
  summary: Client for rest_area gem
211
188
  test_files:
212
189
  - spec/plaza/adapters/restful_adapter_spec.rb
190
+ - spec/plaza/configuration_spec.rb
191
+ - spec/plaza/connection_spec.rb
213
192
  - spec/plaza/inflector_spec.rb
214
193
  - spec/plaza/models/restful_model_spec.rb
194
+ - spec/plaza/plaza_spec.rb
215
195
  - spec/plaza/request_spec.rb
196
+ - spec/plaza/support/middleware.rb
216
197
  - spec/spec_helper.rb