interface-dsl 0.1.3 → 0.1.4

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: 2142d61ffe6b00c83f9bfd970a8a20c6b1165e5d
4
- data.tar.gz: 9cd214a3f86e8a7900c94b0f83340f076826856d
3
+ metadata.gz: a08f65100277da590913ecc15c42d7c5428a8d42
4
+ data.tar.gz: 17227276991c60ae9f4e9dee377492666c0a085d
5
5
  SHA512:
6
- metadata.gz: 4392b14667b9e0d09139c70c410472fe0852273a3f3d5890def2772fefdce717923272a106413c164a13e29930590c6c677d6fcf0f2fe4fc26e6a1db7242f5fc
7
- data.tar.gz: 109b67c57a3c33763669f5f0ef06c92aebbe1e10e1932f02b8b6c42ee554b356eda662d03cc90d62f5c28ba51f208edd72d27caf7f0f57fbdaab562b9a055fc0
6
+ metadata.gz: 7b430dfe570938c708800edb0af3acab804552a4ca390167f560cd00b2ad679e75b1f20f9fc704eb9bd57339565c015c82fcf66cf3fc5e20610c01a404921001
7
+ data.tar.gz: 8208b4c19043b6328d0d924ecc084685828d1759d98c4c1c9ef1b477095b8c86c752ec9d2bcb7c5bcbbb0d1dd70a78c5f4dfc7e2503a9e11dfd9307df1eccf3e
data/Gemfile CHANGED
@@ -3,5 +3,6 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in interface-dsl.gemspec
4
4
  gemspec
5
5
 
6
+ gem 'dry-validation'
6
7
  gem 'factorymethods'
7
8
  gem 'hashie'
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Interface::Dsl
1
+ # Interface::DSL
2
2
 
3
3
  ## Installation
4
4
 
@@ -47,12 +47,12 @@ class CodeMonkeyAPI
47
47
  extend Interface::DSL
48
48
 
49
49
  # Define some interface
50
- interface(:midnight_api) do |api|
50
+ interface(:midnight_api) do
51
51
 
52
52
  # Define some endpoint
53
- api.defpoint(:emergency_push) do |op|
54
- op.describe "Push the code, fall asleep"
55
- op.implementation MidnightCodingOperation
53
+ defpoint(:emergency_push) do |op|
54
+ describe "Push the code, fall asleep"
55
+ handler MidnightCodingOperation
56
56
  end
57
57
  end
58
58
  end
@@ -76,6 +76,74 @@ MidnightCoderAPI = CodeMonkeyAPI.midnight_api # specific API
76
76
  MidnightCoderAPI.emergency_push.call # usage
