navigable 1.3.0 → 1.4.0

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
  SHA256:
3
- metadata.gz: 3a004a4e2480872ee2a0130049ad9ef937a051ce833e531ac7630e959619d810
4
- data.tar.gz: e8da43504809998f63d4814e6e811210bed57e08da0fbeb129ed0cf6771d152b
3
+ metadata.gz: cb34750833af0f6d8cd1acbd902c18aac498d4f4ccc7395aaec1013f9a558b99
4
+ data.tar.gz: b7724f9edac3d02dd90c7f26b8a3713b2449700a3e89a68d43e439927d954571
5
5
  SHA512:
6
- metadata.gz: d59a86ed9f40d4d1def574099592f46b4434f78deb0aa1b6e89d41fd6cc13d8c89db2393885bff1449113741c9e566cecd6d30848962c2afd6da6f23dbf29abf
7
- data.tar.gz: c159acdb8be562e419540b01cccf1efb9df1b8dfa37f9fd85b7e6ac7a455fb54dd080c29d062b96460fb8f393688d15061ac10466b68dd83f0e025309a34aec3
6
+ metadata.gz: 202e9957715004b886d76be87d2b6c856809b4ca04b2f9a62432f460dc2c3f28f8cd31a13bd2cf85bfed329765c6082fb40ccee3ee0c666b930c499517c818ec
7
+ data.tar.gz: e7dfad712e84d3c7339ba71749c4525e36e1b087cccaaca074e6967b509fb192f70b750460881cbc7ba194955cde4dd687e21eb4bac3b3cefb2cb6e2e74f14af
data/README.md CHANGED
@@ -32,22 +32,13 @@ A simple, highly-performant, Rack-based router.
32
32
  **[Navigable Server][server]** *(coming soon)*<br>
33
33
  A Rack-based server for building Ruby and Navigable web applications.
34
34
 
35
- </td>
36
- </tr>
37
- <tr height="140">
38
- <td width="130"><img alt="Telescope" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/telescope.png"></td>
39
- <td>
40
-
41
- **Navigable API** *(coming soon)*<br>
42
- An extension of Navigable Server for building restful JSON APIs.
43
-
44
35
  </td>
45
36
  </tr>
46
37
  <tr height="140">
47
38
  <td width="130"><img alt="Map" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/map.png"></td>
48
39
  <td>
49
40
 
50
- **Navigable GraphQL** *(coming soon)*<br>
41
+ **[Navigable GraphQL][graphql]** *(coming soon)*<br>
51
42
  An extension of Navigable Server for building GraphQL APIs.
52
43
 
53
44
  </td>
@@ -195,12 +186,6 @@ Or install it yourself as:
195
186
 
196
187
  $ gem install navigable
197
188
 
198
- ## Development
199
-
200
- 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.
201
-
202
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
203
-
204
189
  ## Contributing
205
190
 
206
191
  Bug reports and pull requests are welcome on GitHub at https://github.com/first-try-software/navigable.
@@ -222,4 +207,5 @@ Everyone interacting in the Navigable project's codebases, issue trackers, chat
222
207
  [wiki]: https://github.com/first-try-software/navigable/wiki
223
208
  [navigable]: https://github.com/first-try-software/navigable
224
209
  [router]: https://github.com/first-try-software/navigable-router
225
- [server]: https://github.com/first-try-software/navigable-server
210
+ [server]: https://github.com/first-try-software/navigable-server
211
+ [graphql]: https://github.com/first-try-software/navigable-graphql
@@ -1,5 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
+ require 'concurrent'
3
4
  require 'manufacturable'
4
5
 
5
6
  require 'navigable/version'
@@ -11,25 +11,28 @@ module Navigable
11
11
 
12
12
  def self.extended(base)
13
13
  base.extend(Manufacturable::Item)
14
+ base.extend(ClassMethods)
14
15
  base.include(Observable)
16
+ base.include(InstanceMethods)
17
+ end
15
18
 
16
- base.instance_eval do
17
- def corresponds_to(key)
18
- super(key, TYPE)
19
- end
19
+ module ClassMethods
20
+ def corresponds_to(key)
21
+ super(key, TYPE)
20
22
  end
23
+ end
21
24
 
22
- base.class_eval do
23
- attr_reader :params, :observers
25
+ module InstanceMethods
26
+ attr_reader :params, :observers, :resolver
24
27
 
25
- def inject(params: {}, observers: [])
26
- @params = params
27
- @observers = observers
28
- end
28
+ def inject(params: {}, observers: [], resolver: NullResolver.new)
29
+ @params = params
30
+ @observers = observers
31
+ @resolver = resolver
32
+ end
29
33
 
