acfs 0.20.0 → 0.21.0.b185

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4e5e93e4dee6f02a8b6a830f83a710bd98a7134
4
- data.tar.gz: 9833f7ea561dfe761689915f61daf25a33e25ca1
3
+ metadata.gz: 24c2d64318701de68d4bebf2c0454ae17222f41e
4
+ data.tar.gz: 7b058dbf9ce187553aa1a41420b3792b96f4b8f3
5
5
  SHA512:
6
- metadata.gz: 20fae6a5edfd9e81f9f893846951d907226f6c77866cb20938c926dbad8f3b21842c051314cfb91268cdee3e98875e836456436a024be9505148562deabe79c1
7
- data.tar.gz: 7eb8bf6e3bd84961a550201d77f2f6e2fe85779108045a4fe991b4537d50cdabedf916e35361b80027022f2e43d141e8e116201ebd859d23b780fc004e48cc76
6
+ metadata.gz: d2b103a60ada7149b1f58c79ffaad1f2419116040742217933819840b940b7f17ffa7a03294835b87ad346a33509c996b33872efd845b59fece94ce72bf265e8
7
+ data.tar.gz: 425866d67a2dd571cfd1e5dcb9519616720bf7059ec58004dd4ab61f06f94cf508385448dd9f1674937701e95ffb40ec05f4763803eae403ae5170f1611c39d8
@@ -1,15 +1,22 @@
1
1
  language: ruby
2
2
  bundler_args: --without development
3
3
  rvm:
4
- - 2.0.0
5
- - 1.9.3
6
- - jruby
7
- - rbx-19mode
8
-
4
+ - 2.0.0
5
+ - 1.9.3
6
+ - jruby
7
+ - rbx-19mode
9
8
  gemfile:
10
- - gemfiles/Gemfile.rails-3-1
11
- - gemfiles/Gemfile.rails-3-2
12
- - gemfiles/Gemfile.rails-4-0
13
-
9
+ - gemfiles/Gemfile.rails-4-0
10
+ - gemfiles/Gemfile.rails-3-2
11
+ - gemfiles/Gemfile.rails-3-1
14
12
  services:
15
- - rabbitmq
13
+ - rabbitmq
14
+ deploy:
15
+ provider: rubygems
16
+ api_key:
17
+ secure: gNudZK0JaRRweudmkpdkJjUMydItTSW5cXjpYdYCfahqd/cD0xPjxotr2TCHrJibfVauoT/PytbQWcP3jnOYytp6oS0up5Y+uKpGmbqVYx/rZvShWALszcBs71lUh/IZpDXNHc+yo/01HCn10/uQUFRtrjWgMwHtHxXb09xE4wQ=
18
+ gem: acfs
19
+ on:
20
+ branch: master
21
+ repo: jgraichen/acfs
22
+ rvm: 2.0.0
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.21.0
4
+
5
+ * Add update_attributes
6
+ * Add validation check to `save` method
7
+ * Inherit attributes to subclasses
8
+
3
9
  ## 0.20.0
4
10
 
5
11
  * Remove messaging
data/README.md CHANGED
@@ -15,7 +15,7 @@ Acfs covers model and service abstraction, convenient query and filter methods,
15
15
 
16
16
  Add this line to your application's Gemfile:
17
17
 
18
- gem 'acfs', '~> 0.16.0'
18
+ gem 'acfs', '~> 0.21.0'
19
19
 
20
20
  **Note:** Acfs is under development. I'll try to avoid changes to the public API but internal APIs may change quite often.
21
21
 
