acfs 0.25.0.1.b232 → 0.26.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,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZTFmMzdiODEwYTc1M2IxOWU5YmNjMzljYjVmNjU4MjYwYTdkZDgyMg==
5
- data.tar.gz: !binary |-
6
- NzFiNjNhNDQ5NjIyNmVlODI0YzEwZTljYTBjNTU4Y2E0YjFmMTdkMw==
2
+ SHA1:
3
+ metadata.gz: ef03d133e909f75c3e309db36a37b2ebebb5f5c0
4
+ data.tar.gz: db0c0ef2f2d97301ceb1b66ebdc3e7262d282b4b
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- M2E5MTdiYjg1NzAyY2Y1NGNhNWVkNDBjZTdhMjY3ZWNmNTc2NjcxNjk2OWZi
10
- YTQzMjcxNGFkN2UxODc3ZGIwY2E0MTdkMGI5YTNmZGRkYTVjMDg2ODEwMzA0
11
- NmVhZWI5NzMyOWM4OWJmYjQ5NWU4ZGJhOThlMDZlYzUzNjMxMTc=
12
- data.tar.gz: !binary |-
13
- YWVhNzAzY2FkYzY0ZjlmYzhlOTg3OWZkNzNmNDFhMmY1ZTM0NDZjYjkyOWUx
14
- YjYwM2JjYTg1ZjhkOGY1YWY1NjdlMzcyYTI0ZGQzYjc4ZTJhNzljOGIwYzY1
15
- YTk0Y2ZiYjRkYTQ0MGQ2NTk0MjhkYWFiZmMwNGNjODk3NDczOWY=
6
+ metadata.gz: 9633fb9b9f3ac0357f03cb64c37f48066e28d6ba7238292fcaac8b448e297ad1b6c1f4c42a66f09e3be9e33423e215977f6ce2f573d611d8b5a30df48eb5809d
7
+ data.tar.gz: 52dcbf542450575eb7525e03e4a96e0bff46995cd756125be96ebee6f7386be53691b32859684e0543d34eee0b289f99ab838123f3f8a7d67d6f7994f53abadb
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.26.0
4
+
5
+ * Add support for singleton resources (Nicolas Fricke)
6
+
3
7
  ## 0.25.0
4
8
 
5
9
  * Add option to allow blank attribute values (Johannes Jasper)
@@ -19,6 +19,7 @@ module Acfs
19
19
  require 'acfs/response'
20
20
  require 'acfs/runner'
21
21
  require 'acfs/service'
22
+ require 'acfs/singleton_resource'
22
23
 
23
24
  extend Global
24
25
 
@@ -20,8 +20,6 @@ module Acfs
20
20
  @data = (opts[:data] || {}).dup
21
21
 
22
22
  @callback = block
23
-
24
- raise ArgumentError, 'ID parameter required for READ, UPDATE and DELETE operation.' if single? and id.nil?
25
23
  end
26
24
 
27
25
  def single?
@@ -0,0 +1,92 @@
1
+ module Acfs
2
+
3
+ # Acfs SingletonResources
4
+ #
5
+ # Usage explanation:
6
+ # Single.find => sends GET request to http://service:port/single
7
+ # my_single.save => sends POST request to http://service:port/single if my_single is a new object
8
+ # or sends PUT request to http://service:port/single if my_single has been requested before
9
+ # my_single.delete => sends DELETE request to http://service:port/single
10
+ #
11
+ # SingletonResources do not support the Resource method :all, since
12
+ # always only a single instance of the resource is being returned
13
+ #
14
+ class SingletonResource < Acfs::Resource
15
+
16
+ # @api public
17
+ #
18
+ # Return true if model is a new record and was not saved yet.
19
+ #
20
+ # Checks weather object is loaded via delegator or not, since
21
+ # the id-attribute is not required for singletons this check
22
+ # cannot check for existence of value in id-attribute
23
+ #
24
+ # @return [Boolean] True if resource is newly created, false otherwise.
25
+ #
26
+ def new?
27
+ !loaded?
28
+ end
29
+ alias :new_record? :new?
30
+
31
+ # @api public
32
+ #
33
+ # Destroy resource by sending a DELETE request.
34
+ # Will raise an error in case something goes wrong.
35
+ #
36
+ # Deleting a resource is a synchronous operation.
37
+ #
38
+ # @raise [Acfs::ErroneousResponse]
39
+ # If remote service respond with not successful response.
40
+ # @return [undefined]
41
+ # @see #delete
42
+ #
43
+ def delete!(opts = {})
44
+ opts[:params] ||= {}
45
+
46
+ operation :delete, opts do |data|
47
+ update_with data
48
+ freeze
49
+ end
50
+ end
51
+
52
+ class << self
53
+ # @api public
54
+ #
55
+ # @overload find(id, opts = {})
56
+ # Find a singleton resource, optionally with params.
57
+ #
58
+ # @example
59
+ # single = Singleton.find # Will query `http://base.url/singletons/`
60
+ #
61
+ # @param [ Hash ] opts Additional options.
62
+ # @option opts [ Hash ] :params Additional parameters added to request.
63
+ #
64
+ # @yield [ resource ] Callback block to be executed after resource was fetched successfully.
65
+ # @yieldparam resource [ self ] Fetched resources.
66
+ #
67
+ # @return [ self ] Resource object.
68
+ #
69
+ def find(*attrs, &block)
70
+ opts = { params: attrs.extract_options! }
71
+
72
+ model = ResourceDelegator.new self.new
73
+
74
+ operation :read, opts do |data|
75
+ model.__setobj__ create_resource data, origin: model.__getobj__
76
+ block.call model unless block.nil?
77
+ end
78
+
79
+ model
80
+ end
81
+
82
+ # @api public
83
+ #
84
+ # Undefined, raises NoMethodError.
85
+ # A singleton always only returns one object, therefore the
86
+ # methods :all and :where are not defined.
87
+ #
88
+ undef_method :all
89
+ undef_method :where
90
+ end
91
+ end
92
+ end
@@ -1,7 +1,7 @@
1
1
  module Acfs
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 25
4
+ MINOR = 26
5
5
  PATCH = 0
