acfs 0.18.0 → 0.19.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: dfb99fe53f15f18d5bb38f6d14aab35df106395b
4
- data.tar.gz: 822c5e1fd59b02589aa946252d57302d5afd0ca5
3
+ metadata.gz: 8a9569aa6a00b3a3008156d94d8c3dc615ba3409
4
+ data.tar.gz: d8ef1f72e0e3a4017f700d5d2337b5c0e0ad9a1e
5
5
  SHA512:
6
- metadata.gz: 114ea5f3dc9cf97f99ee2b920810f8ea7dabe2264ea2e17d64cdfe9e26ea729339b4de31e32ce9deeb460d6c3be57c865199f32101644a5c2dba4d854eb7e9b9
7
- data.tar.gz: c32d14d4f25013beebb3aa60fe6edcaeb6de071597b0f41cc276cae51e5bd4b363b875f3f0ccd919172a9b84a24bbae14e4b4e423be2c28476cef25e4942fe3f
6
+ metadata.gz: 03e1f3a9bb3f5fbc709ef673609f9c2a23e8628fde802bb222599fbc9512c2f2097b74339901b8dc1b2541417a4ca9ab12320bade59d6ca3e1189017a6da6827
7
+ data.tar.gz: 68f1811f3a68294feb3493766866d811a31760a3638a3e41661935a5b4165e0c7d2b87ab5998f40a7ca6525f50bc93f02d8ce09cca7705b66b3873ecd22fe694
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.19.0
4
+
5
+ * Add support for DateTime and Float attribute types
6
+ * Add experimental list attribute type
7
+ * Allow block usage in stub `with` option
8
+ * Allow to test if operation stubs were called and how often
9
+ * Fix bug on operation stubs
10
+
3
11
  ## 0.18.0
4
12
 
5
13
  * Basic DELETE operations
data/README.md CHANGED
@@ -148,9 +148,10 @@ You can stub resources in applications using an Acfs service client:
148
148
  Acfs::Stub.enable
149
149
 
150
150
  before do
151
- Acfs::Stub.resource MyUser, :read, with: { id: 1 }, return: { id: 1, name: 'John Smith', age: 32 }
151
+ @stub = Acfs::Stub.resource MyUser, :read, with: { id: 1 }, return: { id: 1, name: 'John Smith', age: 32 }
152
152
  Acfs::Stub.resource MyUser, :read, with: { id: 2 }, raise: :not_found
153
153
  Acfs::Stub.resource Session, :create, with: { ident: 'john@exmaple.org', password: 's3cr3t' }, return: { id: 'longhash', user: 1 }
154
+ Acfs::Stub.resource MyUser, :update, with: lambda { |op| op.data.include? :my_var }, raise: 400
154
155
  end
155
156
 
156
157
  it 'should find user number one' do
@@ -160,6 +161,9 @@ it 'should find user number one' do
160
161
  expect(user.id).to be == 1
161
162
  expect(user.name).to be == 'John Smith'
162
163
  expect(user.age).to be == 32
164
+
165
+ expect(@stub).to has_called
166
+ expect(@stub).to_not have_called 5.times
163
167
  end
164
168
 
165
169
  it 'should not find user number two' do
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_runtime_dependency 'actionpack', '>= 3.1'
24
24
  spec.add_runtime_dependency 'multi_json'
25
25
  spec.add_runtime_dependency 'typhoeus'
26
- spec.add_runtime_dependency 'bunny', '~> 0.9.0.pre12'
26
+ spec.add_runtime_dependency 'bunny', '~> 0.9.0'
27
27
  spec.add_runtime_dependency 'rack'
28
28
 
29
29
  spec.add_development_dependency 'bundler', '~> 1.3'
@@ -8,6 +8,8 @@ require 'acfs/version'
8
8
  require 'acfs/errors'
9
9
  require 'acfs/global'
10
10
 
11
+ require 'acfs/messaging'
12
+
11
13
  module Acfs
12
14
  extend ActiveSupport::Autoload
13
15
  extend Global
@@ -12,9 +12,41 @@ module Acfs
12
12
 
13
13
  def initialize(data = {})
14
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 ")
29
+ 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
15
35
  end
16
36
  end
17
37
 
