loginator 0.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4579d7d89bec5884c7cdee42ae1abdc70b5ef2ff
4
+ data.tar.gz: 85ad6d2d9da2a039caac07fd85dddfee2b238dbf
5
+ SHA512:
6
+ metadata.gz: c8223b4590399f9ac81f20bdf63ebc28efa118dd20397c83ae65cb649577504967f59b6e2967c0f94f801553f8b32d98888f6b74e1c8173932692495dc2181f7
7
+ data.tar.gz: 60c7cb9407284a7eeedeadb9e3c6c1fed232d29b1b4dfbe19511888e3e3c169ab10645beefb1e89ab645e8ff5dfc77e50021b6d5a1b943841e7dbdf042407078
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .idea
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ .ruby-version
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
20
+ *.swp
21
+ *.swo
data/.metrics ADDED
@@ -0,0 +1,4 @@
1
+ # vim: ft=ruby
2
+ MetricFu::Configuration.run do |config|
3
+ config.cane[:line_length] = 132
4
+ end
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,15 @@
1
+ LineLength:
2
+ Enabled: true
3
+ Max: 128
4
+
5
+ Encoding:
6
+ Enabled: false
7
+
8
+ CaseIndentation:
9
+ Enabled: false
10
+
11
+ MethodLength:
12
+ Enabled: false
13
+
14
+ AbcSize:
15
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,23 @@
1
+ # vim: ft=ruby
2
+ # More info at https://github.com/guard/guard#readme
3
+ #
4
+ # More info also at https://github.com/guard/guard-rspec -- this one in
5
+ # particular details configuration options such as whether to run all tests
6
+ # after a failing test starts passing
7
+
8
+ guard :rspec, cli: '--tag ~slow' do
9
+ watch(/^spec\/.+_spec\.rb/)
10
+ watch(/^lib\/(.+)\.rb$/) do |match|
11
+ %w(unit integration acceptance).map do |kind|
12
+ "spec/#{kind}/lib/#{match[1]}_spec.rb"
13
+ end
14
+ end
15
+ watch('spec/spec_helper.rb') { 'spec' }
16
+ watch(%r{^spec/(fixtures|resources)(/|.rb)}) { 'spec' }
17
+ end
18
+
19
+ guard :rubocop, all_on_start: false do
20
+ watch('Guardfile')
21
+ watch(/.+\.rb$/)
22
+ watch(/(?:.+\/)?\.rubocop\.yml$/) { |m| File.dirname(m[0]) }
23
+ end
data/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # Loginator
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'loginator'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install loginator
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
30
+
31
+
32
+ ## Testing
33
+
34
+ TODO: Add information specific to your gem's test suite.
35
+
36
+ The Rakefile comes with several convenience tasks for running tests as well. By rake task:
37
+
38
+ + `spec`: Runs all rspec tests in the spec directory.
39
+ + `yard`: Generates yard documentation.
40
+ + `rubocop`: Runs rubocop.
41
+ + `run_guards`: Runs all guards.
42
+
43
+ `run_guards` is the one you're most likely to want to run, since it runs all the other test-related tasks.
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ #! /usr/bin/env rake
2
+ require 'bundler/gem_tasks'
3
+ require 'yard'
4
+ require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
6
+
7
+ task default: :build
8
+
9
+ # If there are test failures, you'll need to write code to address them.
10
+ # So no point in continuing to run the style tests.
11
+ desc 'Runs all spec tests'
12
+ RSpec::Core::RakeTask.new(:spec)
13
+
14
+ desc 'Runs yard'
15
+ YARD::Rake::YardocTask.new(:yard)
16
+
17
+ desc 'runs Rubocop'
18
+ RuboCop::RakeTask.new
19
+
20
+ desc 'Runs test and code cleanliness suite: RuboCop, rspec, and yard'
21
+ task run_guards: [:spec, :yard, :rubocop]
22
+
23
+ task build: :run_guards
@@ -0,0 +1,26 @@
1
+ module Rack
2
+ module Loginator
3
+ # Log all the things.
4
+ class Logging
5
+ attr_reader :app, :level
6
+
7
+ # @param app [Rack::App] #{Rack::App} being passed through middleware chain
8
+ # @option opts [Symbol] :level (:info) Default logging level
9
+ def initialize(app, level: :info)
10
+ @app = app
11
+ @level = level
12
+ end
13
+
14
+ def call(env)
15
+ req = Rack::Request.new(env)
16
+ request = Loginator::Request.new(env['X-REQUEST-UUID'], Time.now.utc.to_s, env['REQUEST_PATH'], req.body.read)
17
+ logger.send(level, request)
18
+ req.body.rewind
19
+ @app.call(env).tap do |status, _headers, body|
20
+ response = Loginator::Response.new(env['X-REQUEST-UUID'], Time.now.utc.to_s, env['REQUEST_PATH'], status, body)
21
+ logger.send(level, response)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ module Rack
2
+ module Loginator
3
+ # Log all the things.
4
+ class Uuid
5
+ attr_reader :app
6
+
7
+ def call(env)
8
+ env['X-REQUEST-UUID'] ||= SecureRandom.uuid
9
+ @app.call(env)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,33 @@
1
+ require 'multi_json'
2
+
3
+ module Loginator
4
+ # Makes a Struct easily serializable and deserializable. Adds the
5
+ # from_hash class method and to_json instance method to Struct
6
+ # classes.
7
+ module JsonableStruct
8
+ def self.included(base)
9
+ base.extend ClassMethods
10
+ end
11
+
12
+ # class level mixins
13
+ module ClassMethods #:nodoc
14
+ def from_hash(hsh)
15
+ fail(ArgumentError, format('Hash must contain keys: %s', members.join(', '))) unless valid_hash?(hsh)
16
+ new(*hsh.values)
17
+ end
18
+
19
+ private
20
+
21
+ def valid_hash?(hsh)
22
+ # Loosely validate that all necessary keys are present...
23
+ # This does mean that we could potentially create a Response from a hash
24
+ # representing an object _like_ a response.... Feature or... ? ^_^
25
+ members & hsh.keys.map(&:to_sym) == members
26
+ end
27
+ end #:rubocop:enable documentation
28
+
29
+ def to_json
30
+ MultiJson.dump(to_h)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ require 'multi_json'
2
+ require 'loginator/jsonable_struct'
3
+
4
+ # Loginator::Request
5
+ module Loginator
6
+ # A request is a tuple of a (UUID, Timestamp, Path, Parameters). Requests parameters are defined subjectively by the
7
+ # user. For example, in the example Rack middleware ({#Rack::Loginator::Logging}), we define params as the request
8
+ # body (our HTTP APIs tend to accept JSON bodies as opposed to parameters attached to the URL). You may also wish
9
+ # to consider part of the HTTP headers as a request parameter.
10
+ #
11
+ Request = Struct.new(:request_id, :timestamp, :path, :params) do
12
+ include Loginator::JsonableStruct
13
+
14
+ # Create a new Loginator::Request
15
+ # @param request_id [String] (SecureRandom.uuid) Unique identifier for the request
16
+ # @param timestamp [Integer] (Time.now.utc.to_i) Time of the request
17
+ # @param path [String] (nil) Path associated with the request
18
+ # @param params [String] ({}) Parameters of the request
19
+ def initialize(request_id = SecureRandom.uuid, timestamp = Time.now.utc.to_i, path = nil, params = {})
20
+ super
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require 'multi_json'
2
+ require 'loginator/jsonable_struct'
3
+
4
+ # Loginator::Response
5
+ module Loginator
6
+ # A {#Loginator::Response} is a response to a {#Loginator::Request}. It should include the same elements as a
7
+ # request, plus the status of the response (an indicator if the API request was successful or not) as well
8
+ # as an optional response body. Whether or not to log the response is entirely left up to implementation
9
+ # decisions and production log volume considerations. It is trivial to log response bodies in development,
10
+ # but not in production.
11
+ #
12
+ Response = Struct.new(:request_id, :timestamp, :path, :status, :body) do
13
+ include Loginator::JsonableStruct
14
+
15
+ # Create a new Loginator::Response
16
+ # @param [String] request_id (SecureRandom.uuid) Unique identifier for the request
17
+ # @param [Integer] timestamp (Time.now.utc.to_i) Time of the request
18
+ # @param [String] path (nil) Path associated with the request
19
+ # @param [Integer] status (0) Status returned to the requester
20
+ # @param [String] body ({}) Parameters of the request
21
+ def initialize(request_id = SecureRandom.uuid, timestamp = Time.now.utc.to_i, path = nil, status = 0, body = '')
22
+ super
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,4 @@
1
+ # Increment when releasing.
2
+ module Loginator
3
+ VERSION = '0.0.2'
4
+ end
data/lib/loginator.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'loginator/version'
2
+
3
+ # Loginator
4
+ module Loginator
5
+ end
data/loginator.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # vim: ft=ruby
3
+
4
+ require File.expand_path('../lib/loginator/version', __FILE__)
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.authors = ['SET ME']
8
+ gem.email = ['SET ME']
9
+ gem.description = 'I am an application stub'
10
+ gem.summary = 'app stub'
11
+
12
+ gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
13
+ gem.executables = gem.files.grep(/^bin\//).map { |f| File.basename(f) }
14
+ gem.test_files = gem.files.grep(/^(test|spec|features)\//)
15
+ gem.name = 'loginator'
16
+ gem.require_paths = %w(lib)
17
+ gem.version = Loginator::VERSION
18
+
19
+ # dependencies...
20
+ gem.add_dependency('thor', '0.19.1')
21
+ gem.add_dependency('sysexits', '1.0.2')
22
+ gem.add_dependency('awesome_print', '~> 1.1.0')
23
+ gem.add_dependency('abstract_type', '~> 0.0.7')
24
+ gem.add_dependency('multi_json', '~> 1.10.1')
25
+
26
+ # development dependencies.
27
+ gem.add_development_dependency('rspec', '~> 3.2')
28
+ gem.add_development_dependency('simplecov', '~> 0.9')
29
+ gem.add_development_dependency('guard', '~> 2.12')
30
+ gem.add_development_dependency('guard-rspec', '~> 4.5')
31
+ gem.add_development_dependency('rubocop', '~> 0.29')
32
+ gem.add_development_dependency('guard-rubocop', '~> 1.2')
33
+ gem.add_development_dependency('rainbow', '2.0')
34
+ gem.add_development_dependency('metric_fu', '~> 4.11')
35
+ gem.add_development_dependency('rake', '~> 10.3')
36
+ gem.add_development_dependency('yard', '~> 0.8.7')
37
+ gem.add_development_dependency('redcarpet', '~> 3.2')
38
+ gem.add_development_dependency('pry-nav')
39
+ end
data/loginator.reek ADDED
File without changes
File without changes
File without changes
data/spec/fixtures.rb ADDED
@@ -0,0 +1,12 @@
1
+ def fixture(filename)
2
+ File.expand_path("../fixtures/#{filename}", __FILE__)
3
+ end
4
+
5
+ module Loginator
6
+ module Test
7
+ # Fixtures are static content required for testing. This may include JSON bodies
8
+ # returned from RESTful APIs, text files that need to be parsed, etc.
9
+ module Fixtures
10
+ end
11
+ end
12
+ end
File without changes
@@ -0,0 +1,13 @@
1
+ require 'loginator/request'
2
+ require 'support/shared/lib/loginator/jsonable_struct_spec'
3
+ require 'support/shared/lib/loginator/struct_with_defaults_spec'
4
+
5
+ RSpec.describe Loginator::Request do
6
+ describe '#new' do
7
+ it_behaves_like 'struct_with_defaults'
8
+ end
9
+
10
+ describe 'serializability' do
11
+ it_behaves_like 'jsonable_struct'
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'loginator/response'
2
+ require 'support/shared/lib/loginator/jsonable_struct_spec'
3
+ require 'support/shared/lib/loginator/struct_with_defaults_spec'
4
+
5
+ RSpec.describe Loginator::Response do
6
+ describe '#new' do
7
+ it_behaves_like 'struct_with_defaults'
8
+ end
9
+
10
+ describe 'serializability' do
11
+ it_behaves_like 'jsonable_struct'
12
+ end
13
+ end
File without changes
data/spec/resources.rb ADDED
@@ -0,0 +1,16 @@
1
+ def resource(filename)
2
+ File.expand_path("../resources/#{filename}", __FILE__)
3
+ end
4
+
5
+ module Loginator
6
+ module Test
7
+ # This should include test-specific resources (i.e. pre-built uniform objects)
8
+ # that are required in order to run your specs. It is largely an object
9
+ # factory for building objects for testing.
10
+ #
11
+ # @example
12
+ # Loginator::Test::Resources::LoggedInUser
13
+ module Resources
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ pid = Process.pid
5
+ SimpleCov.at_exit do
6
+ SimpleCov.result.format! if Process.pid == pid
7
+ end
8
+
9
+ $LOAD_PATH << File.expand_path('../../lib', __FILE__)
10
+
11
+ require File.expand_path('../fixtures.rb', __FILE__)
12
+ require File.expand_path('../resources.rb', __FILE__)
@@ -0,0 +1,13 @@
1
+ shared_examples_for 'jsonable_struct' do
2
+ describe '#to_json' do
3
+ it 'faithfully serializes' do
4
+ expect(subject.to_json).to eq(MultiJson.dump(subject.to_h))
5
+ end
6
+ end
7
+
8
+ describe '.from_hash' do
9
+ it 'faithfully deserializes' do
10
+ expect(described_class.from_hash(MultiJson.load(subject.to_json))).to eq(subject)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,39 @@
1
+ shared_examples_for 'struct_with_defaults' do
2
+ describe '#new' do
3
+ context 'using defaults' do
4
+ it 'creates a valid object' do
5
+ expect(subject).to be_a_kind_of(described_class)
6
+ end
7
+
8
+ it 'sets default request id' do
9
+ expect(subject.request_id).to be_a_kind_of(String)
10
+ end
11
+
12
+ it 'sets default timestamp' do
13
+ expect(subject.timestamp).to be_a_kind_of(Integer)
14
+ expect(subject.timestamp).to be <= Time.now.utc.to_i
15
+ expect(subject.timestamp).to be > 0
16
+ end
17
+ end
18
+
19
+ context 'overriding defaults' do
20
+ let(:request_id) { 'uuid' }
21
+ let(:timestamp) { 42 }
22
+ let(:path) { '/' }
23
+
24
+ subject { described_class.new(request_id, timestamp, path) }
25
+
26
+ [:request_id, :timestamp, :path].each do |field|
27
+ it 'overrides defaults' do
28
+ expect(subject.send(field)).to eq(send(field))
29
+ end
30
+ end
31
+
32
+ describe '.from_hash' do
33
+ it 'faithfully deserializes' do
34
+ expect(described_class.from_hash(MultiJson.load(subject.to_json))).to eq(subject)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
File without changes
metadata ADDED
@@ -0,0 +1,323 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: loginator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - SET ME
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.19.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.19.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: sysexits
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: awesome_print
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.1.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: abstract_type
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.7
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.0.7
69
+ - !ruby/object:Gem::Dependency
70
+ name: multi_json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.10.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.10.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.9'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.9'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.12'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.12'
125
+ - !ruby/object:Gem::Dependency
126
+ name: guard-rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '4.5'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '4.5'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.29'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.29'
153
+ - !ruby/object:Gem::Dependency
154
+ name: guard-rubocop
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.2'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.2'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rainbow
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: '2.0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: '2.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: metric_fu
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '4.11'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '4.11'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rake
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '10.3'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '10.3'
209
+ - !ruby/object:Gem::Dependency
210
+ name: yard
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: 0.8.7
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: 0.8.7
223
+ - !ruby/object:Gem::Dependency
224
+ name: redcarpet
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '3.2'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '3.2'
237
+ - !ruby/object:Gem::Dependency
238
+ name: pry-nav
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ description: I am an application stub
252
+ email:
253
+ - SET ME
254
+ executables: []
255
+ extensions: []
256
+ extra_rdoc_files: []
257
+ files:
258
+ - ".gitignore"
259
+ - ".metrics"
260
+ - ".rspec"
261
+ - ".rubocop.yml"
262
+ - Gemfile
263
+ - Guardfile
264
+ - README.md
265
+ - Rakefile
266
+ - examples/rack/logging.rb
267
+ - examples/rack/uuid.rb
268
+ - lib/loginator.rb
269
+ - lib/loginator/jsonable_struct.rb
270
+ - lib/loginator/request.rb
271
+ - lib/loginator/response.rb
272
+ - lib/loginator/version.rb
273
+ - loginator.gemspec
274
+ - loginator.reek
275
+ - spec/acceptance/lib/loginator/.gitignore
276
+ - spec/fixtures.rb
277
+ - spec/fixtures/.gitignore
278
+ - spec/integration/lib/loginator/.gitignore
279
+ - spec/integration/lib/loginator/request_spec.rb
280
+ - spec/integration/lib/loginator/response_spec.rb
281
+ - spec/resources.rb
282
+ - spec/resources/.gitignore
283
+ - spec/spec_helper.rb
284
+ - spec/support/shared/lib/loginator/jsonable_struct_spec.rb
285
+ - spec/support/shared/lib/loginator/struct_with_defaults_spec.rb
286
+ - spec/unit/lib/loginator/.gitignore
287
+ homepage:
288
+ licenses: []
289
+ metadata: {}
290
+ post_install_message:
291
+ rdoc_options: []
292
+ require_paths:
293
+ - lib
294
+ required_ruby_version: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - ">="
297
+ - !ruby/object:Gem::Version
298
+ version: '0'
299
+ required_rubygems_version: !ruby/object:Gem::Requirement
300
+ requirements:
301
+ - - ">="
302
+ - !ruby/object:Gem::Version
303
+ version: '0'
304
+ requirements: []
305
+ rubyforge_project:
306
+ rubygems_version: 2.2.2
307
+ signing_key:
308
+ specification_version: 4
309
+ summary: app stub
310
+ test_files:
311
+ - spec/acceptance/lib/loginator/.gitignore
312
+ - spec/fixtures.rb
313
+ - spec/fixtures/.gitignore
314
+ - spec/integration/lib/loginator/.gitignore
315
+ - spec/integration/lib/loginator/request_spec.rb
316
+ - spec/integration/lib/loginator/response_spec.rb
317
+ - spec/resources.rb
318
+ - spec/resources/.gitignore
319
+ - spec/spec_helper.rb
320
+ - spec/support/shared/lib/loginator/jsonable_struct_spec.rb
321
+ - spec/support/shared/lib/loginator/struct_with_defaults_spec.rb
322
+ - spec/unit/lib/loginator/.gitignore
323
+ has_rdoc: