interface-dsl 0.1.4 → 0.1.5

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: a08f65100277da590913ecc15c42d7c5428a8d42
4
- data.tar.gz: 17227276991c60ae9f4e9dee377492666c0a085d
3
+ metadata.gz: 6e8e9d4a6a3e4193121aa9810bb856eaa9b4b55f
4
+ data.tar.gz: b57a5f53fb5f71e1f429d1e2fb29ece754fb93aa
5
5
  SHA512:
6
- metadata.gz: 7b430dfe570938c708800edb0af3acab804552a4ca390167f560cd00b2ad679e75b1f20f9fc704eb9bd57339565c015c82fcf66cf3fc5e20610c01a404921001
7
- data.tar.gz: 8208b4c19043b6328d0d924ecc084685828d1759d98c4c1c9ef1b477095b8c86c752ec9d2bcb7c5bcbbb0d1dd70a78c5f4dfc7e2503a9e11dfd9307df1eccf3e
6
+ metadata.gz: c531aa1457a25afca68e02a7c79ca0abeec3d2d0e3a4fe29d2dcf2932e9934c0bec2197771afd42b4e5a2d23ddc51d48432fa7885bcfdd9a68d3efbefe3ce38f
7
+ data.tar.gz: 0e140c323d173e97f18fb2df08ef9b8ffcdc678d25986e665183ada64deb3f87a2205011b6690d2e6a60de951bd63fffc26db067d8571550a979f9ceab62ce9f
@@ -1,31 +1,33 @@
1
1
  module Interface
2
- class Adapter
2
+ class DefaultAdapter
3
3
  CallingError = Class.new(StandardError)
4
4
  InterfaceError = Class.new(StandardError)
5
5
 
6
6
  extend FactoryMethods
7
7
 
8
- def_factory :call
8
+ deffactory :call
9
9
 
10
10
  def initialize(callable)
11
11
  @callable = callable
12
12
  end
13
13
 
14
- def call
14
+ def call(*args, &block)
15
15
  unless callable.respond_to?(:call)
16
16
  fail(InterfaceError("#{callable.class} is not callable!"))
17
17
  end
18
18
 
19
- _call
19
+ _call(*args, &block)
20
20
  end
21
21
 
22
22
  private
23
23
 
24
- def _call
25
- result = callable.call
24
+ attr_reader :callable
25
+
26
+ def _call(*args, &block)
27
+ result = callable.call(*args, &block)
26
28
  if result.is_a?(Array)
27
29
  status, _result = result
28
- status == :ok || fail(ServiceError("Error while calling #{callable.class}: #{_result}"))
30
+ status == :ok || fail(CallingError("Error while calling #{callable.class}: #{_result}"))
29
31
  _result
30
32
  else
31
33
  result
@@ -0,0 +1,8 @@
1
+ module Interface
2
+ class DefaultSettings
3
+ extend ::Dry::Configurable
4
+
5
+ setting(:allow_top_level_api_endpoints?, false)
6
+ setting(:response_adapter, ::Interface::DefaultAdapter)
7
+ end
8
+ end
@@ -1,5 +1,5 @@
1
1
  module Interface
2
2
  module Dsl
3
- VERSION = "0.1.4"
3
+ VERSION = "0.1.5"
4
4
  end
5
5
  end
data/lib/interface/dsl.rb CHANGED
@@ -1,17 +1,18 @@
1
1
  require "interface"
2
- require "interface/dsl/version"
3
2
 
4
3
  module Interface
5
4
  module DSL
6
- OrphanPort = Class.new(StandardError)
7
- ImmutableInterface = Class.new(StandardError)
5
+ def defsettings(configuration_class)
6
+ if !configuration_class.is_a?(Class) || !configuration_class.is_a?(Module)
7
+ fail(::Interface::Errors::UnexpectedInstanceError.new('Only classes and modules are supported'))
8
+ end
8
9
 
9
- require "interface/port_group"
10
- require "interface/port_entity"
10
+ @settings ||= configuration_class
11
+ end
11
12
 
12
13
  def interface(name, &block)
13
14
  if interfaces.key?(name)
14
- fail(ImmutableInterface.new("Interface can't be redefined or reopened! Use .extend_api method"))
15
+ fail(::Interface::Errors::ImmutableInterfaceError.new("Interface can't be redefined or reopened! Use .extend_api method"))
15
16
  end
16
17
 