38
+ class AmbiguousStubError < Error
39
+ attr_reader :stubs, :operation
40
+
41
+ def initialize(stubs, operation)
42
+ @stubs = stubs
43
+ @operation = operation
44
+
45
+ super 'Ambiguous stubs.'
46
+ end
47
+
48
+ end
49
+
18
50
  # Resource not found error raised on a 404 response
19
51
  #
20
52
  class ResourceNotFound < ErroneousResponse
@@ -0,0 +1,24 @@
1
+ require 'acfs/messaging/client'
2
+
3
+ module Acfs
4
+
5
+ # @macro experimental
6
+ #
7
+ module Messaging
8
+
9
+ class << self
10
+
11
+ # @macro experimental
12
+ #
13
+ # Quick publish a message using default client instance.
14
+ #
15
+ # @param [#to_s] routing_key Routing key.
16
+ # @param [#to_msgpack, Hash] payload Message payload.
17
+ # @return [undefined]
18
+ #
19
+ def publish(routing_key, payload)
20
+ Client.instance.publish routing_key, payload
21
+ end
22
+ end
23
+ end
24
+ end
@@ -17,11 +17,11 @@ module Acfs::Messaging
17
17
  end
18
18
 
19
19
  def exchange
20
- @exchange ||= @channel.topic 'acfs-0.17.0-2', auto_delete: true
20
+ @exchange ||= channel.topic 'acfs-0.17.0-2', auto_delete: true
21
21
  end
22
22
 
23
23
  def publish(routing_key, message)
24
- exchange.publish MessagePack.pack(message), routing_key: routing_key
24
+ exchange.publish ::MessagePack.pack(message), routing_key: routing_key.to_s
25
25
  end
26
26
 
27
27
  class << self
@@ -0,0 +1,31 @@
1
+ module Acfs::Model
2
+ module Attributes
3
+
4
+ # @api public
5
+ #
6
+ # DateTime attribute type. Use it in your model as an attribute type:
7
+ #
8
+ # @example
9
+ # class User
10
+ # include Acfs::Model
11
+ # attribute :name, :date_time
12
+ # end
13
+ #
14
+ module DateTime
15
+
16
+ # @api public
17
+ #
18
+ # Cast given object to DateTime.
19
+ # Expect
20
+ #
21
+ # @param [Object] obj Object to cast.
22
+ # @return [DateTime] Casted object as DateTime.
23
+ #
24
+ def self.cast(obj)
25
+ return obj if obj.is_a? ::DateTime
26
+ return ::DateTime.iso8601(obj.iso8601) if obj.is_a? Time or obj.is_a? Date
27
+ return ::DateTime.iso8601(obj)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ module Acfs::Model
2
+ module Attributes
3
+
4
+ # @api public
5
+ #
6
+ # Float attribute type. Use it in your model as an attribute type:
7
+ #
8
+ # @example
9
+ # class User
10
+ # include Acfs::Model
11
+ # attribute :name, :float
12
+ # end
13
+ #
14
+ module Float
15
+
16
+ # @api public
17
+ #
18
+ # Cast given object to float.
19
+ #
20
+ # @param [Object] obj Object to cast.
21
+ # @return [Float] Casted object as float.
22
+ #
23
+ def self.cast(obj)
24
+ obj.to_f
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ module Acfs::Model
2
+ module Attributes
3
+
4
+ # @api public
5
+ #
6
+ # List attribute type. Use it in your model as an attribute type:
7
+ #
8
+ # @example
9
+ # class User
10
+ # include Acfs::Model
11
+ # attribute :name, :list
12
+ # end
13
+ #
14
+ module List
15
+
16
+ # @api public
17
+ #
18
+ # Cast given object to a list.
19
+ #
20
+ # @param [Object] obj Object to cast.
21
+ # @return [Fixnum] Casted object as list.
22
+ # @raise [TypeError] If object cannot be casted to a list.
23
+ #
24
+ def self.cast(obj)
25
+ return obj.to_a if obj.respond_to? :to_a
26
+ raise TypeError.new "Cannot cast #{obj.inspect} to array."
27
+ end
28
+ end
29
+ end
30
+ end
@@ -31,6 +31,10 @@ module Acfs
31
31
  @id ||= params.delete(:id) || data[:id]
