navigable 0.3.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +9 -1
- data/CODE_OF_CONDUCT.md +2 -1
- data/LICENSE.txt +1 -1
- data/README.md +189 -1
- data/lib/navigable/basic_resolver.rb +24 -0
- data/lib/navigable/command.rb +1 -1
- data/lib/navigable/dispatcher.rb +4 -4
- data/lib/navigable/observer.rb +1 -1
- data/lib/navigable/observer_interface.rb +7 -7
- data/lib/navigable/version.rb +1 -1
- data/navigable.gemspec +11 -11
- metadata +19 -23
- data/assets/navigable.png +0 -0
- data/lib/navigable/null_resolver.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9a68f7f5e2ac4de908f84bdf0ead1bcddf8b07117a05cdf21ce228aad4609fb
|
4
|
+
data.tar.gz: 1031b1dcc22fc53c37d9c2dde8049941e4aca4a9b975d4646242c8bc50dbc880
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 718b7b78861540d93c40df11f422a62fe11fd5c55dc1e007df7c556d4a1105201b177f7b804e775c6f5e0d4e58429b96ac35881b8016cc2aa79cc062c43f5d5e
|
7
|
+
data.tar.gz: 9fe59b3b53a9dcf2653ccd34b1ae15449ebb0af35e6ae12eef9c1637f9e197f7df5a3bbe4f5f3118a185cd79eaf18871ef5d577a296d5979166b13c8d3b5c0b7
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -2,5 +2,13 @@
|
|
2
2
|
language: ruby
|
3
3
|
cache: bundler
|
4
4
|
rvm:
|
5
|
-
- 2.7.
|
5
|
+
- 2.7.1
|
6
6
|
before_install: gem install bundler -v 2.1.4
|
7
|
+
before_script:
|
8
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
9
|
+
- chmod +x ./cc-test-reporter
|
10
|
+
- ./cc-test-reporter before-build
|
11
|
+
script:
|
12
|
+
- bundle exec rspec
|
13
|
+
after_script:
|
14
|
+
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
data/CODE_OF_CONDUCT.md
CHANGED
@@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
|
|
55
55
|
## Enforcement
|
56
56
|
|
57
57
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
58
|
-
reported by contacting the project team at
|
58
|
+
reported by contacting the project team at [navigable@firsttry.software][mail]. All
|
59
59
|
complaints will be reviewed and investigated and will result in a response that
|
60
60
|
is deemed necessary and appropriate to the circumstances. The project team is
|
61
61
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
@@ -72,3 +72,4 @@ available at [https://contributor-covenant.org/version/1/4][version]
|
|
72
72
|
|
73
73
|
[homepage]: https://contributor-covenant.org
|
74
74
|
[version]: https://contributor-covenant.org/version/1/4/
|
75
|
+
[mail]: mailto:navigable@firsttry.software
|
data/LICENSE.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
|
-
Copyright (c) 2020 Alan Ridlehoover
|
3
|
+
Copyright (c) 2020 Alan Ridlehoover and Fito von Zastrow
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -1,7 +1,184 @@
|
|
1
|
-
<img src="assets/
|
1
|
+
<a target="top" href="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/navigable.png"><img alt="Navigable" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/header.png"></a>
|
2
2
|
|
3
3
|
# Navigable
|
4
4
|
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/navigable.svg)](https://badge.fury.io/rb/navigable) [![Build Status](https://travis-ci.org/first-try-software/navigable.svg?branch=main)](https://travis-ci.org/first-try-software/navigable) [![Maintainability](https://api.codeclimate.com/v1/badges/33ca28cb17e1b512e006/maintainability)](https://codeclimate.com/github/first-try-software/navigable/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/33ca28cb17e1b512e006/test_coverage)](https://codeclimate.com/github/first-try-software/navigable/test_coverage)
|
6
|
+
|
7
|
+
Navigable is a family of gems that together provide all the tools you need to build fast, testable, and reliable JSON and/or GraphQL based APIs with isolated, composable business logic. The gems include:
|
8
|
+
|
9
|
+
<table style="margin: 20px 0">
|
10
|
+
<tr height="140">
|
11
|
+
<td width="130"><img alt="Clipper Ship" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/clipper.png"></td>
|
12
|
+
<td>
|
13
|
+
|
14
|
+
**[Navigable][navigable]**<br>
|
15
|
+
A stand-alone tool for isolating business logic from external interfaces and cross-cutting concerns. Navigable composes self-configured command and observer objects to allow you to extend your business logic without modifying it. Navigable is compatible with any Ruby-based application development framework, including Rails, Hanami, and Sinatra.
|
16
|
+
|
17
|
+
</td>
|
18
|
+
</tr>
|
19
|
+
<tr height="140">
|
20
|
+
<td width="130"><img alt="Compass" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/sextant.png"></td>
|
21
|
+
<td>
|
22
|
+
|
23
|
+
**[Navigable Router][router]** *(coming soon)*<br>
|
24
|
+
A simple, highly-performant, Rack-based router.
|
25
|
+
|
26
|
+
</td>
|
27
|
+
</tr>
|
28
|
+
<tr height="140">
|
29
|
+
<td width="130"><img alt="Compass" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/compass.png"></td>
|
30
|
+
<td>
|
31
|
+
|
32
|
+
**[Navigable Server][server]** *(coming soon)*<br>
|
33
|
+
A Rack-based server for building Ruby and Navigable web applications.
|
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
|
+
</td>
|
45
|
+
</tr>
|
46
|
+
<tr height="140">
|
47
|
+
<td width="130"><img alt="Map" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/map.png"></td>
|
48
|
+
<td>
|
49
|
+
|
50
|
+
**Navigable GraphQL** *(coming soon)*<br>
|
51
|
+
An extension of Navigable Server for building GraphQL APIs.
|
52
|
+
|
53
|
+
</td>
|
54
|
+
</tr>
|
55
|
+
</table>
|
56
|
+
|
57
|
+
<br><br>
|
58
|
+
|
59
|
+
<img style="width: 600px; display: block; margin: 0 auto;" alt="Lighthouse" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/lighthouse.png">
|
60
|
+
|
61
|
+
# The Navigable Charter
|
62
|
+
|
63
|
+
We hold these truths to be self-evident, that not all objects are created equal, that poorly structured code leads to poorly tested code, and that poorly tested code leads to rigid software and fearful engineers.
|
64
|
+
|
65
|
+
We believe a framework should break free of this tyranny. It should be simple, testable, and fast. It can be opinionated. But, it should leverage SOLID principles to guide us toward well structured, well tested, maleable code that is truly navigable.
|
66
|
+
|
67
|
+
## Who We Are
|
68
|
+
|
69
|
+
We are professional Rubyists. We could write software in any language, but we choose to work in Ruby because it is so beautiful and expressive. We love Ruby.
|
70
|
+
|
71
|
+
We are test-oriented developers. We always write tests for our code, often before we've written the code. And, despite the conventional wisdom that investing in tests produces diminishing returns as you approach 100% coverage, we prefer the confidence we get with full coverage.
|
72
|
+
|
73
|
+
We are also students of software architecture. We apply SOLID object-oriented design principles like the [Single Responsibility][srp] and [Open/Closed][ocp] Principles to everything we build. And, we follow [Sandi Metz's Rules][sandi] as much as possible. This leads us to write small, loosely coupled, highly cohesive classes.
|
74
|
+
|
75
|
+
## Why We Wrote Navigable
|
76
|
+
|
77
|
+
Besides being Rubyists, we are also seasoned Rails developers. Most of our experience with Ruby has involved Rails. We've also built applications in Sinatra, and dabbled with Hanami. And, while they all have strengths, we're not completely satisfied with any of them.
|
78
|
+
|
79
|
+
### Rails
|
80
|
+
|
81
|
+
In our experience, Rails is a fantastic tool for building complex web applications. But, too often, we see engineers let Rails constrain them into thinking that all of their business logic belongs in models (and controllers, and even views!). This leads to overly complex classes with too many responsibilities that are difficult to test. It also reduces the reusability of any one bit of business logic to have it burried in a 5,000 line file. (Yes, we've seen 5,000 line models and controllers, and much worse!) Rails is also a bit of a large toolbox when all you want to do is build a JSON and/or GraphQL API.
|
82
|
+
|
83
|
+
### Hanami
|
84
|
+
|
85
|
+
In dabbling with Hanami, we feel it has a great deal of promise. As proponents of [Domain Driven Design][ddd], we agree with many of the decisions that went into the framework. But, given that it uses convention as much as Rails, and given the lack of a dedicated home for business logic, we worry that Hanami applications will fall prey to the same problem many large Rails apps face: bloated models/entities and controller actions.
|
86
|
+
|
87
|
+
### Sinatra
|
88
|
+
|
89
|
+
In our experience, Sinatra is a great tool for small, simple applications. But, it's too slow to be of much use with larger, enterprise applications. So, we've limited our use to very specific types of applications with limited scope.
|
90
|
+
|
91
|
+
### And, finally...
|
92
|
+
|
93
|
+
All three of these frameworks take a central role in the organization of an application. We've worked on Rails applications in multiple different domains. They all looked like Rails applications. You had to dig into them to discover the core concepts of each specific domain. We believe software should be more reflective of the problem space than it is of the framework used to solve the problem.
|
94
|
+
|
95
|
+
## How is Navigable Different?
|
96
|
+
|
97
|
+
So, we built Navigable to help separate the web adapter (controller) and persistence layer (model) from your actual business logic. And, we did it in a composable manner that allows for incredible flexibility. Here's a peek:
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
class CreateAlert
|
101
|
+
extend Navigable::Command
|
102
|
+
|
103
|
+
corresponds_to :create_alert
|
104
|
+
corresponds_to :create_alert_with_notifications
|
105
|
+
|
106
|
+
def execute
|
107
|
+
return failed_to_validate(new_alert) unless new_alert.valid?
|
108
|
+
return failed_to_create(new_alert) unless created_alert.persisted?
|
109
|
+
|
110
|
+
successfully created_alert
|
111
|
+
end
|
112
|
+
|
113
|
+
# ...
|
114
|
+
end
|
115
|
+
|
116
|
+
class AllRecipientsNotifier
|
117
|
+
extend Navigable::Observer
|
118
|
+
|
119
|
+
observes :create_alert_with_notifications
|
120
|
+
|
121
|
+
def on_success(alert)
|
122
|
+
NotifyAllRecipientsWorker.perform_async(alert_id: alert.id)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
```
|
126
|
+
|
127
|
+
In these two classes, Navigable enables you to execute multiple use cases. You can create an alert:
|
128
|
+
|
129
|
+
```ruby
|
130
|
+
Navigable::Dispatcher.dispatch(:create_alert, params: alert_params)
|
131
|
+
```
|
132
|
+
|
133
|
+
Or, create an alert and notify all recipients:
|
134
|
+
|
135
|
+
```ruby
|
136
|
+
Navigable::Dispatcher.dispatch(:create_alert_with_notifications, params: alert_params)
|
137
|
+
```
|
138
|
+
|
139
|
+
All without having to add conditional logic about the notifications to the `CreateAlert` class.
|
140
|
+
|
141
|
+
Similarly, you can add cross-cutting concerns to an application just as easily:
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
class Monitor
|
145
|
+
extend Navigable::Observer
|
146
|
+
|
147
|
+
observes_all_commands
|
148
|
+
|
149
|
+
def on_success(*args)
|
150
|
+
increment_counter(observed_command_key, :success)
|
151
|
+
end
|
152
|
+
|
153
|
+
def on_failed_to_validate(*args)
|
154
|
+
increment_counter(observed_command_key, :failed_to_validate)
|
155
|
+
end
|
156
|
+
|
157
|
+
def on_failed_to_create(*args)
|
158
|
+
increment_counter(observed_command_key, :failed_to_create)
|
159
|
+
end
|
160
|
+
|
161
|
+
# ...
|
162
|
+
end
|
163
|
+
```
|
164
|
+
Here are a few things to look for in the code above:
|
165
|
+
|
166
|
+
* The DSL in the `execute` method of the `CreateAlert` class is built into Navigable. Methods like `successfully` tell Navigable the results of the command so that it can notify the observers.
|
167
|
+
|
168
|
+
* The two `corresponds_to` statements in `CreateAlert` tell Navigable to execute that command when either key is dispatched. You can register a command under as many different keys as you need.
|
169
|
+
|
170
|
+
* The single `observes` statement in `AllRecipientsNotifier` class tells Navigable to send a message to that class only when the `:create_alert_with_notifications` key is dispatched. One observer can observe as many commands as you need. And, many observers can observe the same command.
|
171
|
+
|
172
|
+
* Use the `observes_all_commands` statement (as shown in the `Monitor` class) for cross-cutting concerns. It tells Navigable to send messages to the observer no matter which command was executed.
|
173
|
+
|
174
|
+
For a deeper look at the core concepts introduced by Navigable, please have a look at our [wiki][wiki].
|
175
|
+
|
176
|
+
## Feedback
|
177
|
+
|
178
|
+
We are really excited about Navigable! We think it solves the problem of seperating business logic from the web interface, persistence layer, and even cross-cutting concerns in an elegant and simple way.
|
179
|
+
|
180
|
+
We're thrilled you're checking out Navigable! If you have any questions or comments, please feel free to reach out to [navigable@firsttry.software][mail].
|
181
|
+
|
5
182
|
## Installation
|
6
183
|
|
7
184
|
Add this line to your application's Gemfile:
|
@@ -35,3 +212,14 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
35
212
|
## Code of Conduct
|
36
213
|
|
37
214
|
Everyone interacting in the Navigable project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/first-try-software/navigable/blob/main/CODE_OF_CONDUCT.md).
|
215
|
+
|
216
|
+
|
217
|
+
[sandi]: https://thoughtbot.com/blog/sandi-metz-rules-for-developers
|
218
|
+
[srp]: https://en.wikipedia.org/wiki/Single-responsibility_principle
|
219
|
+
[ocp]: https://en.wikipedia.org/wiki/Open–closed_principle
|
220
|
+
[ddd]: https://en.wikipedia.org/wiki/Domain-driven_design
|
221
|
+
[mail]: mailto:navigable@firsttry.software
|
222
|
+
[wiki]: https://github.com/first-try-software/navigable/wiki
|
223
|
+
[navigable]: https://github.com/first-try-software/navigable
|
224
|
+
[router]: https://github.com/first-try-software/navigable-router
|
225
|
+
[server]: https://github.com/first-try-software/navigable-server
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
require 'navigable/resolver'
|
4
|
+
|
5
|
+
module Navigable
|
6
|
+
class BasicResolver
|
7
|
+
extend Navigable::Resolver
|
8
|
+
|
9
|
+
def resolve
|
10
|
+
@result
|
11
|
+
end
|
12
|
+
|
13
|
+
def on_success(result)
|
14
|
+
@result = result
|
15
|
+
end
|
16
|
+
|
17
|
+
alias_method :on_failure_to_validate, :on_success
|
18
|
+
alias_method :on_failure_to_find, :on_success
|
19
|
+
alias_method :on_failure_to_create, :on_success
|
20
|
+
alias_method :on_failure_to_update, :on_success
|
21
|
+
alias_method :on_failure_to_delete, :on_success
|
22
|
+
alias_method :on_failure, :on_success
|
23
|
+
end
|
24
|
+
end
|
data/lib/navigable/command.rb
CHANGED
data/lib/navigable/dispatcher.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
require 'navigable/
|
3
|
+
require 'navigable/basic_resolver'
|
4
4
|
require 'navigable/observer'
|
5
5
|
require 'navigable/command'
|
6
6
|
|
7
7
|
module Navigable
|
8
8
|
class Dispatcher
|
9
|
-
def self.dispatch(key, params: {}, resolver:
|
9
|
+
def self.dispatch(key, params: {}, resolver: BasicResolver.new)
|
10
10
|
self.new(key, params: params, resolver: resolver).dispatch
|
11
11
|
end
|
12
12
|
|
@@ -25,11 +25,11 @@ module Navigable
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def observers
|
28
|
-
Manufacturable.build_all(Observer::TYPE, key
|
28
|
+
Manufacturable.build_all(Observer::TYPE, key) { |observer| observer.inject(params: params) }.push(resolver)
|
29
29
|
end
|
30
30
|
|
31
31
|
def command
|
32
|
-
Manufacturable.build_one(Command::TYPE, key
|
32
|
+
Manufacturable.build_one(Command::TYPE, key) { |command| command.inject(params: params, observers: observers) }
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
data/lib/navigable/observer.rb
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
module Navigable
|
4
4
|
module ObserverInterface
|
5
|
-
def on_success(*args); end
|
6
|
-
def on_failure_to_validate(*args); end
|
7
|
-
def on_failure_to_find(*args); end
|
8
|
-
def on_failure_to_create(*args); end
|
9
|
-
def on_failure_to_update(*args); end
|
10
|
-
def on_failure_to_delete(*args); end
|
11
|
-
def on_failure(*args); end
|
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
|
12
12
|
end
|
13
13
|
end
|
data/lib/navigable/version.rb
CHANGED
data/navigable.gemspec
CHANGED
@@ -5,30 +5,30 @@ Gem::Specification.new do |spec|
|
|
5
5
|
spec.version = Navigable::VERSION
|
6
6
|
spec.platform = Gem::Platform::RUBY
|
7
7
|
spec.authors = ["Alan Ridlehoover", "Fito von Zastrow"]
|
8
|
-
spec.email = ["
|
8
|
+
spec.email = ["navigable@firsttry.software"]
|
9
9
|
|
10
|
-
spec.summary = %q{Ahoy!
|
11
|
-
spec.description = %q{
|
12
|
-
spec.homepage = "https://
|
10
|
+
spec.summary = %q{Ahoy! Welcome aboard Navigable!}
|
11
|
+
spec.description = %q{A stand-alone tool for isolating business logic from external interfaces and cross-cutting concerns. Navigable composes self-configured command and observer objects to allow you to extend your business logic without modifying it. Navigable is compatible with any Ruby-based application development framework, including Rails, Hanami, and Sinatra.}
|
12
|
+
spec.homepage = "https://firsttry.software"
|
13
13
|
spec.license = "MIT"
|
14
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
14
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
15
15
|
|
16
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
-
spec.metadata["source_code_uri"] = "https://github.com/
|
18
|
-
spec.metadata["bug_tracker_uri"] = "https://github.com/
|
17
|
+
spec.metadata["source_code_uri"] = "https://github.com/first-try-software/navigable"
|
18
|
+
spec.metadata["bug_tracker_uri"] = "https://github.com/first-try-software/navigable/issues"
|
19
19
|
|
20
20
|
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
|
21
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|assets)/}) }
|
22
22
|
end
|
23
23
|
spec.bindir = "exe"
|
24
24
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
|
-
spec.require_paths = ["lib"
|
25
|
+
spec.require_paths = ["lib"]
|
26
26
|
|
27
|
-
spec.add_dependency "manufacturable", "~> 1.
|
27
|
+
spec.add_dependency "manufacturable", "~> 1.5"
|
28
28
|
|
29
29
|
spec.add_development_dependency "bundler", "~> 2.0"
|
30
30
|
spec.add_development_dependency "rake", "~> 12.0"
|
31
31
|
spec.add_development_dependency "rspec", "~> 3.0"
|
32
32
|
spec.add_development_dependency "rspec_junit_formatter", "~>0.4"
|
33
|
-
spec.add_development_dependency "simplecov", "~>0.
|
33
|
+
spec.add_development_dependency "simplecov", "~>0.17.0"
|
34
34
|
end
|
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:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alan Ridlehoover
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-09-
|
12
|
+
date: 2020-09-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: manufacturable
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '1.
|
20
|
+
version: '1.5'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '1.
|
27
|
+
version: '1.5'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: bundler
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,23 +87,21 @@ dependencies:
|
|
87
87
|
requirements:
|
88
88
|
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version:
|
90
|
+
version: 0.17.0
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
98
|
-
description:
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
structured, well tested, maleable code that is truly navigable.
|
97
|
+
version: 0.17.0
|
98
|
+
description: A stand-alone tool for isolating business logic from external interfaces
|
99
|
+
and cross-cutting concerns. Navigable composes self-configured command and observer
|
100
|
+
objects to allow you to extend your business logic without modifying it. Navigable
|
101
|
+
is compatible with any Ruby-based application development framework, including Rails,
|
102
|
+
Hanami, and Sinatra.
|
104
103
|
email:
|
105
|
-
-
|
106
|
-
- adolfovon@gmail.com
|
104
|
+
- navigable@firsttry.software
|
107
105
|
executables: []
|
108
106
|
extensions: []
|
109
107
|
extra_rdoc_files: []
|
@@ -117,36 +115,34 @@ files:
|
|
117
115
|
- LICENSE.txt
|
118
116
|
- README.md
|
119
117
|
- Rakefile
|
120
|
-
- assets/navigable.png
|
121
118
|
- bin/console
|
122
119
|
- bin/setup
|
123
120
|
- lib/navigable.rb
|
121
|
+
- lib/navigable/basic_resolver.rb
|
124
122
|
- lib/navigable/command.rb
|
125
123
|
- lib/navigable/dispatcher.rb
|
126
|
-
- lib/navigable/null_resolver.rb
|
127
124
|
- lib/navigable/observable.rb
|
128
125
|
- lib/navigable/observer.rb
|
129
126
|
- lib/navigable/observer_interface.rb
|
130
127
|
- lib/navigable/resolver.rb
|
131
128
|
- lib/navigable/version.rb
|
132
129
|
- navigable.gemspec
|
133
|
-
homepage: https://
|
130
|
+
homepage: https://firsttry.software
|
134
131
|
licenses:
|
135
132
|
- MIT
|
136
133
|
metadata:
|
137
|
-
homepage_uri: https://
|
138
|
-
source_code_uri: https://github.com/
|
139
|
-
bug_tracker_uri: https://github.com/
|
134
|
+
homepage_uri: https://firsttry.software
|
135
|
+
source_code_uri: https://github.com/first-try-software/navigable
|
136
|
+
bug_tracker_uri: https://github.com/first-try-software/navigable/issues
|
140
137
|
post_install_message:
|
141
138
|
rdoc_options: []
|
142
139
|
require_paths:
|
143
140
|
- lib
|
144
|
-
- assets
|
145
141
|
required_ruby_version: !ruby/object:Gem::Requirement
|
146
142
|
requirements:
|
147
143
|
- - ">="
|
148
144
|
- !ruby/object:Gem::Version
|
149
|
-
version: 2.
|
145
|
+
version: 2.3.0
|
150
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
147
|
requirements:
|
152
148
|
- - ">="
|
@@ -156,5 +152,5 @@ requirements: []
|
|
156
152
|
rubygems_version: 3.1.2
|
157
153
|
signing_key:
|
158
154
|
specification_version: 4
|
159
|
-
summary: Ahoy!
|
155
|
+
summary: Ahoy! Welcome aboard Navigable!
|
160
156
|
test_files: []
|
data/assets/navigable.png
DELETED
Binary file
|