acfs 1.3.2 → 1.3.3

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.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. metadata +8 -141
  3. data/CHANGELOG.md +0 -325
  4. data/LICENSE +0 -22
  5. data/README.md +0 -334
  6. data/acfs.gemspec +0 -37
  7. data/lib/acfs.rb +0 -49
  8. data/lib/acfs/adapter/base.rb +0 -26
  9. data/lib/acfs/adapter/typhoeus.rb +0 -60
  10. data/lib/acfs/collection.rb +0 -27
  11. data/lib/acfs/collections/paginatable.rb +0 -75
  12. data/lib/acfs/configuration.rb +0 -113
  13. data/lib/acfs/errors.rb +0 -106
  14. data/lib/acfs/global.rb +0 -99
  15. data/lib/acfs/location.rb +0 -78
  16. data/lib/acfs/middleware/base.rb +0 -20
  17. data/lib/acfs/middleware/json.rb +0 -27
  18. data/lib/acfs/middleware/logger.rb +0 -23
  19. data/lib/acfs/middleware/msgpack.rb +0 -30
  20. data/lib/acfs/middleware/print.rb +0 -21
  21. data/lib/acfs/middleware/serializer.rb +0 -39
  22. data/lib/acfs/operation.rb +0 -81
  23. data/lib/acfs/request.rb +0 -36
  24. data/lib/acfs/request/callbacks.rb +0 -50
  25. data/lib/acfs/resource.rb +0 -37
  26. data/lib/acfs/resource/attributes.rb +0 -268
  27. data/lib/acfs/resource/attributes/base.rb +0 -28
  28. data/lib/acfs/resource/attributes/boolean.rb +0 -37
  29. data/lib/acfs/resource/attributes/date_time.rb +0 -31
  30. data/lib/acfs/resource/attributes/dict.rb +0 -37
  31. data/lib/acfs/resource/attributes/float.rb +0 -31
  32. data/lib/acfs/resource/attributes/integer.rb +0 -27
  33. data/lib/acfs/resource/attributes/list.rb +0 -34
  34. data/lib/acfs/resource/attributes/string.rb +0 -24
  35. data/lib/acfs/resource/attributes/uuid.rb +0 -47
  36. data/lib/acfs/resource/dirty.rb +0 -35
  37. data/lib/acfs/resource/initialization.rb +0 -29
  38. data/lib/acfs/resource/loadable.rb +0 -33
  39. data/lib/acfs/resource/locatable.rb +0 -128
  40. data/lib/acfs/resource/operational.rb +0 -22
  41. data/lib/acfs/resource/persistence.rb +0 -257
  42. data/lib/acfs/resource/query_methods.rb +0 -264
  43. data/lib/acfs/resource/service.rb +0 -42
  44. data/lib/acfs/resource/validation.rb +0 -37
  45. data/lib/acfs/response.rb +0 -28
  46. data/lib/acfs/response/formats.rb +0 -25
  47. data/lib/acfs/response/status.rb +0 -31
  48. data/lib/acfs/rspec.rb +0 -11
  49. data/lib/acfs/runner.rb +0 -97
  50. data/lib/acfs/service.rb +0 -91
  51. data/lib/acfs/service/middleware.rb +0 -56
  52. data/lib/acfs/service/middleware/stack.rb +0 -63
  53. data/lib/acfs/singleton_resource.rb +0 -83
  54. data/lib/acfs/stub.rb +0 -172
  55. data/lib/acfs/util.rb +0 -20
  56. data/lib/acfs/version.rb +0 -14
  57. data/lib/acfs/yard.rb +0 -5
  58. data/spec/acfs/adapter/typhoeus_spec.rb +0 -28
  59. data/spec/acfs/collection_spec.rb +0 -155
  60. data/spec/acfs/configuration_spec.rb +0 -51
  61. data/spec/acfs/global_spec.rb +0 -137
  62. data/spec/acfs/location_spec.rb +0 -23
  63. data/spec/acfs/middleware/json_spec.rb +0 -63
  64. data/spec/acfs/middleware/msgpack_spec.rb +0 -60
  65. data/spec/acfs/operation_spec.rb +0 -10
  66. data/spec/acfs/request/callbacks_spec.rb +0 -46
  67. data/spec/acfs/request_spec.rb +0 -77
  68. data/spec/acfs/resource/attributes/boolean_spec.rb +0 -56
  69. data/spec/acfs/resource/attributes/date_time_spec.rb +0 -49
  70. data/spec/acfs/resource/attributes/dict_spec.rb +0 -75
  71. data/spec/acfs/resource/attributes/float_spec.rb +0 -59
  72. data/spec/acfs/resource/attributes/integer_spec.rb +0 -34
  73. data/spec/acfs/resource/attributes/list_spec.rb +0 -58
  74. data/spec/acfs/resource/attributes/uuid_spec.rb +0 -40
  75. data/spec/acfs/resource/attributes_spec.rb +0 -179
  76. data/spec/acfs/resource/dirty_spec.rb +0 -47
  77. data/spec/acfs/resource/initialization_spec.rb +0 -30
  78. data/spec/acfs/resource/loadable_spec.rb +0 -20
  79. data/spec/acfs/resource/locatable_spec.rb +0 -116
  80. data/spec/acfs/resource/persistance_spec.rb +0 -316
  81. data/spec/acfs/resource/query_methods_spec.rb +0 -541
  82. data/spec/acfs/resource/validation_spec.rb +0 -127
  83. data/spec/acfs/response/formats_spec.rb +0 -50
  84. data/spec/acfs/response/status_spec.rb +0 -69
  85. data/spec/acfs/runner_spec.rb +0 -97
  86. data/spec/acfs/service/middleware_spec.rb +0 -33
  87. data/spec/acfs/service_spec.rb +0 -46
  88. data/spec/acfs/singleton_resource_spec.rb +0 -15
  89. data/spec/acfs/stub_spec.rb +0 -343
  90. data/spec/acfs_spec.rb +0 -203
  91. data/spec/fixtures/config.yml +0 -14
  92. data/spec/spec_helper.rb +0 -41
  93. data/spec/support/hash.rb +0 -9
  94. data/spec/support/response.rb +0 -10
  95. data/spec/support/service.rb +0 -91
  96. data/spec/support/shared/find_callbacks.rb +0 -48