32
32
  end
33
33
 
34
+ def full_params
35
+ id ? params.merge(id: id) : params
36
+ end
37
+
34
38
  def url
35
39
  single? ? resource.url(id) : resource.url
36
40
  end
@@ -20,9 +20,9 @@ module Acfs
20
20
 
21
21
  def initialize(request, data = {})
22
22
  @request = request
23
- @status = data[:status]
24
- @headers = data[:headers]
25
- @body = data[:body]
23
+ @status = data[:status] || 0
24
+ @headers = data[:headers] || {}
25
+ @body = data[:body] || ''
26
26
  end
27
27
  end
28
28
  end
@@ -7,6 +7,50 @@ module Acfs
7
7
  class Stub
8
8
  ACTIONS = [ :read, :create, :update, :delete, :list ]
9
9
 
10
+ attr_reader :opts
11
+
12
+ def initialize(opts)
13
+ @opts = opts
14
+ @opts[:with].stringify_keys! if @opts[:with].respond_to? :stringify_keys
15
+ end
16
+
17
+ def accept?(op)
18
+ return opts[:with].call op if opts[:with].respond_to? :call
19
+
20
+ params = op.full_params.stringify_keys
21
+ data = op.data.stringify_keys
22
+
23
+ opts[:with] == params || data == opts[:with]
24
+ end
25
+
26
+ def calls
27
+ @calls ||= []
28
+ end
29
+
30
+ def called?(count = nil)
31
+ count = count.count if count.respond_to? :count # For `5.times` Enumerators
32
+ count.nil? ? calls.any? : calls.size == count
33
+ end
34
+
35
+ def call(op)
36
+ calls << op
37
+
38
+ if (data = opts[:return])
39
+ op.callback.call data
40
+ elsif (err = opts[:raise])
41
+ raise_error op, err, opts[:return]
42
+ else
43
+ raise ArgumentError, 'Unsupported stub.'
44
+ end
45
+ end
46
+
47
+ private
48
+ def raise_error(op, name, data)
49
+ raise name if name.is_a? Class
50
+
51
+ op.handle_failure ::Acfs::Response.new op.request, status: Rack::Utils.status_code(name), data: data
52
+ end
53
+
10
54
  class << self
11
55
 
12
56
  # Stub a resource with given handler block. An already created handler
@@ -16,9 +60,11 @@ module Acfs
16
60
  action = action.to_sym
17
61
  raise ArgumentError, "Unknown action `#{action}`." unless ACTIONS.include? action
18
62
 
19
- stubs[klass] ||= {}
20
- stubs[klass][action] ||= []
21
- stubs[klass][action] << opts
63
+ Stub.new(opts).tap do |stub|
64
+ stubs[klass] ||= {}
65
+ stubs[klass][action] ||= []
66
+ stubs[klass][action] << stub
67
+ end
22
68
  end
23
69
 
24
70
  def allow_requests=(allow)
@@ -48,38 +94,25 @@ module Acfs
48
94
 
49
95
  def stub_for(op)
50
96
  return false unless (classes = stubs[op.resource])
51
- return false unless (actions = classes[op.action])
97
+ return false unless (stubs = classes[op.action])
98
+
99
+ accepted_stubs = stubs.select { |stub| stub.accept? op }
52
100
 
53
- params = op.params
54
- params.merge! id: op.id unless op.id.nil?
55
- actions.select! { |stub| stub[:with] == params || stub[:with] == op.data }
56
- actions.first
101
+ raise AmbiguousStubError.new accepted_stubs, op if accepted_stubs.size > 1
102
+
103
+ accepted_stubs.first
57
104
  end
58
105
 
59
106
  def stubbed(op)
60
107
  stub = stub_for op
61
108
  unless stub
62
109
  return false if allow_requests?
63
- raise RealRequestsNotAllowedError, "No stub found for `#{op.resource.name}` with params `#{op.params}` and id `#{op.id}`."
64
- end
65
-
66
- if (data = stub[:return])
67
- op.callback.call data
68
- elsif (err = stub[:raise])
69
- raise_error op, err, stub[:return]
70
- else
71
- raise ArgumentError, 'Unsupported stub.'
110
+ raise RealRequestsNotAllowedError, "No stub found for #{op.action} on #{op.resource.name} with params #{op.full_params.inspect}, data #{op.data.inspect} and id #{op.id}."
72
111
  end