30
- def execute
31
- raise NotImplementedError.new(EXECUTE_NOT_IMPLEMENTED_MESSAGE)
32
- end
34
+ def execute
35
+ raise NotImplementedError.new(EXECUTE_NOT_IMPLEMENTED_MESSAGE)
33
36
  end
34
37
  end
35
38
  end
@@ -25,7 +25,7 @@ module Navigable
25
25
  end
26
26
 
27
27
  def observers
28
- Manufacturable.build_all(Observer::TYPE, key) { |observer| observer.inject(params: params) }.push(resolver)
28
+ Manufacturable.build_all(Observer::TYPE, key) { |observer| observer.inject(params: params) }
29
29
  end
30
30
 
31
31
  def command
@@ -33,7 +33,7 @@ module Navigable
33
33
  end
34
34
 
35
35
  def build_command
36
- Manufacturable.build_one(Command::TYPE, key) { |command| command.inject(params: params, observers: observers) }
36
+ Manufacturable.build_one(Command::TYPE, key) { |command| command.inject(params: params, observers: observers, resolver: resolver) }
37
37
  end
38
38
  end
39
39
  end
@@ -0,0 +1,9 @@
1
+ # frozen-string-literal: true
2
+
3
+ module Navigable
4
+ class Executor
5
+ def self.execute(&block)
6
+ ENV['CONCURRENT_OBSERVERS'] ? Concurrent.global_io_executor.post(&block) : block.call
7
+ end
8
+ end
9
+ end
@@ -1,39 +1,29 @@
1
1
  # frozen-string-literal: true
2
2
 
3
+ require 'navigable/observer_map'
4
+ require 'navigable/executor'
5
+
3
6
  module Navigable
4
7
  module Observable
5
8
  OBSERVERS_NOT_IMPLEMENTED_MESSAGE = 'Class must implement `observers` method.'
9
+ RESOLVER_NOT_IMPLEMENTED_MESSAGE = 'Class must implement `resolver` method.'
6
10
 
7
11
  def observers
8
12
  raise NotImplementedError.new(OBSERVERS_NOT_IMPLEMENTED_MESSAGE)
9
13
  end
10
14
 
11
- def successfully(*args)
12
- observers.each { |observer| observer.on_success(*args) }
13
- end
14
-
15
- def failed_to_validate(*args)
16
- observers.each { |observer| observer.on_failure_to_validate(*args) }
17
- end
18
-
19
- def failed_to_find(*args)
20
- observers.each { |observer| observer.on_failure_to_find(*args) }
15
+ def resolver
16
+ raise NotImplementedError.new(RESOLVER_NOT_IMPLEMENTED_MESSAGE)
21
17
  end
22
18
 
23
- def failed_to_create(*args)
24
- observers.each { |observer| observer.on_failure_to_create(*args) }
25
- end
26
-
27
- def failed_to_update(*args)
28
- observers.each { |observer| observer.on_failure_to_update(*args) }
29
- end
30
-
31
- def failed_to_delete(*args)
32
- observers.each { |observer| observer.on_failure_to_delete(*args) }
33
- end
19
+ ObserverMap::METHODS.each_pair do |observable_method, observer_method|
20
+ define_method(observable_method) do |*args, **kwargs|
21
+ observers.each do |observer|
22
+ Navigable::Executor.execute { observer.send(observer_method, *args, **kwargs) }
23
+ end
34
24
 
35
- def failed(*args)
36
- observers.each { |observer| observer.on_failure(*args) }
25
+ resolver.send(observer_method, *args, **kwargs)
26
+ end
37
27
  end
38
28
  end
39
29
  end
@@ -8,28 +8,30 @@ module Navigable
8
8
 
9
9
  def self.extended(base)
10
10
  base.extend(Manufacturable::Item)
11
+ base.extend(ClassMethods)
11
12
  base.include(ObserverInterface)
13
+ base.include(InstanceMethods)
14
+ end
12
15
 
13
- base.instance_eval do
14
- def observes_all_commands
15
- corresponds_to_all(TYPE)
16
- end
16
+ module ClassMethods
17
+ def observes_all_commands
18
+ corresponds_to_all(TYPE)
19
+ end
17
20
 
18
- def observes(key)
19
- corresponds_to(key, TYPE)
20
- end
21
+ def observes(key)
22
+ corresponds_to(key, TYPE)
21
23
  end
24
+ end
22
25
 
23
- base.class_eval do
24
- attr_reader :params
26
+ module InstanceMethods
27
+ attr_reader :params
25
28
 