@@ -1,78 +0,0 @@
1
- module Acfs
2
- # @api private
3
- #
4
- # Describes a URL with placeholders.
5
- #
6
- class Location
7
- attr_reader :arguments, :raw, :struct, :args
8
-
9
- REGEXP = /^:([A-z][A-z0-9_]*)$/
10
-
11
- def initialize(uri, args = {})
12
- @raw = URI.parse uri
13
- @args = args
14
- @struct = raw.path.split('/').reject(&:empty?).map {|s| s =~ REGEXP ? Regexp.last_match[1].to_sym : s }
15
- @arguments = struct.select {|s| s.is_a?(Symbol) }
16
- end
17
-
18
- def build(args = {})
19
- unless args.is_a?(Hash)
20
- raise ArgumentError.new "URI path arguments must be a hash, `#{args.inspect}' given."
21
- end
22
-
23
- self.class.new raw.to_s, args.merge(self.args)
24
- end
25
-
26
- def extract_from(*args)
27
- args = {}.tap do |collect|
28
- arguments.each {|key| collect[key] = extract_arg key, args }
29
- end
30
-
31
- build args
32
- end
33
-
34
- def str
35
- uri = raw.dup
36
- uri.path = '/' + struct.map {|s| lookup_arg(s, args) }.join('/')
37
- uri.to_s
38
- end
39
-
40
- def raw_uri
41
- raw.to_s
42
- end
43
- alias_method :to_s, :raw_uri
44
-
45
- private
46
-
47
- def extract_arg(key, hashes)
48
- hashes.each_with_index do |hash, index|
49
- return (index == 0 ? hash.delete(key) : hash.fetch(key)) if hash.key?(key)
50
- end
51
-
52
- nil
53
- end
54
-
55
- def lookup_arg(arg, args)
56
- arg.is_a?(Symbol) ? lookup_replacement(arg, args) : arg
57
- end
58
-
59
- def lookup_replacement(sym, args)
60
- value = get_replacement(sym, args).to_s
61
- return ::URI.encode_www_form_component(value) unless value.empty?
62
-
63
- raise ArgumentError.new "Cannot replace path argument `#{sym}' with empty string."
64
- end
65
-
66
- def get_replacement(sym, args)
67
- args.fetch(sym.to_s) do
68
- args.fetch(sym) do
69
- if args[:raise].nil? || args[:raise]
70
- raise ArgumentError.new "URI path argument `#{sym}' missing on `#{self}'. Given: `#{args}.inspect'"
71
- else
72
- ":#{sym}"
73
- end
74
- end
75
- end
76
- end
77
- end
78
- end
@@ -1,20 +0,0 @@
1
- module Acfs
2
- module Middleware
3
- # A base middleware that does not modify request or response.
4
- # Can be used as super class for custom middleware implementations.
5
- #
6
- class Base
7
- attr_reader :app, :options
8
-
9
- def initialize(app, options = {})
10
- @app = app
11
- @options = options
12
- end
13
-
14
- def call(request)
15
- request.on_complete {|res, nxt| response(res, nxt) } if respond_to? :response
16
- app.call(request)
17
- end
18
- end
19
- end
20
- end
@@ -1,27 +0,0 @@
1
- require 'multi_json'
2
-
3
- module Acfs
4
- module Middleware
5
- # A middleware to encore request data using JSON.
6
- #
7
- class JSON < Serializer
8
- def mime
9
- ::Mime[:json]
10
- end
11
-
12
- def encode(data)
13
- ::MultiJson.dump data
14
- end
15
-
16
- def decode(body)
17
- ::MultiJson.load body
18
- end
19
- end
20
-
21
- # @deprecated
22
- JsonDecoder = JSON
23
-
24
- # @deprecated
25
- JsonEncoder = JSON
26
- end
27
- end
@@ -1,23 +0,0 @@
1
- require 'logger'
2
-
3
- module Acfs
4
- module Middleware
5
- # Log requests and responses.
6
- #
7
- class Logger < Base
8
- def initialize(app, options = {})
9
- super
10
- @logger = options[:logger] if options[:logger]
11
- end
12
-
13
- def response(res, nxt)
14
- logger.info "[ACFS] #{res.request.method.to_s.upcase} #{res.request.url} -> #{res.status}"
15
- nxt.call res
16
- end
17
-
18
- def logger
19
- @logger ||= ::Logger.new STDOUT
20
- end
21
- end
22
- end
23
- end
@@ -1,30 +0,0 @@
1
- require 'msgpack'
2
- require 'action_dispatch'
3
-
4
- module Acfs
5
- module Middleware
6
- class MessagePack < Serializer
7
- unless defined?(::Mime::MSGPACK)
8
- ::Mime::Type.register 'application/x-msgpack', :msgpack
9
- end
10
-
11
- def mime
12
- ::Mime[:msgpack]
13
- end
14
-
15
- def encode(data)
16
- ::MessagePack.pack data
17
- end
18
-
19
- def decode(body)
20
- ::MessagePack.unpack body
21
- end
22
- end
23
-
24
- # @deprecated
25
- MessagePackEncoder = MessagePack
26
-
27
- # @deprecated
28
- MessagePackDecoder = MessagePack
29
- end
30
- end
@@ -1,21 +0,0 @@
1
- module Acfs
2
- module Middleware
3
- # Print resquests and response on terminal
4
- #
5
- class Print < Base
6
- def call(req)
7
- puts '-' * 80
8
- puts req.inspect
9
- puts '-' * 80
10
-
11
- super
12
- end
13
-
14
- def response(res)
15
- puts '-' * 80
16
- puts res.inspect
17
- puts '-' * 80
18
- end
19
- end
20
- end
21
- end
@@ -1,39 +0,0 @@
1
- module Acfs
2
- module Middleware
3
- # A base middleware that does not modify request or response.
4
- # Can be used as super class for custom middleware implementations.
5
- #
6
- class Serializer < Base
7
- def encode(_data)
8
- raise NotImplementedError
9
- end
10
-
11
- def decode(_data)
12
- raise NotImplementedError
13
- end
14
-
15
- def mime
16
- raise NotImplementedError
17
- end
18
-
19
- def call(request)
20
- unless request.headers['Content-Type']
21
- request.body = encode request.data
22
- request.headers['Content-Type'] = mime
23
- end
24
-
25
- accept = request.headers['Accept'].to_s.split(',')
26
- accept << "#{mime};q=#{options.fetch(:q, 1)}"
27
- request.headers['Accept'] = accept.join(',')
28
-
29
- request.on_complete do |response, nxt|
30
- response.data = decode response.body if mime == response.content_type
31
-
32
- nxt.call response
33
- end
34
-
35
- app.call(request)
36
- end
37
- end
38
- end
39
- end
@@ -1,81 +0,0 @@
1
- module Acfs
2
- # @api private
3
- #
4
- # Describes a CRUD operation. Handle request creation and response
5
- # processing as well as error handling and stubbing.
6
- #
7
- class Operation
8
- attr_reader :action, :params, :resource, :data, :callback, :location, :url
9
- delegate :service, to: :resource
10
- delegate :call, to: :callback
11
-
12
- def initialize(resource, action, opts = {}, &block)
13
- @resource = resource
14
- @action = action.to_sym
15
-
16
- # Operations can be delayed so dup params and data to avoid
17
- # later in-place changes by modifying passed hash
18
- @params = (opts[:params] || {}).dup
19
- @data = (opts[:data] || {}).dup
20
-
21
- if opts[:url]
22
- @url = opts[:url]
23
- else
24
- @location = resource.location(action: @action).extract_from(@params, @data)
25
- @url = location.str
26
- end
27
-
28
- @callback = block
29
- end
30
-
31
- def single?
32
- [:read, :update, :delete].include? action
33
- end
34
-
35
- def synchronous?
36
- [:update, :delete, :create].include? action
37
- end
38
-
39
- def id
40
- # TODO
41
- @id ||= params.delete(:id) || data[:id]
42
- end
43
-
44
- def full_params
45
- (id ? params.merge(id: id) : params).merge location_args
46
- end
47
-
48
- def location_args
49
- location ? location.args : {}
50
- end
51
-
52
- def method
53
- {read: :get, list: :get, update: :put, create: :post, delete: :delete}[action]
54
- end
55
-
56
- def request
57
- request = ::Acfs::Request.new url, method: method, params: params,
58
- data: data, operation: self
59
- request.on_complete do |response|
60
- ::ActiveSupport::Notifications.instrument 'acfs.operation.complete',
61
- operation: self,
62
- response: response
63
-
64
- handle_failure response unless response.success?
65
- callback.call response.data, response
66
- end
67
- request
68
- end
69
-
70
- def handle_failure(response)
71
- case response.code
72
- when 404
73
- raise ::Acfs::ResourceNotFound.new response: response
74
- when 422
75
- raise ::Acfs::InvalidResource.new response: response, errors: response.data.try(:[], 'errors')
76
- else
77
- raise ::Acfs::ErroneousResponse.new response: response
78
- end
79
- end
80
- end
81
- end
@@ -1,36 +0,0 @@
1
- require 'acfs/request/callbacks'
2
-
3
- module Acfs
4
- # Encapsulate all data required to make up a request to the
5
- # underlaying http library.
6
- #
7
- class Request
8
- attr_accessor :body, :format
9
- attr_reader :url, :headers, :params, :data, :method, :operation
10
-
11
- include Request::Callbacks
12
-
13
- def initialize(url, options = {}, &block)
14
- @url = URI.parse(url.to_s).tap do |_url|
15
- @data = options.delete(:data) || nil
16
- @format = options.delete(:format) || :json
17
- @headers = options.delete(:headers) || {}
18
- @params = options.delete(:params) || {}
19
- @method = options.delete(:method) || :get
20
- end.to_s
21
- @operation = options.delete(:operation) || nil
22
- on_complete(&block) if block_given?
23
- end
24
-
25
- def data?
26
- !data.nil?
27
- end
28
-
29
- class << self
30
- def new(*attrs)
31
- return attrs[0] if attrs[0].is_a? self
32
- super
33
- end
34
- end
35
- end
36
- end
@@ -1,50 +0,0 @@
1
- module Acfs
2
- class Request
3
- # Module containing callback handling for Requests.
4
- # Current the only callback type is `on_complete`:
5
- #
6
- # request = Request.new 'URL'
7
- # request.on_complete { |response| ... }
8
- #
9
- module Callbacks
10
- # Add a new `on_complete` callback for this request.
11
- #
12
- # @example Set on_complete.
13
- # request.on_complete { |response| print response.body }
14
- #
15
- # @param [ Block ] block The callback block to execute.
16
- #
17
- # @yield [ Acfs::Response ]
18
- #
19
- # @return [ Acfs::Request ] The request itself.
20
- #
21
- def on_complete(&block)
22
- callbacks.insert 0, block if block_given?
23
- self
24
- end
25
-
26
- # Return array of all callbacks.
27
- #
28
- # @return [ Array<Block> ] All callbacks.
29
- #
30
- def callbacks
31
- @callbacks ||= []
32
- end
33
-
34
- # Trigger all callback for given response.
35
- #
36
- # @return [ Acfs::Request ] The request itself.
37
- #
38
- def complete!(response)
39
- call_callback response, 0
40
- self
41
- end
42
-
43
- private
44
-
45
- def call_callback(res, index)
46
- callbacks[index].call res, proc {|bres| call_callback bres, index + 1 } if index < callbacks.size
47
- end
48
- end
49
- end
50
- end
@@ -1,37 +0,0 @@
1
- require 'active_model'
2
-
3
- # @api public
4
- #
5
- class Acfs::Resource
6
- require 'acfs/resource/initialization'
7
- require 'acfs/resource/attributes'
8
- require 'acfs/resource/dirty'
9
- require 'acfs/resource/loadable'
10
- require 'acfs/resource/locatable'
11
- require 'acfs/resource/operational'
12
- require 'acfs/resource/persistence'
13
- require 'acfs/resource/query_methods'
14
- require 'acfs/resource/service'
15
- require 'acfs/resource/validation'
16
-
17
- if ActiveModel::VERSION::MAJOR >= 4
18
- include ActiveModel::Model
19
- else
20
- extend ActiveModel::Naming
21
- extend ActiveModel::Translation
22
- include ActiveModel::Conversion
23
- include ActiveModel::Validations
24
- end
25
-
26
- include Initialization
27
-
28
- include Attributes
29
- include Loadable
30
- include Persistence
31
- include Locatable
32
- include Operational
33
- include QueryMethods
34
- include Service
35
- include Dirty
36
- include Validation
37
- end