navigable 1.3.0 → 1.4.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,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