77
77
  ```
78
78
 
79
+ ## [HOT] Extend your API at any relevant point
80
+
81
+ ```ruby
82
+ # Our BASE API class
83
+ class HumanoidAPI
84
+ # Enable DSL
85
+ extend Interface::DSL
86
+
87
+ # declare main API
88
+ interface(:base_functions) do
89
+ defpoint(:jump) do
90
+ describe "Do jump!"
91
+ handler BaseRobotJump
92
+ end
93
+ end
94
+ end
95
+
96
+ # API Extension class
97
+ class JumpExtension
98
+ # Enable DSL
99
+ extend Interface::DSL
100
+
101
+ # declare extended API
102
+ interface(:jumping) do
103
+ defpoint(:on_one_leg) do
104
+ describe "Carefully jumps on one leg"
105
+ handler RobotJumpingMaster
106
+ end
107
+ end
108
+ end
109
+ ```
110
+
111
+ Current legitimate API for HumanoidAPI is
112
+
113
+ ```ruby
114
+ HumanoidAPI.base_functions.jump
115
+ ```
116
+
117
+ Let's extend it with `JumpExtension`
118
+ ```ruby
119
+ HumanoidAPI.base_functions.extend_api(as: 'weird', with_class: JumpExtension)
120
+ ```
121
+
122
+ We've just declaratively extended our API to
123
+ ```ruby
124
+ HumanoidAPI.base_functions.jump
125
+ HumanoidAPI.base_functions.weird.jumping.on_one_leg
126
+ ```
127
+
128
+ ## [WIP] Declare contract for input data by means of dry-validation (available in [input-validation branch](https://github.com/o-kurnenkov/interface-dsl/tree/input-validation))
129
+ ```ruby
130
+ interface(:midnight_api) do
131
+ defpoint(:emergency_push) do
132
+ describe "Push the code, fall asleep"
133
+ handler MidnightCodingOperation
134
+
135
+ # contract \
136
+ contract Dry::Validation.Schema do
137
+ required(:path_to_bed).schema do
138
+ required(:room).filled
139
+ end
140
+ end
141
+ # contract /
142
+ end
143
+ end
144
+ ```
145
+
146
+
79
147
  ## Development
80
148
 
81
149
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -16,10 +16,13 @@ Gem::Specification.new do |spec|
16
16
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
17
  f.match(%r{^(test|spec|features)/})
18
18
  end
19
+
19
20
  spec.bindir = "exe"
20
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
22
  spec.require_paths = ["lib"]
22
23
 
24
+ spec.add_runtime_dependency 'dry-validation'
25
+
23
26
  spec.add_runtime_dependency 'hashie', '~> 3.0'
24
27
  spec.add_runtime_dependency 'dry-configurable', '~> 0.3'
25
28
  spec.add_runtime_dependency 'factorymethods', '~> 1.0'
@@ -1,5 +1,5 @@
1
1
  module Interface
2
2
  module Dsl
3
- VERSION = "0.1.3"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
data/lib/interface/dsl.rb CHANGED
@@ -15,7 +15,7 @@ module Interface
15
15
  end
16
16
 
17
17
  interfaces.merge!(name => ::Interface::PortGroup.new(name, self).tap do |group|
18
- yield(group)
18
+ group.instance_eval(&block)
19
19
  end)
20
20
  end
21
21
 
@@ -89,7 +89,7 @@ module Interface
89
89
  end
90
90
 
91
91
  def define_entity(name, &block)
92
- ::Interface::PortEntity.new(name).tap { |port| yield(port) }
92
+ ::Interface::PortEntity.new(name).tap { |port| port.instance_eval(&block) }
93
93
  end
94
94
  end
95
95
  end
@@ -2,7 +2,8 @@ module Interface
2
2
  # TODO
3
3
  # => define Schemas with dry-validation
4
4
  class PortEntity < Struct.new(:name)
5
- WTFError = Class.new(StandardError)
5
+ WTFError = Class.new(StandardError)
6
+ InvalidInputError = Class.new(StandardError)
6
7
 
7
8
  N_A = 'N/A'.freeze
8
9
  LIM = ('-' * 48).freeze
@@ -11,16 +12,27 @@ module Interface
11
12
  @description = text
12
13
  end
13
14
 
14
- def call
15
- if @implementation.nil?
16
- fail(WTFError.new("WAT A HECK U DOIN'! THERE'S NO IMPLEMENTATION TO CALL!"))
15
+ def call(*args, &block)
16
+ if @handler.nil?
17
+ fail(WTFError.new("WAT A HECK U DOIN'! THERE'S NO HANDLER TO CALL!"))
17
18
  end
18
19
 
19
- @implementation.call
20
+ if !@contract.nil?
21
+ fail(InvalidInputError.new("Empty argument list doesn not comply with the Contract")) if args.empty?
22
+
23
+ errors = @contract.call(*args).errors
24
+ fail(InvalidInputError.new(errors)) if errors.any?
25
+ end
26
+
27
+ @handler.call(*args, &block)
28
+ end
29
+
30
+ def handler(klass)
31
+ @handler = klass
20
32
  end
21
33
 
22
- def implementation(klass)
23
- @implementation = klass
34
+ def contract(validation_schema)
35
+ @contract = validation_schema
24
36
  end
25
37
 
26
38
  def returns(hash)
@@ -38,7 +50,7 @@ module Interface
38
50
  #{LIM}
39
51
  Name:\t#{ name }
40
52
  Desc:\t#{ @description || N_A}
41
- Responsible:\t#{ @implementation || N_A}
53
+ Responsible:\t#{ @handler || N_A}
42
54
  Accepts:\t#{ @arguments || N_A}
43
55
  Returns:
44
56
  \tsuccess:\t#{ @returns && @returns.fetch(:success, N_A) || N_A }
data/lib/interface.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'dry-configurable'
2
+ require 'dry-validation'
2
3
  require 'factorymethods'
3
4
 
4
5
  module Interface
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interface-dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
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-03 00:00:00.000000000 Z
11
+ date: 2017-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-validation
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: hashie
15
29
  requirement: !ruby/object:Gem::Requirement