navigable-server 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 44a577b55032e77007e967d1468b58f6acec275bcaa20ec03dd4643abf8184b5
4
+ data.tar.gz: 98bc33d54dc4811f4d16989ff3021b3f06dc3c1e4f641575b394b88c5dfc448b
5
+ SHA512:
6
+ metadata.gz: a1824a664888c326e0ecce71c8665a57a4263753008acd98df91992c4e2d7908294fb127c42da5f4d22746b9cc91af1423f5b2ae375bc680e60d70e6a7952214
7
+ data.tar.gz: c7b463b914a0ed25c67f3158f857767d5d8125b0fcad5dbf32b61362833bd220c65aecbc04ede52f3d180ed3e95f2d65cf2aec6c7d45599804a993869068f8bd
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+
13
+ Gemfile.lock
14
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,14 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 2.7.1
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
@@ -0,0 +1,74 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age, body
8
+ size, disability, ethnicity, gender identity and expression, level of experience,
9
+ nationality, personal appearance, race, religion, or sexual identity and
10
+ orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an appointed
52
+ representative at an online or offline event. Representation of a project may be
53
+ further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at navigable@firsttry.software. All
59
+ complaints will be reviewed and investigated and will result in a response that
60
+ is deemed necessary and appropriate to the circumstances. The project team is
61
+ obligated to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at [https://contributor-covenant.org/version/1/4][version]
72
+
73
+ [homepage]: https://contributor-covenant.org
74
+ [version]: https://contributor-covenant.org/version/1/4/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Alan Ridlehoover
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,98 @@
1
+ # Navigable::Server
2
+
3
+ [![Build Status](https://travis-ci.org/first-try-software/navigable-server.svg?branch=main)](https://travis-ci.org/first-try-software/navigable-server) [![Maintainability](https://api.codeclimate.com/v1/badges/e62e187bb05abe883169/maintainability)](https://codeclimate.com/github/first-try-software/navigable-server/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/e62e187bb05abe883169/test_coverage)](https://codeclimate.com/github/first-try-software/navigable-server/test_coverage)
4
+
5
+ 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:
6
+
7
+ <table style="margin: 20px 0">
8
+ <tr height="140">
9
+ <td width="130"><img alt="Clipper Ship" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/clipper.png"></td>
10
+ <td>
11
+
12
+ **[Navigable][navigable]**<br>
13
+ 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.
14
+
15
+ </td>
16
+ </tr>
17
+ <tr height="140">
18
+ <td width="130"><img alt="Compass" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/sextant.png"></td>
19
+ <td>
20
+
21
+ **[Navigable Router][router]** *(coming soon)*<br>
22
+ A simple, highly-performant, Rack-based router.
23
+
24
+ </td>
25
+ </tr>
26
+ <tr height="140">
27
+ <td width="130"><img alt="Compass" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/compass.png"></td>
28
+ <td>
29
+
30
+ **[Navigable Server][server]** *(coming soon)*<br>
31
+ A Rack-based server for building Ruby and Navigable web applications.
32
+
33
+ </td>
34
+ </tr>
35
+ <tr height="140">
36
+ <td width="130"><img alt="Telescope" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/telescope.png"></td>
37
+ <td>
38
+
39
+ **Navigable API** *(coming soon)*<br>
40
+ An extension of Navigable Server for building restful JSON APIs.
41
+
42
+ </td>
43
+ </tr>
44
+ <tr height="140">
45
+ <td width="130"><img alt="Map" src="https://raw.githubusercontent.com/first-try-software/navigable/main/assets/map.png"></td>
46
+ <td>
47
+
48
+ **Navigable GraphQL** *(coming soon)*<br>
49
+ An extension of Navigable Server for building GraphQL APIs.
50
+
51
+ </td>
52
+ </tr>
53
+ </table>
54
+
55
+ <br><br>
56
+
57
+ ## Installation
58
+
59
+ Add this line to your application's Gemfile:
60
+
61
+ ```ruby
62
+ gem 'navigable-server'
63
+ ```
64
+
65
+ And then execute:
66
+
67
+ $ bundle install
68
+
69
+ Or install it yourself as:
70
+
71
+ $ gem install navigable-server
72
+
73
+ ## Usage
74
+
75
+ TODO: Write usage instructions here
76
+
77
+ ## Development
78
+
79
+ 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.
80
+
81
+ 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).
82
+
83
+ ## Contributing
84
+
85
+ Bug reports and pull requests are welcome on GitHub at https://github.com/first-try-software/navigable-server. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/first-try-software/navigable-server/blob/master/CODE_OF_CONDUCT.md).
86
+
87
+
88
+ ## License
89
+
90
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
91
+
92
+ ## Code of Conduct
93
+
94
+ Everyone interacting in the Navigable::Server 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-server/blob/master/CODE_OF_CONDUCT.md).
95
+
96
+ [navigable]: https://github.com/first-try-software/navigable
97
+ [router]: https://github.com/first-try-software/navigable-router
98
+ [server]: https://github.com/first-try-software/navigable-server
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "navigable/server"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'navigable/router'
4
+ require 'json'
5
+ require 'navigable'
6
+ require 'rack'
7
+ require 'rack/accept_media_types'
8
+ require 'rack/abstract_format'
9
+ require 'rack/bodyparser'
10
+
11
+ require 'navigable/server'
12
+ require 'navigable/server/version'
13
+ require 'navigable/server/request'
14
+ require 'navigable/server/response'
15
+ require 'navigable/server/rack_adapter'
16
+ require 'navigable/server/router'
17
+ require 'navigable/server/endpoint'
18
+
19
+ module Navigable
20
+ module Server
21
+ BODY_PARSERS = {
22
+ 'application/json' => proc { |data| JSON.parse(data) }
23
+ }.freeze
24
+
25
+ def self.rack_app
26
+ @server ||= Rack::Builder.new(Server.router) do
27
+ use Rack::BodyParser, :parsers => BODY_PARSERS
28
+ use Rack::AbstractFormat
29
+ end
30
+ end
31
+
32
+ def self.add_endpoint(**kwargs)
33
+ router.add_endpoint(**kwargs)
34
+ end
35
+
36
+ def self.router
37
+ @router ||= Router.new
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Navigable
4
+ module Server
5
+ module Endpoint
6
+ EXECUTE_NOT_IMPLEMENTED_MESSAGE = 'Class must implement `execute` method.'
7
+
8
+ def self.extended(base)
9
+ base.instance_eval do
10
+ def responds_to(verb, path)
11
+ Navigable::Server.add_endpoint(verb: verb, path: path, endpoint_class: self)
12
+ end
13
+ end
14
+
15
+ base.class_eval do
16
+ attr_reader :request
17
+
18
+ def inject(request: Request.new)
19
+ @request = request
20
+ end
21
+
22
+ def execute
23
+ raise NotImplementedError.new(EXECUTE_NOT_IMPLEMENTED_MESSAGE)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Navigable
4
+ module Server
5
+ class RackAdapter
6
+ attr_reader :endpoint_class
7
+
8
+ def initialize(endpoint_class:)
9
+ @endpoint_class = endpoint_class
10
+ end
11
+
12
+ def call(env)
13
+ Response.new(endpoint(request(env)).execute).to_rack_response
14
+ end
15
+
16
+ private
17
+
18
+ def request(env)
19
+ Request.new(env)
20
+ end
21
+
22
+ def endpoint(request)
23
+ endpoint_class.new.tap { |endpoint| endpoint.inject(request: request) }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Navigable
4
+ module Server
5
+ class Request
6
+ PARSED_BODY = 'parsed_body'
7
+ ROUTER_PARAMS = 'router.params'
8
+
9
+ attr_reader :env
10
+
11
+ def initialize(env = nil)
12
+ @env = env
13
+ end
14
+
15
+ def headers
16
+ @headers ||= env ? {
17
+ accept_media_types: accept_media_types,
18
+ preferred_media_type: preferred_media_type
19
+ } : {}
20
+ end
21
+
22
+ def params
23
+ @params ||= env ? form_params.merge!(body_params).merge!(url_params) : {}
24
+ end
25
+
26
+ private
27
+
28
+ def accept_media_types
29
+ @accept_media_types ||= rack_request.accept_media_types
30
+ end
31
+
32
+ def preferred_media_type
33
+ accept_media_types.first
34
+ end
35
+
36
+ def form_params
37
+ symbolize_keys(rack_request.params || {})
38
+ end
39
+
40
+ def body_params
41
+ symbolize_keys(env[PARSED_BODY] || {})
42
+ end
43
+
44
+ def url_params
45
+ env[ROUTER_PARAMS] || {}
46
+ end
47
+
48
+ def symbolize_keys(hash)
49
+ hash.each_with_object({}) { |(key, value), obj| obj[key.to_sym] = value }
50
+ end
51
+
52
+ def rack_request
53
+ @rack_request ||= Rack::Request.new(env)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Navigable
4
+ module Server
5
+ class Response
6
+ CONTENT_TYPE = 'Content-Type'
7
+ MIME_TYPE_JSON = 'application/json'
8
+ MIME_TYPE_HTML = 'text/html'
9
+ MIME_TYPE_TEXT = 'text/plain'
10
+ EMPTY_CONTENT = ''
11
+
12
+ attr_reader :params, :status
13
+
14
+ def initialize(params)
15
+ @params = params
16
+ @status = params[:status] || 200
17
+ end
18
+
19
+ def to_rack_response
20
+ [status, headers, content]
21
+ end
22
+
23
+ private
24
+
25
+ def headers
26
+ headers = params[:headers] || {}
27
+ headers[CONTENT_TYPE] = content_type if content_type
28
+ headers
29
+ end
30
+
31
+ def content_type
32
+ return MIME_TYPE_JSON if json
33
+ return MIME_TYPE_HTML if html
34
+ return MIME_TYPE_TEXT if text
35
+ end
36
+
37
+ def content
38
+ [json || html || text || body || EMPTY_CONTENT]
39
+ end
40
+
41
+ def json
42
+ return unless params[:json]
43
+ return stringified_json if valid_json?
44
+
45
+ params[:json].to_json
46
+ end
47
+
48
+ def html
49
+ params[:html]
50
+ end
51
+
52
+ def text
53
+ params[:text]
54
+ end
55
+
56
+ def body
57
+ params[:body]
58
+ end
59
+
60
+ def valid_json?
61
+ JSON.parse(stringified_json)
62
+ return true
63
+ rescue JSON::ParserError => e
64
+ return false
65
+ end
66
+
67
+ def stringified_json
68
+ @stringified_json ||= params[:json].to_s
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Navigable
4
+ module Server
5
+ class Router
6
+ def call(env)
7
+ router.call(env)
8
+ end
9
+
10
+ def add_endpoint(verb:, path:, endpoint_class:)
11
+ request_adapter = RackAdapter.new(endpoint_class: endpoint_class)
12
+ router.public_send(verb, path, to: request_adapter)
13
+ end
14
+
15
+ private
16
+
17
+ def router
18
+ @router ||= Navigable::Router.new
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Navigable
4
+ module Server
5
+ VERSION = "0.3.0"
6
+ end
7
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'lib/navigable/server/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "navigable-server"
5
+ spec.version = Navigable::Server::VERSION
6
+ spec.authors = ["Alan Ridlehoover", "Fito von Zastrow"]
7
+ spec.email = ["navigable@firsttry.software"]
8
+
9
+ spec.summary = %q{Ahoy! Welcome aboard Navigable!}
10
+ spec.description = %q{A Rack-based server for building Ruby and Navigable web applications.}
11
+ spec.homepage = "https://firsttry.software"
12
+ spec.license = "MIT"
13
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
14
+
15
+ spec.metadata["homepage_uri"] = spec.homepage
16
+ spec.metadata["source_code_uri"] = "https://github.com/first-try-software/navigable-server"
17
+ spec.metadata["changelog_uri"] = "https://github.com/first-try-software/navigable-server/issues"
18
+
19
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|assets)/}) }
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_dependency 'navigable-router'
27
+ spec.add_dependency 'json', '~> 2.3'
28
+ spec.add_dependency 'navigable', '~> 1.0'
29
+ spec.add_dependency 'rack', '~> 2.2'
30
+ spec.add_dependency 'rack-abstract-format', '~> 0.9.9'
31
+ spec.add_dependency 'rack-accept-media-types', '~> 0.9'
32
+ spec.add_dependency 'rack-bodyparser', '~> 1.0'
33
+
34
+ spec.add_development_dependency "bundler", "~> 2.0"
35
+ spec.add_development_dependency "rake", "~> 12.0"
36
+ spec.add_development_dependency "rspec", "~> 3.0"
37
+ spec.add_development_dependency "rspec_junit_formatter", "~>0.4"
38
+ spec.add_development_dependency "simplecov", "~>0.17.0"
39
+ end
metadata ADDED
@@ -0,0 +1,233 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: navigable-server
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Alan Ridlehoover
8
+ - Fito von Zastrow
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2020-09-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: navigable-router
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: json
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '2.3'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '2.3'
42
+ - !ruby/object:Gem::Dependency
43
+ name: navigable
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rack
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '2.2'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.2'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rack-abstract-format
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 0.9.9
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.9.9
84
+ - !ruby/object:Gem::Dependency
85
+ name: rack-accept-media-types
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '0.9'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '0.9'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rack-bodyparser
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1.0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: bundler
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '2.0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '2.0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rake
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '12.0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '12.0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: rspec
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '3.0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '3.0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: rspec_junit_formatter
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: '0.4'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: '0.4'
168
+ - !ruby/object:Gem::Dependency
169
+ name: simplecov
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: 0.17.0
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: 0.17.0
182
+ description: A Rack-based server for building Ruby and Navigable web applications.
183
+ email:
184
+ - navigable@firsttry.software
185
+ executables: []
186
+ extensions: []
187
+ extra_rdoc_files: []
188
+ files:
189
+ - ".gitignore"
190
+ - ".rspec"
191
+ - ".travis.yml"
192
+ - CODE_OF_CONDUCT.md
193
+ - Gemfile
194
+ - LICENSE.txt
195
+ - README.md
196
+ - Rakefile
197
+ - bin/console
198
+ - bin/setup
199
+ - lib/navigable/server.rb
200
+ - lib/navigable/server/endpoint.rb
201
+ - lib/navigable/server/rack_adapter.rb
202
+ - lib/navigable/server/request.rb
203
+ - lib/navigable/server/response.rb
204
+ - lib/navigable/server/router.rb
205
+ - lib/navigable/server/version.rb
206
+ - navigable-server.gemspec
207
+ homepage: https://firsttry.software
208
+ licenses:
209
+ - MIT
210
+ metadata:
211
+ homepage_uri: https://firsttry.software
212
+ source_code_uri: https://github.com/first-try-software/navigable-server
213
+ changelog_uri: https://github.com/first-try-software/navigable-server/issues
214
+ post_install_message:
215
+ rdoc_options: []
216
+ require_paths:
217
+ - lib
218
+ required_ruby_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: 2.3.0
223
+ required_rubygems_version: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ requirements: []
229
+ rubygems_version: 3.1.2
230
+ signing_key:
231
+ specification_version: 4
232
+ summary: Ahoy! Welcome aboard Navigable!
233
+ test_files: []