73
112
 
113
+ stub.call op
74
114
  true
75
115
  end
76
-
77
- private
78
- def raise_error(op, name, data)
79
- raise name if name.is_a? Class
80
-
81
- op.handle_failure ::Acfs::Response.new nil, status: Rack::Utils.status_code(name), data: data
82
- end
83
116
  end
84
117
  end
85
118
  end
@@ -1,7 +1,7 @@
1
1
  module Acfs
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 18
4
+ MINOR = 19
5
5
  PATCH = 0
6
6
  STAGE = nil
7
7
 
@@ -26,29 +26,35 @@ describe Acfs::Messaging::Receiver do
26
26
  context 'with routed message' do
27
27
  context 'with exact routing key match' do
28
28
  it 'should receive messages' do
29
+ pending 'Not reliable.'
30
+
29
31
  rcv_class.instance.should_receive(:receive).with(anything, anything, { message: 'Hello!'})
30
32
 
31
33
  Acfs::Messaging::Client.instance.publish('my.custom_receiver', { message: 'Hello!' })
32
- sleep 3 # Nothing better?
34
+ sleep 5 # Nothing better?
33
35
  end
34
36
  end
35
37
 
36
38
  context 'with partial routing key match' do
37
39
  it 'should receive messages' do
40
+ pending 'Not reliable.'
41
+
38
42
  rcv_class.instance.should_receive(:receive).with(anything, anything, { message: 'Hello!'})
39
43
 
40
44
  Acfs::Messaging::Client.instance.publish('my.different', { message: 'Hello!' })
41
- sleep 3 # Nothing better?
45
+ sleep 5 # Nothing better?
42
46
  end
43
47
  end
44
48
  end
45
49
 
46
50
  context 'with not routed message' do
47
51
  it 'should not receive messages' do
52
+ pending 'Not reliable.'
53
+
48
54
  rcv_class.instance.should_not_receive(:receive)
49
55
 
50
56
  Acfs::Messaging::Client.instance.publish('abc.cde', { message: 'Hello!' })
51
- sleep 3 # Nothing better?
57
+ sleep 5 # Nothing better?
52
58
  end
53
59
  end
54
60
  end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe Acfs::Model::Attributes::DateTime do