26
- def inject(params: {})
27
- @params = params
28
- end
29
+ def inject(params: {})
30
+ @params = params
31
+ end
29
32
 
30
- def observed_command_key
31
- manufacturable_item_key
32
- end
33
+ def observed_command_key
34
+ manufacturable_item_key
33
35
  end
34
36
  end
35
37
  end
@@ -1,13 +1,11 @@
1
1
  # frozen-string-literal: true
2
2
 
3
+ require 'navigable/observer_map'
4
+
3
5
  module Navigable
4
6
  module ObserverInterface
5
- def on_success(*args, **kwargs); end
6
- def on_failure_to_validate(*args, **kwargs); end
7
- def on_failure_to_find(*args, **kwargs); end
8
- def on_failure_to_create(*args, **kwargs); end
9
- def on_failure_to_update(*args, **kwargs); end
10
- def on_failure_to_delete(*args, **kwargs); end
11
- def on_failure(*args, **kwargs); end
7
+ ObserverMap::METHODS.values.each do |observer_method|
8
+ define_method(observer_method) { |*args, **kwargs| }
9
+ end
12
10
  end
13
11
  end
@@ -0,0 +1,15 @@
1
+ # frozen-string-literal: true
2
+
3
+ module Navigable
4
+ class ObserverMap
5
+ METHODS = {
6
+ successfully: :on_success,
7
+ failed_to_validate: :on_failure_to_validate,
8
+ failed_to_find: :on_failure_to_find,
9
+ failed_to_create: :on_failure_to_create,
10
+ failed_to_update: :on_failure_to_update,
11
+ failed_to_delete: :on_failure_to_delete,
12
+ failed: :on_failure
13
+ }.freeze
14
+ end
15
+ end
@@ -9,22 +9,24 @@ module Navigable
9
9
 
10
10
  def self.extended(base)
11
11
  base.extend(Manufacturable::Item)
12
+ base.extend(ClassMethods)
12
13
  base.include(ObserverInterface)
14
+ base.include(InstanceMethods)
15
+ end
13
16
 
14
- base.instance_eval do
15
- def default_resolver
16
- default_manufacturable(TYPE)
17
- end
17
+ module ClassMethods
18
+ def default_resolver
19
+ default_manufacturable(TYPE)
20
+ end
18
21
 
19
- def resolves(key)
20
- corresponds_to(key, TYPE)
21
- end
22
+ def resolves(key)
23
+ corresponds_to(key, TYPE)
22
24
  end
25
+ end
23
26
 
24
- base.class_eval do
25
- def resolve
26
- raise NotImplementedError.new(RESOLVE_NOT_IMPLEMENTED_MESSAGE)
27
- end
27
+ module InstanceMethods
28
+ def resolve
29
+ raise NotImplementedError.new(RESOLVE_NOT_IMPLEMENTED_MESSAGE)
28
30
  end
29
31
  end
30
32
  end
@@ -1,5 +1,5 @@
1
1
  # frozen-string-literal: true
2
2
 
3
3
  module Navigable
4
- VERSION = "1.3.0"
4
+ VERSION = "1.4.0"
5
5
  end
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ["lib"]
26
26
 
27
+ spec.add_dependency "concurrent-ruby", "~> 1.1.7"
27
28
  spec.add_dependency "manufacturable", "~> 1.5"
28
29
 
29
30
  spec.add_development_dependency "bundler", "~> 2.0"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: navigable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alan Ridlehoover
@@ -9,8 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-09-29 00:00:00.000000000 Z
12
+ date: 2020-10-04 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: concurrent-ruby
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 1.1.7
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 1.1.7
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: manufacturable
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -108,7 +122,6 @@ extra_rdoc_files: []
108
122
  files:
109
123
  - ".gitignore"
110
124
  - ".rspec"
111
- - ".ruby-version"
112
125
  - ".travis.yml"
113
126
  - CODE_OF_CONDUCT.md
114
127
  - Gemfile
@@ -120,10 +133,12 @@ files:
120
133
  - lib/navigable.rb
121
134
  - lib/navigable/command.rb
122
135
  - lib/navigable/dispatcher.rb
136
+ - lib/navigable/executor.rb
123
137
  - lib/navigable/null_resolver.rb
124
138
  - lib/navigable/observable.rb
125
139
  - lib/navigable/observer.rb
126
140
  - lib/navigable/observer_interface.rb
141
+ - lib/navigable/observer_map.rb
127
142
  - lib/navigable/resolver.rb
128
143
  - lib/navigable/version.rb
129
144
  - navigable.gemspec
@@ -1 +0,0 @@
1
- 2.7.1