navigable 0.3.1 → 1.2.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: d1a6a151995a3fc11306a19e5aa456017782233ad8b2ca399938e68228a21a8e
4
- data.tar.gz: 0ebc72581760f1227772e55327796a68b9496997321db0d9c5de69ef0e418bee
3
+ metadata.gz: 520f70790477a269841be1b936c03978f41335ea88c69150dbca17396fbe4e7c
4
+ data.tar.gz: ee4181d29ac606c64f961fdcc627ca7e7ffda72871e78c3bac57fdc5bea72ac5
5
5
  SHA512:
6
- metadata.gz: 910da8ec34c9f5679eed5e6ad2e1fb51040b483ab17d1b8202c8ded1f4dff7e180aa5c36985fd236824760eef045fca66a3310db52d2fddd9092d23114565e35
7
- data.tar.gz: 17dbf68108f529820220c6017fbb5ce574a0525534a5b9bde7bf3534ac2a097396f83d5ae1837d6240d37a928c338df6f38fe71cdad4815c9b32c90f8244ac73
6
+ metadata.gz: b1de4110a432e1f1a4f7736ca02f0c53db9f4ea73fb42f3964b3f706c37f361dbd8c03f754e66862f8dcbee75f99776a4915000c6d69c0153b068290404bf950
7
+ data.tar.gz: b9ddbc9bd4a5ce9f4d67de84c74789ecf76c9040bce0f695bf3e1403f98308e7cbf28ce8d76bd573b4b167c67d670928d527b6743c572ea42fb138e51effffa8
data/.gitignore CHANGED
@@ -13,5 +13,6 @@
13
13
  # rspec failure tracking
14
14
  .rspec_status
15
15
 
16
+ .DS_Store
16
17
  Gemfile.lock
17
18
 
@@ -2,5 +2,13 @@
2
2
  language: ruby
3
3
  cache: bundler
4
4
  rvm:
5
- - 2.7.0
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
@@ -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 navigable@firsttry.software. All
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
@@ -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/navigable.png">
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
@@ -4,6 +4,8 @@ require 'navigable/observable'
4
4
 
5
5
  module Navigable
6
6
  module Command
7
+ class NotFoundError < StandardError; end
8
+
7
9
  TYPE = :__command__
8
10
  EXECUTE_NOT_IMPLEMENTED_MESSAGE = 'Class must implement `execute` method.'
9
11
 
@@ -20,7 +22,7 @@ module Navigable
20
22
  base.class_eval do
21
23
  attr_reader :params, :observers
22
24
 
23
- def initialize(params: {}, observers: [])
25
+ def inject(params: {}, observers: [])
24
26
  @params = params
25
27
  @observers = observers
26
28
  end
@@ -1,12 +1,12 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- require 'navigable/null_resolver'
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: NullResolver.new)
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,15 @@ module Navigable
25
25
  end
26
26
 
27
27
  def observers
28
- Manufacturable.build_all(Observer::TYPE, key, params: params).push(resolver)
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, params: params, observers: observers)
32
+ build_command.tap { |command| raise Navigable::Command::NotFoundError unless command }
33
+ end
34
+
35
+ def build_command
36
+ Manufacturable.build_one(Command::TYPE, key) { |command| command.inject(params: params, observers: observers) }
33
37
  end
34
38
  end
35
39
  end
@@ -23,7 +23,7 @@ module Navigable
23
23
  base.class_eval do
24
24
  attr_reader :params
25
25
 
26
- def initialize(params: {})
26
+ def inject(params: {})
27
27
  @params = params
28
28
  end
29
29
 
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen-string-literal: true
2
2
 
3
3
  module Navigable
4
- VERSION = "0.3.1"
4
+ VERSION = "1.2.0"
5
5
  end
@@ -7,28 +7,28 @@ Gem::Specification.new do |spec|
7
7
  spec.authors = ["Alan Ridlehoover", "Fito von Zastrow"]
8
8
  spec.email = ["navigable@firsttry.software"]
9
9
 
10
- spec.summary = %q{Ahoy! Navigable will get you there!}
11
- spec.description = %q{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. 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.}
12
- spec.homepage = "https://github.com/first-try-software/navigable"
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.7.0")
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
15
15
 
16
16
  spec.metadata["homepage_uri"] = spec.homepage
17
17
  spec.metadata["source_code_uri"] = "https://github.com/first-try-software/navigable"
18
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", "assets"]
25
+ spec.require_paths = ["lib"]
26
26
 
27
- spec.add_dependency "manufacturable", "~> 1.4"
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.16"
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: 0.3.1
4
+ version: 1.2.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 00:00:00.000000000 Z
12
+ date: 2020-09-25 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.4'
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.4'
27
+ version: '1.5'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: bundler
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -87,20 +87,19 @@ dependencies:
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '0.16'
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: '0.16'
98
- description: We hold these truths to be self-evident, that not all objects are created
99
- equal, that poorly structured code leads to poorly tested code, and that poorly
100
- tested code leads to rigid software and fearful engineers. We believe a framework
101
- should break free of this tyranny. It should be simple, testable, and fast. It can
102
- be opinionated. But, it should leverage SOLID principles to guide us toward well
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
104
  - navigable@firsttry.software
106
105
  executables: []
@@ -116,36 +115,34 @@ files:
116
115
  - LICENSE.txt
117
116
  - README.md
118
117
  - Rakefile
119
- - assets/navigable.png
120
118
  - bin/console
121
119
  - bin/setup
122
120
  - lib/navigable.rb
121
+ - lib/navigable/basic_resolver.rb
123
122
  - lib/navigable/command.rb
124
123
  - lib/navigable/dispatcher.rb
125
- - lib/navigable/null_resolver.rb
126
124
  - lib/navigable/observable.rb
127
125
  - lib/navigable/observer.rb
128
126
  - lib/navigable/observer_interface.rb
129
127
  - lib/navigable/resolver.rb
130
128
  - lib/navigable/version.rb
131
129
  - navigable.gemspec
132
- homepage: https://github.com/first-try-software/navigable
130
+ homepage: https://firsttry.software
133
131
  licenses:
134
132
  - MIT
135
133
  metadata:
136
- homepage_uri: https://github.com/first-try-software/navigable
134
+ homepage_uri: https://firsttry.software
137
135
  source_code_uri: https://github.com/first-try-software/navigable
138
136
  bug_tracker_uri: https://github.com/first-try-software/navigable/issues
139
137
  post_install_message:
140
138
  rdoc_options: []
141
139
  require_paths:
142
140
  - lib
143
- - assets
144
141
  required_ruby_version: !ruby/object:Gem::Requirement
145
142
  requirements:
146
143
  - - ">="
147
144
  - !ruby/object:Gem::Version
148
- version: 2.7.0
145
+ version: 2.3.0
149
146
  required_rubygems_version: !ruby/object:Gem::Requirement
150
147
  requirements:
151
148
  - - ">="
@@ -155,5 +152,5 @@ requirements: []
155
152
  rubygems_version: 3.1.2
156
153
  signing_key:
157
154
  specification_version: 4
158
- summary: Ahoy! Navigable will get you there!
155
+ summary: Ahoy! Welcome aboard Navigable!
159
156
  test_files: []
Binary file
@@ -1,11 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- require 'navigable/resolver'
4
-
5
- module Navigable
6
- class NullResolver
7
- extend Resolver
8
-
9
- def resolve; end
10
- end
11
- end