4
+ let(:model) { Class.new.tap { |c| c.send :include, Acfs::Model }}
5
+
6
+ describe 'cast' do
7
+ it 'should return same object, if obj is already of DateTime class' do
8
+ date_time = DateTime.now
9
+ retval = Acfs::Model::Attributes::DateTime.cast(date_time)
10
+ expect(retval).to be == date_time
11
+ end
12
+
13
+ it 'should return parsed object, if obj is of Time class' do
14
+ time = Time.now
15
+ retval = Acfs::Model::Attributes::DateTime.cast(time)
16
+ expect(retval).to be == DateTime.iso8601(time.iso8601)
17
+ end
18
+
19
+ it 'should return parsed object, if obj is of Date class' do
20
+ date = Date.today
21
+ retval = Acfs::Model::Attributes::DateTime.cast(date)
22
+ expect(retval).to be == DateTime.iso8601(date.iso8601)
23
+ end
24
+
25
+ it 'should return parsed object, if obj is of String class in ISO-8601 format' do
26
+ date_time_string = DateTime.now.iso8601
27
+ retval = Acfs::Model::Attributes::DateTime.cast(date_time_string)
28
+ expect(retval).to be == DateTime.iso8601(date_time_string)
29
+ end
30
+
31
+ it 'should raise an error if obj is of String class not in valid ISO-8601 format' do
32
+ malformed_string = 'qwe123'
33
+ expect {
34
+ Acfs::Model::Attributes::DateTime.cast(malformed_string)
35
+ }.to raise_error ArgumentError
36
+ end
37
+
38
+ it 'should raise an error if obj is of wrong class (Fixnum)' do
39
+ fixnum = 12
40
+ expect {
41
+ Acfs::Model::Attributes::DateTime.cast(fixnum)
42
+ }.to raise_error TypeError
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Acfs::Model::Attributes::Float do
4
+ let(:model) { Class.new.tap { |c| c.send :include, Acfs::Model }}
5
+
6
+ describe 'cast' do
7
+ it 'should return same object, if obj is already of float class' do
8
+ retval = Acfs::Model::Attributes::Float.cast(1.3)
9
+ expect(retval).to be == 1.3
10
+ end
11
+
12
+ it 'should return parsed object, if obj is of Fixnum class' do
13
+ retval = Acfs::Model::Attributes::Float.cast(7)
14
+ expect(retval).to be == 7.0
15
+ end
16
+
17
+ it 'should return parsed object, if obj is of String class containing a float' do
18
+ retval = Acfs::Model::Attributes::Float.cast('1.7')
19
+ expect(retval).to be == 1.7
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Acfs::Model::Attributes::List do
4
+ let(:model) { Class.new.tap { |c| c.send :include, Acfs::Model }}
5
+ subject { Acfs::Model::Attributes::List }
6
+
7
+ describe '.cast' do
8
+ context 'with array' do
9
+ let(:sample) { %w(abc cde efg) }
10
+
11
+ it 'should return unmodified array' do
12
+ expect(subject.cast(sample)).to be == %w(abc cde efg)
13
+ end
14
+ end
15
+
16
+ context 'with not listable object' do
17
+ let(:sample) { Object.new }
18
+
19
+ it 'should raise a TypeError' do
20
+ expect {
21
+ subject.cast(sample)
22
+ }.to raise_error TypeError
23
+ end
24
+ end
25
+
26
+ context 'with listable object' do
27
+ let(:sample) { 5..10 }
28
+
29
+ it 'should cast object to array' do
30
+ expect(subject.cast(sample)).to be == [5, 6, 7, 8, 9, 10]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -16,7 +16,43 @@ describe Acfs::Stub do
16
16
  #Acfs::Stub.create(MyUser).with(name: '', age: 12).and_return(:invalid, errors: { name: [ 'must be present ']})
17
17
  end
18
18
 
19
+ describe '#called?' do
20
+ context 'without specified number' do
21
+ let!(:operation) { Acfs::Stub.resource MyUser, :read, with: { id: 1 }, return: { id: 1, name: 'John Smith', age: 32 } }
22
+
23
+ it 'should allow to test if stub was called' do
24
+ MyUser.find 1
25
+ Acfs.run
26
+
27
+ expect(operation).to be_called
28
+ end
29
+
30
+ it 'should allow to test if stub was called a specific number of times' do
31
+ MyUser.find 1
32
+ Acfs.run
33
+
34
+ MyUser.find 1
35
+ Acfs.run
36
+
37
+ expect(operation).to be_called 2.times
38
+ end
39
+ end
40
+ end
41
+
19
42
  describe '.resource' do
43
+ context 'with ambiguous stubs' do
44
+ before do
45
+ Acfs::Stub.resource MyUser, :read, with: { id: 1 }, return: { id: 1, name: 'John Smith', age: 32 }
46
+ Acfs::Stub.resource MyUser, :read, with: { id: 1 }, raise: :not_found
47
+ end
48
+
49
+ it 'should raise error' do
50
+ MyUser.find 1
51
+
52
+ expect { Acfs.run }.to raise_error(Acfs::AmbiguousStubError)
53
+ end
54
+ end
55
+
20
56
  context 'with read action' do
21
57
  before do
22
58
  Acfs::Stub.resource MyUser, :read, with: { id: 1 }, return: { id: 1, name: 'John Smith', age: 32 }
@@ -51,7 +87,7 @@ describe Acfs::Stub do
51
87
  context 'with create action' do
52
88
  before do
53
89
  Acfs::Stub.resource Session, :create, with: { ident: 'john@exmaple.org', password: 's3cr3t' }, return: { id: 'longhash', user: 1 }
54
- Acfs::Stub.resource Session, :create, with: { ident: 'john@exmaple.org', password: 'wrong' }, raise: 422
90
+ Acfs::Stub.resource Session, :create, with: lambda { |op| op.data[:ident] == 'john@exmaple.org' && op.data[:password] == 'wrong' }, raise: 422
55
91
  end