6
6
  STAGE = nil
7
7
 
@@ -56,6 +56,72 @@ describe 'Acfs' do
56
56
  expect(@user.age).to be == 26
57
57
  end
58
58
 
59
+ describe 'singleton' do
60
+ before do
61
+ stub_request(:get, 'http://users.example.org/singles?user_id=5').to_return response({ score: 250, user_id: 5 })
62
+ end
63
+
64
+ it 'should create a singleton resource' do
65
+ stub = stub_request(:post, 'http://users.example.org/singles').to_return response({ score: 250, user_id: 5 })
66
+
67
+ @single = Single.new user_id: 5, score: 250
68
+ expect(@single.new?).to eq true
69
+
70
+ @single.save
71
+ expect(stub).to have_been_requested
72
+
73
+ expect(@single.new?).to eq false
74
+ expect(@single.user_id).to eq 5
75
+ expect(@single.score).to eq 250
76
+ end
77
+
78
+ it 'should load singleton resource' do
79
+ @single = Single.find user_id: 5
80
+ Acfs.run
81
+
82
+ expect(@single.score).to eq 250
83
+ end
84
+
85
+ it 'should update singleton resource' do
86
+ stub = stub_request(:put, 'http://users.example.org/singles').to_return { |request| {
87
+ body: request.body,
88
+ headers: { 'Content-Type' => request.headers['Content-Type'] }
89
+ } }
90
+
91
+ @single = Single.find user_id: 5
92
+ Acfs.run
93
+
94
+ expect(@single.score).to eq 250
95
+
96
+ @single.score = 300
97
+ @single.save
98
+
99
+ expect(stub).to have_been_requested
100
+
101
+ expect(@single.score).to eq 300
102
+ end
103
+
104
+ it 'should delete singleton resource' do
105
+ stub = stub_request(:delete, 'http://users.example.org/singles').to_return { |request| {
106
+ body: request.body,
107
+ headers: { 'Content-Type' => request.headers['Content-Type'] }
108
+ } }
109
+
110
+ @single = Single.find user_id: 5
111
+ Acfs.run
112
+
113
+ expect(@single.new?).to eq false
114
+
115
+ @single.delete
116
+
117
+ expect(stub).to have_been_requested
118
+ end
119
+
120
+ it 'should raise error when calling `all\'' do
121
+ expect {Single.all}.to raise_error(NoMethodError)
122
+ end
123
+ end
124
+
59
125
  it 'should load multiple single resources' do
60
126
  @users = MyUser.find(2, 3, 100) do |users|
61
127
  # This block should be called only after *all* resources are loaded.
@@ -10,6 +10,9 @@ if ENV['CI'] || (defined?(:RUBY_ENGINE) && RUBY_ENGINE != 'rbx')
10
10
  end
11
11
  end
12
12
 
13
+ require 'bundler'
14
+ Bundler.require
15
+
13
16
  require 'acfs'
14
17
 
15
18
  Dir[File.expand_path('spec/support/**/*.rb')].each {|f| require f}
@@ -68,6 +68,13 @@ class Mac < Computer
68
68
 
69
69
  end
70
70
 
71
+ class Single < Acfs::SingletonResource
72
+ service UserService
73
+
74
+ attribute :score, :integer
75
+ attribute :user_id, :integer
76
+ end
77
+
71
78
  # DRAFT: Singular resource
72
79
  #class Singular < Acfs::Resource
73
80
  # service UserService, singular: true
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.0.1.b232
4
+ version: 0.26.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Graichen
@@ -14,84 +14,84 @@ dependencies:
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activemodel
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '3.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: actionpack
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '3.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: multi_json
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ! '>='
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ! '>='
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: typhoeus
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ! '>='
73
+ - - '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: 0.6.5
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ! '>='
80
+ - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.6.5
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rack
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ! '>='
87
+ - - '>='
88
88
  - !ruby/object:Gem::Version
89
89
  version: '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
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
@@ -172,6 +172,7 @@ files:
172
172
  - lib/acfs/runner.rb
173
173
  - lib/acfs/service.rb
174
174
  - lib/acfs/service/middleware.rb
175
+ - lib/acfs/singleton_resource.rb
175
176
  - lib/acfs/stub.rb
176
177
  - lib/acfs/version.rb
177
178
  - lib/acfs/yard.rb
@@ -213,17 +214,17 @@ require_paths:
213
214
  - lib
214
215
  required_ruby_version: !ruby/object:Gem::Requirement
215
216
  requirements:
216
- - - ! '>='
217
+ - - '>='
217
218
  - !ruby/object:Gem::Version
218
219
  version: '0'
219
220
  required_rubygems_version: !ruby/object:Gem::Requirement
220
221
  requirements:
221
- - - ! '>'
222
+ - - '>='
222
223
  - !ruby/object:Gem::Version
223
- version: 1.3.1
224
+ version: '0'
224
225
  requirements: []
225
226
  rubyforge_project:
226
- rubygems_version: 2.2.0
227
+ rubygems_version: 2.1.11
227
228
  signing_key:
228
229
  specification_version: 4
229
230
  summary: An abstract API base client for service oriented application.