17
18
  interfaces.merge!(name => ::Interface::PortGroup.new(name, self).tap do |group|
@@ -60,12 +61,16 @@ module Interface
60
61
  @points ||= Hashie::Mash.new
61
62
  end
62
63
 
64
+ def _settings
65
+ @settings || ::Interface::DefaultSettings
66
+ end
67
+
63
68
  private
64
69
 
65
70
  def check_top_level_enpoint_policy
66
- return if Interface.config.allow_top_level_api_endpoints? || !top_level?
71
+ return if _settings.config.allow_top_level_api_endpoints? || !top_level?
67
72
 
68
- fail(OrphanPort.new("Can not be defined as a top level Interface"))
73
+ fail(::Interface::Errors::OrphanPortError.new("Can not be defined as a top level Interface"))
69
74
  end
70
75
 
71
76
  def top_level?
@@ -89,7 +94,7 @@ module Interface
89
94
  end
90
95
 
91
96
  def define_entity(name, &block)
92
- ::Interface::PortEntity.new(name).tap { |port| port.instance_eval(&block) }
97
+ ::Interface::PortEntity.new(name, _settings.config.response_adapter).tap { |port| port.instance_eval(&block) }
93
98
  end
94
99
  end
95
100
  end
@@ -0,0 +1,11 @@
1
+ module Interface
2
+ module Errors
3
+ BaseError = Class.new(StandardError)
4
+
5
+ OrphanPortError = Class.new(BaseError)
6
+ ImmutableInterfaceError = Class.new(BaseError)
7
+ InvalidInputError = Class.new(BaseError)
8
+ HandlerMissingError = Class.new(BaseError)
9
+ UnexpectedInstanceError = Class.new(BaseError)
10
+ end
11
+ end
@@ -1,10 +1,5 @@
1
1
  module Interface
2
- # TODO
3
- # => define Schemas with dry-validation
4
- class PortEntity < Struct.new(:name)
5
- WTFError = Class.new(StandardError)
6
- InvalidInputError = Class.new(StandardError)
7
-
2
+ class PortEntity < Struct.new(:name, :default_adapter)
8
3
  N_A = 'N/A'.freeze
9
4
  LIM = ('-' * 48).freeze
10
5
 
@@ -14,17 +9,26 @@ module Interface
14
9
 
15
10
  def call(*args, &block)
16
11
  if @handler.nil?
17
- fail(WTFError.new("WAT A HECK U DOIN'! THERE'S NO HANDLER TO CALL!"))
12
+ fail(::Interface::Errors::HandlerMissingError.new("Handler is undefined"))
18
13
  end
19
14
 
20
15
  if !@contract.nil?
21
- fail(InvalidInputError.new("Empty argument list doesn not comply with the Contract")) if args.empty?
16
+ fail(::Interface::Errors::InvalidInputError.new("Empty argument list doesn not comply with the Contract")) if args.empty?
22
17
 
23
18
  errors = @contract.call(*args).errors
24
- fail(InvalidInputError.new(errors)) if errors.any?
19
+ fail(::Interface::Errors::InvalidInputError.new(errors)) if errors.any?
25
20
  end
26
21
 
27
- @handler.call(*args, &block)
22
+ # this is a decent source of bugs.
23
+ caller = if !@adapter.nil?
24
+ @adapter.new(@handler)
25
+ elsif !default_adapter.nil?
26
+ default_adapter.new(@handler)
27
+ else
28
+ @handler
29
+ end
30
+
31
+ caller.call(*args, &block)
28
32
  end
29
33
 
30
34
  def handler(klass)
@@ -35,11 +39,15 @@ module Interface
35
39
  @contract = validation_schema
36
40
  end
37
41
 
38
- def returns(hash)
39
- { success: [:ok, Object],
40
- failure: [:error, String] }
42
+ def returns(klass)
43
+ @adapter = klass
41
44
  end
42
45
 
46
+ # def returns(hash)
47
+ # { success: [:ok, Object],
48
+ # failure: [:error, String] }
49
+ # end
50
+
43
51
  #TODO
44
52
  def before_call; end
45
53
  def after_call; end
data/lib/interface.rb CHANGED
@@ -1,9 +1,14 @@
1
1
  require 'dry-configurable'
2
2
  require 'dry-validation'
3
3
  require 'factorymethods'
4
+ require 'interface/dsl/version'
5
+ require 'hashie'
4
6
 
5
7
  module Interface
6
- extend ::Dry::Configurable
8
+ autoload :PortGroup, 'interface/port_group'
9
+ autoload :PortEntity, 'interface/port_entity'
10
+ autoload :Errors, 'interface/errors'
7
11
 
8
- setting(:allow_top_level_api_endpoints?, false)
12
+ autoload :DefaultSettings, 'interface/default_settings'
13
+ autoload :DefaultAdapter, 'interface/default_adapter'
9
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interface-dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleksiy Kurnenkov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-06 00:00:00.000000000 Z
11
+ date: 2017-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-validation
@@ -140,9 +140,11 @@ files:
140
140
  - bin/setup
141
141
  - interface-dsl.gemspec
142
142
  - lib/interface.rb
143
- - lib/interface/adapter.rb
143
+ - lib/interface/default_adapter.rb
144
+ - lib/interface/default_settings.rb
144
145
  - lib/interface/dsl.rb
145
146
  - lib/interface/dsl/version.rb
147
+ - lib/interface/errors.rb
146
148
  - lib/interface/port_entity.rb
147
149
  - lib/interface/port_group.rb
148
150
  homepage: https://github.com/o-kurnenkov/interface-dsl