56
92
 
57
93
  it 'should allow stub resource creation' do
@@ -67,6 +103,36 @@ describe Acfs::Stub do
67
103
  }.to raise_error(::Acfs::InvalidResource)
68
104
  end
69
105
  end
106
+
107
+ context 'with update action' do
108
+ before do
109
+ Acfs::Stub.resource MyUser, :read, with: { id: 1 }, return: { id: 1, name: 'John Smith', age: 32 }
110
+ Acfs::Stub.resource MyUser, :update, with: { id: 1, name: 'John Smith', age: 22 }, return: { id: 1, name: 'John Smith', age: 23 }
111
+ Acfs::Stub.resource MyUser, :update, with: { id: 1, name: 'John Smith', age: 0 }, raise: 422
112
+ end
113
+
114
+ it 'should allow stub resource update' do
115
+ user = MyUser.find 1
116
+ Acfs.run
117
+
118
+ user.age = 22
119
+ user.save!
120
+
121
+ expect(user.age).to be == 23
122
+ end
123
+
124
+ it 'should allow to raise error' do
125
+ user = MyUser.find 1
126
+ Acfs.run
127
+
128
+ user.age = 0
129
+ user.save
130
+
131
+ expect {
132
+ user.save!
133
+ }.to raise_error(::Acfs::InvalidResource)
134
+ end
135
+ end
70
136
  end
71
137
 
72
138
  describe '.allow_requests=' do
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.18.0
4
+ version: 0.19.0
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-05-28 00:00:00.000000000 Z
11
+ date: 2013-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - ~>
88
88
  - !ruby/object:Gem::Version
89
- version: 0.9.0.pre12
89
+ version: 0.9.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ~>
95
95
  - !ruby/object:Gem::Version
96
- version: 0.9.0.pre12
96
+ version: 0.9.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rack
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +150,7 @@ files:
150
150
  - lib/acfs/configuration.rb
151
151
  - lib/acfs/errors.rb
152
152
  - lib/acfs/global.rb
153
+ - lib/acfs/messaging.rb
153
154
  - lib/acfs/messaging/client.rb
154
155
  - lib/acfs/messaging/message.rb
155
156
  - lib/acfs/messaging/receiver.rb
@@ -163,7 +164,10 @@ files:
163
164
  - lib/acfs/model.rb
164
165
  - lib/acfs/model/attributes.rb
165
166
  - lib/acfs/model/attributes/boolean.rb
167
+ - lib/acfs/model/attributes/date_time.rb
168
+ - lib/acfs/model/attributes/float.rb
166
169
  - lib/acfs/model/attributes/integer.rb
170
+ - lib/acfs/model/attributes/list.rb
167
171
  - lib/acfs/model/attributes/string.rb
168
172
  - lib/acfs/model/dirty.rb
169
173
  - lib/acfs/model/initialization.rb
@@ -191,6 +195,9 @@ files:
191
195
  - spec/acfs/messaging/receiver_spec.rb
192
196
  - spec/acfs/middleware/json_decoder_spec.rb
193
197
  - spec/acfs/middleware/msgpack_decoder_spec.rb
198
+ - spec/acfs/model/attributes/date_time_spec.rb
199
+ - spec/acfs/model/attributes/float_spec.rb
200
+ - spec/acfs/model/attributes/list_spec.rb
194
201
  - spec/acfs/model/attributes_spec.rb
195
202
  - spec/acfs/model/dirty_spec.rb
196
203
  - spec/acfs/model/initialization_spec.rb
@@ -240,6 +247,9 @@ test_files:
240
247
  - spec/acfs/messaging/receiver_spec.rb
241
248
  - spec/acfs/middleware/json_decoder_spec.rb
242
249
  - spec/acfs/middleware/msgpack_decoder_spec.rb
250
+ - spec/acfs/model/attributes/date_time_spec.rb
251
+ - spec/acfs/model/attributes/float_spec.rb
252
+ - spec/acfs/model/attributes/list_spec.rb
243
253
  - spec/acfs/model/attributes_spec.rb
244
254
  - spec/acfs/model/dirty_spec.rb
245
255
  - spec/acfs/model/initialization_spec.rb