@@ -212,10 +212,6 @@ Removed in 0.20.0. See [jgraichen/msgr](https://github.com/jgraichen/msgr) for a
212
212
  * Rails responders providing REST operations with integrated ETag,
213
213
  Modified Headers, conflict detection, ...
214
214
  * Pagination? Filtering? (If service API provides such features.)
215
- * Messaging Queue support for services and models
216
- * Allow triggering messages on resource events (CRUD)
217
- * Abstract messages into objects
218
- * Middleware stack for messages?
219
215
  * Documentation
220
216
 
221
217
  ## Contributing
@@ -26,4 +26,6 @@ Gem::Specification.new do |spec|
26
26
  spec.add_runtime_dependency 'rack'
27
27
 
28
28
  spec.add_development_dependency 'bundler', '~> 1.3'
29
+
30
+ spec.version = "#{spec.version}.b#{ENV['TRAVIS_BUILD_NUMBER']}" if ENV['TRAVIS_BUILD_NUMBER']
29
31
  end
@@ -4,35 +4,30 @@ require 'active_support/core_ext/class'
4
4
  require 'active_support/core_ext/string'
5
5
  require 'active_support/core_ext/module'
6
6
 
7
- require 'acfs/version'
8
- require 'acfs/errors'
9
- require 'acfs/global'
10
-
11
7
  module Acfs
12
8
  extend ActiveSupport::Autoload
9
+ require 'acfs/version'
10
+ require 'acfs/errors'
11
+ require 'acfs/global'
12
+
13
+ require 'acfs/collection'
14
+ require 'acfs/configuration'
15
+ require 'acfs/model'
16
+ require 'acfs/operation'
17
+ require 'acfs/request'
18
+ require 'acfs/resource'
19
+ require 'acfs/response'
20
+ require 'acfs/runner'
21
+ require 'acfs/service'
22
+
13
23
  extend Global
14
24
 
15
- autoload :Collection
16
- autoload :Model
17
- autoload :Request
18
- autoload :Response
19
- autoload :Service
20
25
  autoload :Stub
21
- autoload :Operation
22
- autoload :Runner
23
- autoload :Configuration
24
-
25
- module Messaging
26
- extend ActiveSupport::Autoload
27
-
28
- autoload :Client
29
- autoload :Receiver
30
- end
31
26
 
32
27
  module Middleware
33
28
  extend ActiveSupport::Autoload
29
+ require 'acfs/middleware/base'
34
30
 
35
- autoload :Base
36
31
  autoload :Print
37
32
  autoload :Logger
38
33
  autoload :JsonDecoder
@@ -42,10 +37,8 @@ module Acfs
42
37
  end
43
38
 
44
39
  module Adapter
45
- extend ActiveSupport::Autoload
46
-
47
- autoload :Base
48
- autoload :Typhoeus
40
+ require 'acfs/adapter/base'
41
+ require 'acfs/adapter/typhoeus'
49
42
  end
50
43
  end
51
44
 
@@ -3,46 +3,52 @@ module Acfs
3
3
  # Acfs base error.
4
4
  #
5
5
  class Error < StandardError
6
+ def initialize(opts = {}, message = nil)
7
+ opts.merge! message: message if message
8
+ super opts[:message]
9
+ end
6
10
  end
7
11
 
8
12
  # Response error containing the responsible response object.
9
13
  #
10
14
  class ErroneousResponse < Error
11
- attr_accessor :response
15
+ attr_reader :response
12
16
 
13
- def initialize(data = {})
14
- self.response = data[:response]
15
- message = ''
16
- message << "Received erroneous response: #{response.code}"
17
- if response.data
18
- message << "\n with content:\n "
19
- message << response.data.map{|k,v| "#{k.inspect}: #{v.inspect}"}.join("\n ")
20
- end
21
- if response.headers.any?
22
- message << "\n with headers:\n "
23
- message << response.headers.map{|k,v| "#{k}: #{v}"}.join("\n ")
24
- end
25
- message << "\nbased on request: #{response.request.method.upcase} #{response.request.url} #{response.request.format}"
26
- if response.request.data
27
- message << "\n with content:\n "
28
- message << response.request.data.map{|k,v| "#{k.inspect}: #{v.inspect}"}.join("\n ")
17
+ def initialize(opts = {})
18
+ @response = opts[:response]
19
+ message = 'Received erroneous response'
20
+ if response
21
+ message << ": #{response.code}"
22
+ if response.data
23
+ message << "\n with content:\n "
24
+ message << response.data.map{|k,v| "#{k.inspect}: #{v.inspect}"}.join("\n ")
25
+ end
26
+ if response.headers.any?
27
+ message << "\n with headers:\n "
28
+ message << response.headers.map{|k,v| "#{k}: #{v}"}.join("\n ")
29
+ end
30
+ message << "\nbased on request: #{response.request.method.upcase} #{response.request.url} #{response.request.format}"
31
+ if response.request.data
32
+ message << "\n with content:\n "
33
+ message << response.request.data.map{|k,v| "#{k.inspect}: #{v.inspect}"}.join("\n ")
34
+ end
35
+ if response.request.headers.any?
36
+ message << "\n with headers:\n "
37
+ message << response.request.headers.map{|k,v| "#{k}: #{v}"}.join("\n ")
38
+ end
29
39
  end
30
- if response.request.headers.any?
31
- message << "\n with headers:\n "
32
- message << response.request.headers.map{|k,v| "#{k}: #{v}"}.join("\n ")
33
- end
34
- super message
40
+ super opts, message
35
41
  end
36
42
  end
37
43
 
38
44
  class AmbiguousStubError < Error
39
45
  attr_reader :stubs, :operation
40
46
 
41
- def initialize(stubs, operation)
42
- @stubs = stubs
43
- @operation = operation
47
+ def initialize(opts = {})
48
+ @stubs = opts.delete :stubs
49
+ @operation = opts.delete :operation
44
50
 
45
- super 'Ambiguous stubs.'
51
+ super opts, 'Ambiguous stubs.'
46
52
  end
47
53
 
48
54
  end
@@ -53,10 +59,27 @@ module Acfs
53
59
  end
54
60
 
55
61
  class InvalidResource < ErroneousResponse
56
- attr_accessor :errors
62
+ attr_reader :errors, :resource
63
+
64
+ def initialize(opts = {})
65
+ @errors = opts.delete :errors
66
+ @resource = opts.delete :resource
67
+ super
68
+ end
69
+ end
70
+
71
+ # A ResourceNotLoaded error will be thrown when calling some
72
+ # modifing methods on not loaded resources as it is usally
73
+ # unwanted to call e.g. `update_attributes` on a not loaded
74
+ # resource.
75
+ # Correct solution is to first run `Acfs.run` to fetch the
76
+ # resource and then update the resource.
77
+ #
78
+ class ResourceNotLoaded < Error
79
+ attr_reader :resource
57
80
 
58
- def initialize(data)
59
- self.errors = data[:errors]
81
+ def initialize(opts = {})
82
+ @resource = opts.delete :resource
60
83
  super
61
84
  end
62
85
  end
@@ -1,44 +1,43 @@
1
1
  require 'active_model'
2
2
 
3
- require 'acfs/model/attributes'
4
- require 'acfs/model/dirty'
5
- require 'acfs/model/loadable'
6
- require 'acfs/model/locatable'
7
- require 'acfs/model/persistence'
8
- require 'acfs/model/operational'
9
- require 'acfs/model/query_methods'
10
- require 'acfs/model/relations'
11
- require 'acfs/model/service'
3
+ # @api public
4
+ #
5
+ module Acfs::Model
6
+ require 'acfs/model/attributes'
7
+ require 'acfs/model/dirty'
8
+ require 'acfs/model/loadable'
9
+ require 'acfs/model/locatable'
10
+ require 'acfs/model/operational'
11
+ require 'acfs/model/persistence'
12
+ require 'acfs/model/query_methods'
13
+ require 'acfs/model/relations'
14
+ require 'acfs/model/service'
15
+ require 'acfs/model/validation'
12
16
 
13
- module Acfs
17
+ extend ActiveSupport::Concern
14
18
 
15
- # @api public
16
- #
17
- module Model
18
- extend ActiveSupport::Concern
19
+ included do
20
+ if ActiveModel::VERSION::MAJOR >= 4
21
+ include ActiveModel::Model
22
+ else
23
+ extend ActiveModel::Naming
24
+ extend ActiveModel::Translation
25
+ include ActiveModel::Conversion
26
+ include ActiveModel::Validations
19
27
 
20
- included do
21
- if ActiveModel::VERSION::MAJOR >= 4
22
- include ActiveModel::Model
23
- else
24
- extend ActiveModel::Naming
25
- extend ActiveModel::Translation
26
- include ActiveModel::Conversion
27
- include ActiveModel::Validations
28
-
29
- require 'acfs/model/initialization'
30
- include Model::Initialization
31
- end
32
-
33
- include Model::Attributes
34
- include Model::Loadable
35
- include Model::Persistence
36
- include Model::Locatable
37
- include Model::Operational
38
- include Model::QueryMethods
39
- include Model::Relations
40
- include Model::Service
41
- include Model::Dirty
28
+ require 'acfs/model/initialization'
29
+ include Initialization
42
30
  end
31
+
32
+ include Attributes
33
+ include Loadable
34
+ include Persistence
35
+ include Locatable
36
+ include Operational
37
+ include QueryMethods
38
+ include Relations
39
+ include Service
40
+ include Dirty
41
+ include Validation
43
42
  end
44
43
  end
@@ -187,7 +187,7 @@ module Acfs::Model
187
187
  # @return [ Hash{ String => Object, Proc } ] Attributes with default values.
188
188
  #
189
189
  def attributes
190
- @attributes ||= {}
190
+ @attributes ||= {}.merge superclass.respond_to?(:attributes) ? superclass.attributes : {}
191
191
  end
192
192
 
193
193
  # @api public
@@ -205,7 +205,7 @@ module Acfs::Model
205
205
  # @return [ Hash{ Symbol => Class } ] Attributes and their types.
206
206
  #
207
207
  def attribute_types
208
- @attribute_types ||= {}
208
+ @attribute_types ||= {}.merge superclass.respond_to?(:attribute_types) ? superclass.attribute_types : {}
209
209
  end
210
210
 
211
211
  private
@@ -26,7 +26,7 @@ module Acfs
26
26
  # user2.save
27
27
  # user2.persisted? # => true
28
28
  #
29
- # @return [TrueClass, FalseClass] True if resource has no changes and is not newly created, false otherwise.
29
+ # @return [Boolean] True if resource has no changes and is not newly created, false otherwise.
30
30
  #
31
31
  def persisted?
32
32
  !new? && !changed?
@@ -36,7 +36,7 @@ module Acfs
36
36
  #
37
37
  # Return true if model is a new record and was not saved yet.
38
38
  #
39
- # @return [TrueClass, FalseClass] True if resource is newly created, false otherwise.
39
+ # @return [Boolean] True if resource is newly created, false otherwise.
40
40
  #
41
41
  def new?
42
42
  read_attribute(:id).nil?
@@ -52,7 +52,7 @@ module Acfs
52
52
  #
53
53
  # Saving a resource is a synchronous operation.
54
54
  #
55
- # @return [TrueClass, FalseClass] True if save operation was successful, false otherwise.
55
+ # @return [Boolean] True if save operation was successful, false otherwise.
56
56
  # @see #save! See #save! for available options.
57
57
  #
58
58
  def save(*args)
@@ -79,8 +79,6 @@ module Acfs
79
79
  # @see #save
80
80
  #
81
81
  def save!(opts = {})
82
- #raise ::Acfs::InvalidResource errors: errors.to_a unless valid?
83
-
84
82
  opts[:data] = attributes unless opts[:data]
85
83
 
86
84
  operation (new? ? :create : :update), opts do |data|
@@ -88,13 +86,60 @@ module Acfs
88
86
  end
89
87
  end
90
88
 
89
+ # @api public
90
+ #
91
+ # Update attributes with given data and save resource.
92
+ #
93
+ # Saving a resource is a synchronous operation.
94
+ #
95
+ # @param [Hash] attrs Hash with attributes to write.
96
+ # @param [Hash] opts Options passed to `save`.
97
+ #
98
+ # @return [Boolean] True if save operation was successful, false otherwise.
99
+ #
100
+ # @see #save
101
+ # @see #attributes=
102
+ # @see #update_attributes!
103
+ #
104
+ def update_attributes(attrs, opts = {})
105
+ check_loaded! opts
106
+
107
+ self.attributes = attrs
108
+ save opts
109
+ end
110
+
111
+ # @api public
112
+ #
113
+ # Update attributes with given data and save resource.
114
+ #
115
+ # Saving a resource is a synchronous operation.
116
+ #
117
+ # @param [Hash] attrs Hash with attributes to write.
118
+ # @param [Hash] opts Options passed to `save!`.
119
+ #
120
+ # @raise [Acfs::InvalidResource]
121
+ # If remote services respond with 422 response. Will fill errors with data from response
122
+ # @raise [Acfs::ErroneousResponse]
123
+ # If remote service respond with not successful response.
124
+ #
125
+ # @see #save!
126
+ # @see #attributes=
127
+ # @see #update_attributes
128
+ #
129
+ def update_attributes!(attrs, opts = {})
130
+ check_loaded! opts
131
+
132
+ self.attributes = attrs
133
+ save! opts
134
+ end
135
+
91
136
  # @api public
92
137
  #
93
138
  # Destroy resource by sending a DELETE request.
94
139
  #
95
140
  # Deleting a resource is a synchronous operation.
96
141
  #
97
- # @return [TrueClass, FalseClass]
142
+ # @return [Boolean]
98
143
  # @see #delete!
99
144
  #
100
145
  def delete(opts = {})
@@ -186,6 +231,10 @@ module Acfs
186
231
  self.attributes = data
187
232
  loaded!
188
233
  end
234
+
235
+ def check_loaded!(opts = {})
236
+ raise ResourceNotLoaded, resource: self unless loaded? or opts[:force]
237
+ end
189
238
  end
190
239
  end
191
240
  end
@@ -0,0 +1,13 @@
1
+ module Acfs::Model
2
+
3
+ #
4
+ #
5
+ module Validation
6
+
7
+ def save!(*_)
8
+ raise ::Acfs::InvalidResource.new resource: self, errors: errors.to_a unless valid? :save
9
+
10
+ super
11
+ end
12
+ end
13
+ end
@@ -98,7 +98,7 @@ module Acfs
98
98
 
99
99
  accepted_stubs = stubs.select { |stub| stub.accept? op }
100
100
 
101
- raise AmbiguousStubError.new accepted_stubs, op if accepted_stubs.size > 1
101
+ raise AmbiguousStubError.new stubs: accepted_stubs, operation: op if accepted_stubs.size > 1
102
102
 
103
103
  accepted_stubs.first
104
104
  end
@@ -1,7 +1,7 @@
1
1
  module Acfs
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 20
4
+ MINOR = 21
5
5
  PATCH = 0
6
6
  STAGE = nil
7
7
 
@@ -109,7 +109,7 @@ describe Acfs::Model::Attributes do
109
109
 
110
110
  it 'should cast values' do
111
111
  o = model.new
112
- o.age = "28"
112
+ o.age = '28'
113
113
 
114
114
  expect(o.age).to be == 28
115
115
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Acfs::Model::Persistence do
4
4
  let(:model_class) { MyUser }
5
5
  before do
6
- @get_stub = stub_request(:get, 'http://users.example.org/users/1').to_return response({ id: 1, name: "Anon", age: 12 })
6
+ @get_stub = stub_request(:get, 'http://users.example.org/users/1').to_return response({ id: 1, name: 'Anon', age: 12 })
7
7
 
8
8
  @patch_stub = stub_request(:put, 'http://users.example.org/users/1')
9
9
  .with(body: '{"id":1,"name":"Idefix","age":12}')
@@ -71,6 +71,20 @@ describe Acfs::Model::Persistence do
71
71
  end
72
72
  end
73
73
 
74
+ context 'unloaded model' do
75
+ let!(:model) { model_class.find 1 }
76
+
77
+ describe '#update_attributes' do
78
+ subject { -> { model.update_attributes name: 'John' } }
79
+ it { expect{ subject.call }.to raise_error Acfs::ResourceNotLoaded }
80
+ end
81
+
82
+ describe '#update_attributes!' do
83
+ subject { -> { model.update_attributes! name: 'John' } }
84
+ it { expect{ subject.call }.to raise_error Acfs::ResourceNotLoaded }
85
+ end
86
+ end
87
+
74
88
  context 'loaded model' do
75
89
  context 'without changes' do
76
90
  let(:model) { model_class.find 1 }
@@ -102,6 +116,46 @@ describe Acfs::Model::Persistence do
102
116
  expect(model).to be_frozen
103
117
  end
104
118
  end
119
+
120
+ describe '#update_atributes!' do
121
+ let(:model) { model_class.find 1 }
122
+ before { model; Acfs.run }
123
+
124
+ it 'should set attributes' do
125
+ model.update_attributes name: 'Idefix'
126
+ expect(model.attributes.symbolize_keys).to eq id: 1, name: 'Idefix', age: 12
127
+ end
128
+
129
+ it 'should save resource' do
130
+ expect(model).to receive(:save).with({})
131
+ model.update_attributes name: 'Idefix'
132
+ end
133
+
134
+ it 'should pass second hash to save' do
135
+ expect(model).to receive(:save).with({ bla: 'blub' })
136
+ model.update_attributes({ name: 'Idefix' }, { bla: 'blub' })
137
+ end
138
+ end
139
+
140
+ describe '#update_atributes' do
141
+ let(:model) { model_class.find 1 }
142
+ before { model; Acfs.run }
143
+
144
+ it 'should set attributes' do
145
+ model.update_attributes! name: 'Idefix'
146
+ expect(model.attributes.symbolize_keys).to eq id: 1, name: 'Idefix', age: 12
147
+ end
148
+
149
+ it 'should save resource' do
150
+ expect(model).to receive(:save!).with({})
151
+ model.update_attributes! name: 'Idefix'
152
+ end
153
+
154
+ it 'should pass second hash to save' do
155
+ expect(model).to receive(:save!).with({ bla: 'blub' })
156
+ model.update_attributes!({ name: 'Idefix' }, { bla: 'blub' })
157
+ end
158
+ end
105
159
  end
106
160
 
107
161
  describe '.create!' do
@@ -125,7 +179,7 @@ describe Acfs::Model::Persistence do
125
179
 
126
180
  it 'should raise an error' do
127
181
  expect { model_class.create! data }.to raise_error ::Acfs::InvalidResource do |error|
128
- expect(error.errors).to be == { name: ['required'] }.stringify_keys
182
+ expect(error.errors).to be == { name: %w(required) }.stringify_keys
129
183
  end
130
184
  end
131
185
  end
@@ -157,7 +211,7 @@ describe Acfs::Model::Persistence do
157
211
 
158
212
  it 'should contain error hash' do
159
213
  model = model_class.create data
160
- expect(model.errors.to_hash).to be == { name: [ "required" ]}.stringify_keys
214
+ expect(model.errors.to_hash).to be == { name: %w(required) }.stringify_keys
161
215
  end
162
216
  end
163
217
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Acfs::Model::Validation do
4
+ let(:params) { {} }
5
+ let(:model) { MyUserWithValidations.new params }
6
+
7
+ describe '#valid?' do
8
+ context 'with valid attributes' do
9
+ let(:params) { {name: 'john smith', age: 24} }
10
+ subject { model }
11
+
12
+ it { should be_valid }
13
+ end
14
+
15
+ context 'with invalid attributes' do
16
+ let(:params) { {name: 'invname'} }
17
+ subject { model }
18
+
19
+ it { should_not be_valid }
20
+ end
21
+ end
22
+
23
+ describe '#errors' do
24
+ context 'with valid attributes' do
25
+ let(:params) { {name: 'john smith', age: 24} }
26
+ before { model.valid? }
27
+ subject { model.errors }
28
+
29
+ it { should be_empty }
30
+ end
31
+
32
+ context 'with invalid attributes' do
33
+ let(:params) { {name: 'john'} }
34
+ before { model.valid? }
35
+ subject { model.errors }
36
+
37
+ it { should_not be_empty }
38
+ it { should have(2).items }
39
+
40
+ it 'should contain a list of error messages' do
41
+ expect(subject.to_hash).to eq age: ["can't be blank"], name: ['is invalid']
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '#save!' do
47
+ context 'with invalid attributes' do
48
+ let(:params) { {name: 'john'} }
49
+ subject { -> { model.save! } }
50
+
51
+ it { expect { subject.call }.to raise_error Acfs::InvalidResource }
52
+ end
53
+ end
54
+ end
@@ -21,7 +21,7 @@ RSpec.configure do |config|
21
21
  # order dependency and want to debug it, you can fix the order by providing
22
22
  # the seed, which is printed after each run.
23
23
  # --seed 1234
24
- config.order = "random"
24
+ config.order = 'random'
25
25
 
26
26
  config.expect_with :rspec do |c|
27
27
  # Only allow expect syntax
@@ -16,8 +16,7 @@ class CommentService < Acfs::Service
16
16
  use Acfs::Middleware::JsonDecoder
17
17
  end
18
18
 
19
- class MyUser
20
- include Acfs::Model
19
+ class MyUser < Acfs::Resource
21
20
  service UserService, path: 'users'
22
21
 
23
22
  attribute :id, :integer
@@ -25,16 +24,23 @@ class MyUser
25
24
  attribute :age, :integer
26
25
  end
27
26
 
28
- class Session
29
- include Acfs::Model
27
+ class MyUserInherited < MyUser
28
+
29
+ end
30
+
31
+ class MyUserWithValidations < MyUser
32
+ validates_presence_of :name, :age
33
+ validates_format_of :name, with: /\A\w+\s+\w+.?\z/
34
+ end
35
+
36
+ class Session < Acfs::Resource
30
37
  service UserService
31
38
 
32
39
  attribute :id, :string
33
40
  attribute :user, :integer
34
41
  end
35
42
 
36
- class Comment
37
- include Acfs::Model
43
+ class Comment < Acfs::Resource
38
44
  service CommentService
39
45
 
40
46
  attribute :id, :integer
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.0
4
+ version: 0.21.0.b185
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Graichen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-23 00:00:00.000000000 Z
11
+ date: 2013-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -160,6 +160,7 @@ files:
160
160
  - lib/acfs/model/query_methods.rb
161
161
  - lib/acfs/model/relations.rb
162
162
  - lib/acfs/model/service.rb
163
+ - lib/acfs/model/validation.rb
163
164
  - lib/acfs/operation.rb
164
165
  - lib/acfs/request.rb
165
166
  - lib/acfs/request/callbacks.rb
@@ -187,6 +188,7 @@ files:
187
188
  - spec/acfs/model/locatable_spec.rb
188
189
  - spec/acfs/model/persistance_spec.rb
189
190
  - spec/acfs/model/query_methods_spec.rb
191
+ - spec/acfs/model/validation_spec.rb
190
192
  - spec/acfs/request/callbacks_spec.rb
191
193
  - spec/acfs/request_spec.rb
192
194
  - spec/acfs/response/formats_spec.rb
@@ -214,9 +216,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
214
216
  version: '0'
215
217
  required_rubygems_version: !ruby/object:Gem::Requirement
216
218
  requirements:
217
- - - '>='
219
+ - - '>'
218
220
  - !ruby/object:Gem::Version
219
- version: '0'
221
+ version: 1.3.1
220
222
  requirements: []
221
223
  rubyforge_project:
222
224
  rubygems_version: 2.0.3
@@ -237,6 +239,7 @@ test_files:
237
239
  - spec/acfs/model/locatable_spec.rb
238
240
  - spec/acfs/model/persistance_spec.rb
239
241
  - spec/acfs/model/query_methods_spec.rb
242
+ - spec/acfs/model/validation_spec.rb
240
243
  - spec/acfs/request/callbacks_spec.rb
241
244
  - spec/acfs/request_spec.rb
242
245
  - spec/acfs/response/formats_spec.rb
@@ -249,4 +252,3 @@ test_files:
249
252
  - spec/spec_helper.rb
250
253
  - spec/support/response.rb
251
254
  - spec/support/service.rb
252
- has_rdoc: