napa 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +41 -8
- data/Rakefile +1 -0
- data/docs/grape_entity_to_roar.md +110 -0
- data/docs/quickstart.md +29 -3
- data/lib/napa/active_record_extensions/filter_by_hash.rb +1 -0
- data/lib/napa/active_record_extensions/seeder.rb +14 -0
- data/lib/napa/cli.rb +28 -2
- data/lib/napa/deploy.rb +98 -0
- data/lib/napa/deprecations/active_support_behavior.rb +8 -0
- data/lib/napa/deprecations/application_api.rb +9 -0
- data/lib/napa/deprecations/grape_entity.rb +5 -0
- data/lib/napa/deprecations/napa_setup.rb +38 -0
- data/lib/napa/deprecations.rb +13 -0
- data/lib/napa/gem_dependency.rb +37 -0
- data/lib/napa/generators/migration_generator.rb +199 -2
- data/lib/napa/generators/readme_generator.rb +47 -0
- data/lib/napa/generators/templates/create_table_migration/%migration_filename%.rb.tt +19 -0
- data/lib/napa/generators/templates/migration/%migration_filename%.rb.tt +36 -1
- data/lib/napa/generators/templates/readme/README.md.tt +55 -0
- data/lib/napa/generators/templates/readme/spec/docs/readme_spec.rb +7 -0
- data/lib/napa/generators/templates/scaffold/.env.test.tt +3 -0
- data/lib/napa/generators/templates/scaffold/.env.tt +3 -0
- data/lib/napa/generators/templates/scaffold/.gitignore.tt +1 -0
- data/lib/napa/generators/templates/scaffold/Rakefile +2 -1
- data/lib/napa/generators/templates/scaffold/app.rb +1 -1
- data/lib/napa/generators/templates/scaffold/config.ru.tt +3 -2
- data/lib/napa/generators/templates/scaffold/log/{.gitkeep → .keep} +0 -0
- data/lib/napa/generators.rb +1 -0
- data/lib/napa/middleware/logger.rb +1 -1
- data/lib/napa/middleware/request_stats.rb +0 -2
- data/lib/napa/output_formatters/entity.rb +4 -0
- data/lib/napa/rspec_extensions/response_helpers.rb +29 -0
- data/lib/napa/setup.rb +20 -0
- data/lib/napa/stats_d_timer.rb +1 -1
- data/lib/napa/version.rb +1 -1
- data/lib/napa.rb +19 -1
- data/lib/tasks/db.rake +7 -0
- data/lib/tasks/deploy.rake +2 -4
- data/lib/tasks/routes.rake +4 -3
- data/napa.gemspec +2 -1
- data/spec/active_record_extensions/filter_by_hash_spec.rb +5 -3
- data/spec/active_record_extensions/seeder_spec.rb +13 -0
- data/spec/authentication_spec.rb +3 -3
- data/spec/deprecations/application_api_spec.rb +19 -0
- data/spec/deprecations/entity_spec.rb +9 -0
- data/spec/deprecations/filter_by_hash_spec.rb +9 -0
- data/spec/deprecations/napa_setup_spec.rb +52 -0
- data/spec/generators/api_generator_spec.rb +1 -1
- data/spec/generators/migration_generator_spec.rb +86 -8
- data/spec/generators/readme_generator_spec.rb +35 -0
- data/spec/grape_extensions/error_formatter_spec.rb +6 -6
- data/spec/identity_spec.rb +13 -13
- data/spec/json_error_spec.rb +3 -3
- data/spec/logger/log_transaction_spec.rb +6 -6
- data/spec/middleware/authentication_spec.rb +8 -8
- data/spec/middleware/database_stats_spec.rb +8 -8
- data/spec/middleware/request_stats_spec.rb +2 -11
- data/spec/spec_helper.rb +11 -2
- data/spec/stats_d_timer_spec.rb +23 -0
- data/spec/stats_spec.rb +2 -2
- data/spec/version_spec.rb +6 -6
- metadata +35 -9
- data/lib/tasks/git.rake +0 -53
@@ -5,10 +5,15 @@ module Napa
|
|
5
5
|
module Generators
|
6
6
|
class MigrationGenerator < Thor::Group
|
7
7
|
include Thor::Actions
|
8
|
+
# largely ported over, with a few differences, from
|
9
|
+
# https://github.com/rails/rails/blob/76883f92374c6395f13c16628e1d87d40b6d2399/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb
|
8
10
|
argument :migration_name
|
11
|
+
argument :attributes, type: :array, default: []
|
12
|
+
|
13
|
+
attr_reader :migration_action, :join_tables, :table_name
|
9
14
|
|
10
15
|
def version
|
11
|
-
Time.now.utc.
|
16
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
12
17
|
end
|
13
18
|
|
14
19
|
def migration_filename
|
@@ -19,12 +24,204 @@ module Napa
|
|
19
24
|
'./db/migrate'
|
20
25
|
end
|
21
26
|
|
27
|
+
def parse_attributes!
|
28
|
+
self.attributes = (attributes || []).map do |attr|
|
29
|
+
GeneratedAttribute.parse(attr)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_local_assigns!
|
34
|
+
@migration_template = "migration"
|
35
|
+
filename = migration_name.underscore
|
36
|
+
case filename
|
37
|
+
when /^(add|remove)_.*_(?:to|from)_(.*)/
|
38
|
+
@migration_action = $1
|
39
|
+
@table_name = $2.pluralize
|
40
|
+
when /join_table/
|
41
|
+
if attributes.length == 2
|
42
|
+
@migration_action = 'join'
|
43
|
+
@join_tables = attributes.map(&:plural_name)
|
44
|
+
|
45
|
+
set_index_names
|
46
|
+
end
|
47
|
+
when /^create_(.+)/
|
48
|
+
@table_name = $1.pluralize
|
49
|
+
@migration_template = "create_table_migration"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
22
53
|
def migration
|
23
|
-
self.class.source_root "#{File.dirname(__FILE__)}/templates
|
54
|
+
self.class.source_root "#{File.dirname(__FILE__)}/templates/#{@migration_template}"
|
24
55
|
say 'Generating migration...'
|
25
56
|
directory '.', output_directory
|
26
57
|
say 'Done!', :green
|
27
58
|
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def attributes_with_index
|
62
|
+
attributes.select { |a| !a.reference? && a.has_index? }
|
63
|
+
end
|
64
|
+
|
65
|
+
def set_index_names
|
66
|
+
attributes.each_with_index do |attr, i|
|
67
|
+
attr.index_name = [attr, attributes[i - 1]].map{ |a| index_name_for(a) }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def index_name_for(attribute)
|
72
|
+
if attribute.foreign_key?
|
73
|
+
attribute.name
|
74
|
+
else
|
75
|
+
attribute.name.singularize.foreign_key
|
76
|
+
end.to_sym
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# directly ported from
|
81
|
+
# https://github.com/rails/rails/blob/76883f92374c6395f13c16628e1d87d40b6d2399/railties/lib/rails/generators/generated_attribute.rb
|
82
|
+
class GeneratedAttribute # :nodoc:
|
83
|
+
INDEX_OPTIONS = %w(index uniq)
|
84
|
+
UNIQ_INDEX_OPTIONS = %w(uniq)
|
85
|
+
|
86
|
+
attr_accessor :name, :type
|
87
|
+
attr_reader :attr_options
|
88
|
+
attr_writer :index_name
|
89
|
+
|
90
|
+
class << self
|
91
|
+
def parse(column_definition)
|
92
|
+
name, type, has_index = column_definition.split(':')
|
93
|
+
|
94
|
+
# if user provided "name:index" instead of "name:string:index"
|
95
|
+
# type should be set blank so GeneratedAttribute's constructor
|
96
|
+
# could set it to :string
|
97
|
+
has_index, type = type, nil if INDEX_OPTIONS.include?(type)
|
98
|
+
|
99
|
+
type, attr_options = *parse_type_and_options(type)
|
100
|
+
type = type.to_sym if type
|
101
|
+
|
102
|
+
if type && reference?(type)
|
103
|
+
references_index = UNIQ_INDEX_OPTIONS.include?(has_index) ? { unique: true } : true
|
104
|
+
attr_options[:index] = references_index
|
105
|
+
end
|
106
|
+
|
107
|
+
new(name, type, has_index, attr_options)
|
108
|
+
end
|
109
|
+
|
110
|
+
def reference?(type)
|
111
|
+
[:references, :belongs_to].include? type
|
112
|
+
end
|
113
|
+
|
114
|
+
private
|
115
|
+
|
116
|
+
# parse possible attribute options like :limit for string/text/binary/integer, :precision/:scale for decimals or :polymorphic for references/belongs_to
|
117
|
+
# when declaring options curly brackets should be used
|
118
|
+
def parse_type_and_options(type)
|
119
|
+
case type
|
120
|
+
when /(string|text|binary|integer)\{(\d+)\}/
|
121
|
+
return $1, limit: $2.to_i
|
122
|
+
when /decimal\{(\d+)[,.-](\d+)\}/
|
123
|
+
return :decimal, precision: $1.to_i, scale: $2.to_i
|
124
|
+
when /(references|belongs_to)\{polymorphic\}/
|
125
|
+
return $1, polymorphic: true
|
126
|
+
else
|
127
|
+
return type, {}
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def initialize(name, type=nil, index_type=false, attr_options={})
|
133
|
+
@name = name
|
134
|
+
@type = type || :string
|
135
|
+
@has_index = INDEX_OPTIONS.include?(index_type)
|
136
|
+
@has_uniq_index = UNIQ_INDEX_OPTIONS.include?(index_type)
|
137
|
+
@attr_options = attr_options
|
138
|
+
end
|
139
|
+
|
140
|
+
def field_type
|
141
|
+
@field_type ||= case type
|
142
|
+
when :integer then :number_field
|
143
|
+
when :float, :decimal then :text_field
|
144
|
+
when :time then :time_select
|
145
|
+
when :datetime, :timestamp then :datetime_select
|
146
|
+
when :date then :date_select
|
147
|
+
when :text then :text_area
|
148
|
+
when :boolean then :check_box
|
149
|
+
else
|
150
|
+
:text_field
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def default
|
155
|
+
@default ||= case type
|
156
|
+
when :integer then 1
|
157
|
+
when :float then 1.5
|
158
|
+
when :decimal then "9.99"
|
159
|
+
when :datetime, :timestamp, :time then Time.now.to_s(:db)
|
160
|
+
when :date then Date.today.to_s(:db)
|
161
|
+
when :string then name == "type" ? "" : "MyString"
|
162
|
+
when :text then "MyText"
|
163
|
+
when :boolean then false
|
164
|
+
when :references, :belongs_to then nil
|
165
|
+
else
|
166
|
+
""
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def plural_name
|
171
|
+
name.sub(/_id$/, '').pluralize
|
172
|
+
end
|
173
|
+
|
174
|
+
def singular_name
|
175
|
+
name.sub(/_id$/, '').singularize
|
176
|
+
end
|
177
|
+
|
178
|
+
def human_name
|
179
|
+
name.humanize
|
180
|
+
end
|
181
|
+
|
182
|
+
def index_name
|
183
|
+
@index_name ||= if polymorphic?
|
184
|
+
%w(id type).map { |t| "#{name}_#{t}" }
|
185
|
+
else
|
186
|
+
column_name
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def column_name
|
191
|
+
@column_name ||= reference? ? "#{name}_id" : name
|
192
|
+
end
|
193
|
+
|
194
|
+
def foreign_key?
|
195
|
+
!!(name =~ /_id$/)
|
196
|
+
end
|
197
|
+
|
198
|
+
def reference?
|
199
|
+
self.class.reference?(type)
|
200
|
+
end
|
201
|
+
|
202
|
+
def polymorphic?
|
203
|
+
self.attr_options.has_key?(:polymorphic)
|
204
|
+
end
|
205
|
+
|
206
|
+
def has_index?
|
207
|
+
@has_index
|
208
|
+
end
|
209
|
+
|
210
|
+
def has_uniq_index?
|
211
|
+
@has_uniq_index
|
212
|
+
end
|
213
|
+
|
214
|
+
def password_digest?
|
215
|
+
name == 'password' && type == :digest
|
216
|
+
end
|
217
|
+
|
218
|
+
def inject_options
|
219
|
+
"".tap { |s| @attr_options.each { |k,v| s << ", #{k}: #{v.inspect}" } }
|
220
|
+
end
|
221
|
+
|
222
|
+
def inject_index_options
|
223
|
+
has_uniq_index? ? ", unique: true" : ""
|
224
|
+
end
|
28
225
|
end
|
29
226
|
end
|
30
227
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'active_support/all'
|
3
|
+
require 'napa/setup'
|
4
|
+
require 'napa/identity'
|
5
|
+
require 'dotenv'
|
6
|
+
|
7
|
+
module Napa
|
8
|
+
module Generators
|
9
|
+
class ReadmeGenerator < Thor::Group
|
10
|
+
include Thor::Actions
|
11
|
+
|
12
|
+
def load_environment
|
13
|
+
Napa.load_environment
|
14
|
+
end
|
15
|
+
|
16
|
+
def service_name
|
17
|
+
Napa::Identity.name
|
18
|
+
end
|
19
|
+
|
20
|
+
def routes
|
21
|
+
routes = ""
|
22
|
+
|
23
|
+
if defined? ApplicationApi
|
24
|
+
ApplicationApi.routes.each do |api|
|
25
|
+
method = api.route_method.ljust(10)
|
26
|
+
path = api.route_path.ljust(40)
|
27
|
+
description = api.route_description
|
28
|
+
routes += " #{method} #{path} # #{description}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
routes
|
33
|
+
end
|
34
|
+
|
35
|
+
def output_directory
|
36
|
+
'.'
|
37
|
+
end
|
38
|
+
|
39
|
+
def readme
|
40
|
+
self.class.source_root "#{File.dirname(__FILE__)}/templates/readme"
|
41
|
+
say 'Generating readme...'
|
42
|
+
directory '.', output_directory
|
43
|
+
say 'Done!', :green
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class <%= migration_name.camelize %> < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :<%= table_name %> do |t|
|
4
|
+
<% attributes.each do |attribute| -%>
|
5
|
+
<% if attribute.password_digest? -%>
|
6
|
+
t.string :password_digest<%= attribute.inject_options %>
|
7
|
+
<% else -%>
|
8
|
+
t.<%= attribute.type %> :<%= attribute.name %><%= attribute.inject_options %>
|
9
|
+
<% end -%>
|
10
|
+
<% end -%>
|
11
|
+
<% if options[:timestamps] %>
|
12
|
+
t.timestamps
|
13
|
+
<% end -%>
|
14
|
+
end
|
15
|
+
<% attributes_with_index.each do |attribute| -%>
|
16
|
+
add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
|
17
|
+
<% end -%>
|
18
|
+
end
|
19
|
+
end
|
@@ -1,4 +1,39 @@
|
|
1
1
|
class <%= migration_name.camelize %> < ActiveRecord::Migration
|
2
|
+
<%- if migration_action == 'add' -%>
|
2
3
|
def change
|
4
|
+
<% attributes.each do |attribute| -%>
|
5
|
+
<%- if attribute.reference? -%>
|
6
|
+
add_reference :<%= table_name %>, :<%= attribute.name %><%= attribute.inject_options %>
|
7
|
+
<%- else -%>
|
8
|
+
add_column :<%= table_name %>, :<%= attribute.name %>, :<%= attribute.type %><%= attribute.inject_options %>
|
9
|
+
<%- if attribute.has_index? -%>
|
10
|
+
add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
|
11
|
+
<%- end -%>
|
12
|
+
<%- end -%>
|
13
|
+
<%- end -%>
|
3
14
|
end
|
4
|
-
|
15
|
+
<%- elsif migration_action == 'join' -%>
|
16
|
+
def change
|
17
|
+
create_join_table :<%= join_tables.first %>, :<%= join_tables.second %> do |t|
|
18
|
+
<%- attributes.each do |attribute| -%>
|
19
|
+
<%= '# ' unless attribute.has_index? -%>t.index <%= attribute.index_name %><%= attribute.inject_index_options %>
|
20
|
+
<%- end -%>
|
21
|
+
end
|
22
|
+
end
|
23
|
+
<%- else -%>
|
24
|
+
def change
|
25
|
+
<% attributes.each do |attribute| -%>
|
26
|
+
<%- if migration_action -%>
|
27
|
+
<%- if attribute.reference? -%>
|
28
|
+
remove_reference :<%= table_name %>, :<%= attribute.name %><%= attribute.inject_options %>
|
29
|
+
<%- else -%>
|
30
|
+
<%- if attribute.has_index? -%>
|
31
|
+
remove_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
|
32
|
+
<%- end -%>
|
33
|
+
remove_column :<%= table_name %>, :<%= attribute.name %>, :<%= attribute.type %><%= attribute.inject_options %>
|
34
|
+
<%- end -%>
|
35
|
+
<%- end -%>
|
36
|
+
<%- end -%>
|
37
|
+
end
|
38
|
+
<%- end -%>
|
39
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# <%= service_name %>
|
2
|
+
|
3
|
+
:bow: Please put your auspicious [Travis status button](http://docs.travis-ci.com/user/status-images/) here :bow:
|
4
|
+
|
5
|
+
1. [Overview](#overview)
|
6
|
+
2. [How Does It Work](#how-does-it-work)
|
7
|
+
3. [Endpoints](#endpoints)
|
8
|
+
4. [Development](#development)
|
9
|
+
5. [Extra Links](#extra-links)
|
10
|
+
|
11
|
+
### Overview
|
12
|
+
|
13
|
+
:bow: Tell us about your wonderful service :bow:
|
14
|
+
|
15
|
+
In this section, please answer the questions, "What is this service?" or "What does this service do?"
|
16
|
+
|
17
|
+
### How Does It Work
|
18
|
+
|
19
|
+
Ohhh tell us, how does it function? :bow: :bow:
|
20
|
+
|
21
|
+
Tell us about the __mechanics__ or __logic__ driving the service. Diagrams and pictures are :angel:
|
22
|
+
|
23
|
+
### Endpoints
|
24
|
+
|
25
|
+
How must we interact with your great service? :bow:
|
26
|
+
|
27
|
+
Try typing `rake routes` into your console, and then paste that here.
|
28
|
+
|
29
|
+
If those endpoints need to be explained in more detail, please bless us with your wisdom.
|
30
|
+
|
31
|
+
### Development
|
32
|
+
|
33
|
+
```
|
34
|
+
bundle install
|
35
|
+
|
36
|
+
rake db:reset
|
37
|
+
|
38
|
+
rspec spec
|
39
|
+
|
40
|
+
rackup
|
41
|
+
```
|
42
|
+
|
43
|
+
So wonderful, so informative! :bow:
|
44
|
+
|
45
|
+
What else do we need to know so that a new developer can start contributing __within 30 minutes__?
|
46
|
+
|
47
|
+
### Extra Links
|
48
|
+
|
49
|
+
What a perfectly constructed service! We're so honored :bow:
|
50
|
+
|
51
|
+
If your service makes heavy use of other gems or API's, imbue us with that knowledge in the form of
|
52
|
+
|
53
|
+
- [Link to documentation]()
|
54
|
+
- [etc.]()
|
55
|
+
- [For information on how to create links in Markdown, please click here](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#links)
|
@@ -10,11 +10,12 @@ require './app'
|
|
10
10
|
# end
|
11
11
|
# end
|
12
12
|
#
|
13
|
-
# use Honeybadger::Rack
|
13
|
+
# use Honeybadger::Rack::ErrorNotifier
|
14
14
|
# use Napa::Middleware::Logger
|
15
15
|
|
16
16
|
use Napa::Middleware::AppMonitor
|
17
|
-
|
17
|
+
# Uncomment to require header passwords for all requestss
|
18
|
+
# use Napa::Middleware::Authentication
|
18
19
|
use ActiveRecord::ConnectionAdapters::ConnectionManagement
|
19
20
|
|
20
21
|
run ApplicationApi
|
File without changes
|
data/lib/napa/generators.rb
CHANGED
@@ -31,9 +31,7 @@ module Napa
|
|
31
31
|
path = normalize_path(request.path_info)
|
32
32
|
|
33
33
|
# Emit stats to StatsD
|
34
|
-
Napa::Stats.emitter.increment('request_count')
|
35
34
|
Napa::Stats.emitter.timing('response_time', response_time)
|
36
|
-
Napa::Stats.emitter.increment("path.#{Napa::Stats.path_to_key(request.request_method, path)}.request_count")
|
37
35
|
Napa::Stats.emitter.timing("path.#{Napa::Stats.path_to_key(request.request_method, path)}.response_time", response_time)
|
38
36
|
|
39
37
|
# Return the results
|
@@ -1,5 +1,9 @@
|
|
1
1
|
module Napa
|
2
2
|
class Entity < Grape::Entity
|
3
|
+
def self.inherited(subclass)
|
4
|
+
ActiveSupport::Deprecation.warn 'Use of Napa::Entity is discouraged, please transition your code to Roar representers - https://github.com/bellycard/napa/blob/master/docs/grape_entity_to_roar.md', caller
|
5
|
+
end
|
6
|
+
|
3
7
|
format_with :to_s do |val|
|
4
8
|
val.to_s
|
5
9
|
end
|
@@ -12,6 +12,35 @@ module Napa
|
|
12
12
|
def response_body
|
13
13
|
last_response.body
|
14
14
|
end
|
15
|
+
|
16
|
+
def result_count
|
17
|
+
parsed_response.data.count
|
18
|
+
end
|
19
|
+
|
20
|
+
def first_result
|
21
|
+
parsed_response.data.first
|
22
|
+
end
|
23
|
+
|
24
|
+
def result_with_id(id)
|
25
|
+
parsed_response.data.select { |r| r.id == id }.first
|
26
|
+
end
|
27
|
+
|
28
|
+
def expect_count_of(count)
|
29
|
+
expect(result_count).to eq(count)
|
30
|
+
end
|
31
|
+
|
32
|
+
def expect_only(object)
|
33
|
+
expect_count_of 1
|
34
|
+
expect(first_result.id).to eq(object.id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def expect_to_have(object)
|
38
|
+
expect(!!result_with_id(object.id)).to be_truthy
|
39
|
+
end
|
40
|
+
|
41
|
+
def expect_to_not_have(object)
|
42
|
+
expect(!!result_with_id(object.id)).to be_falsy
|
43
|
+
end
|
15
44
|
end
|
16
45
|
end
|
17
46
|
end
|
data/lib/napa/setup.rb
CHANGED
@@ -5,6 +5,18 @@ require 'active_support'
|
|
5
5
|
|
6
6
|
module Napa
|
7
7
|
class << self
|
8
|
+
def load_environment
|
9
|
+
Dotenv.load(Napa.env.test? ? '.env.test' : '.env')
|
10
|
+
end
|
11
|
+
|
12
|
+
def skip_initialization
|
13
|
+
@_skip_initialization || false
|
14
|
+
end
|
15
|
+
|
16
|
+
def skip_initialization=(value)
|
17
|
+
@_skip_initialization = value if [TrueClass, FalseClass].include?(value.class)
|
18
|
+
end
|
19
|
+
|
8
20
|
def env
|
9
21
|
@_env ||= ActiveSupport::StringInquirer.new(ENV['RACK_ENV'] || 'development')
|
10
22
|
end
|
@@ -12,5 +24,13 @@ module Napa
|
|
12
24
|
def env=(environment)
|
13
25
|
@_env = ActiveSupport::StringInquirer.new(environment)
|
14
26
|
end
|
27
|
+
|
28
|
+
def cache
|
29
|
+
@_cache ||= ActiveSupport::Cache.lookup_store(:memory_store)
|
30
|
+
end
|
31
|
+
|
32
|
+
def cache=(store_option)
|
33
|
+
@_cache = ActiveSupport::Cache.lookup_store(store_option)
|
34
|
+
end
|
15
35
|
end
|
16
36
|
end
|
data/lib/napa/stats_d_timer.rb
CHANGED
data/lib/napa/version.rb
CHANGED
data/lib/napa.rb
CHANGED
@@ -16,8 +16,10 @@ require 'napa/logger/parseable'
|
|
16
16
|
require 'napa/identity'
|
17
17
|
require 'napa/json_error'
|
18
18
|
require 'napa/stats'
|
19
|
+
require 'napa/stats_d_timer'
|
19
20
|
require 'napa/active_record_extensions/filter_by_hash'
|
20
21
|
require 'napa/active_record_extensions/stats'
|
22
|
+
require 'napa/active_record_extensions/seeder'
|
21
23
|
require 'napa/grape_extensions/error_formatter'
|
22
24
|
require 'napa/grape_extensions/grape_helpers'
|
23
25
|
require 'napa/output_formatters/entity'
|
@@ -31,10 +33,26 @@ require 'napa/middleware/request_stats'
|
|
31
33
|
require 'napa/middleware/database_stats'
|
32
34
|
require 'napa/authentication'
|
33
35
|
|
36
|
+
require 'napa/deprecations'
|
37
|
+
require 'napa/deploy'
|
38
|
+
require 'napa/gem_dependency'
|
39
|
+
|
34
40
|
# load rake tasks if Rake installed
|
35
41
|
if defined?(Rake)
|
36
|
-
load 'tasks/git.rake'
|
37
42
|
load 'tasks/deploy.rake'
|
38
43
|
load 'tasks/routes.rake'
|
39
44
|
load 'tasks/db.rake'
|
40
45
|
end
|
46
|
+
|
47
|
+
module Napa
|
48
|
+
class << self
|
49
|
+
def initialize
|
50
|
+
unless Napa.skip_initialization
|
51
|
+
Napa::Logger.logger.info Napa::GemDependency.log_all if Napa.env.production?
|
52
|
+
Napa::Deprecations.initialization_checks
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Napa.initialize
|
data/lib/tasks/db.rake
CHANGED
@@ -72,5 +72,12 @@ unless defined?(Rails)
|
|
72
72
|
load(file)
|
73
73
|
end
|
74
74
|
end
|
75
|
+
|
76
|
+
desc 'Load the seed data from db/seeds.rb'
|
77
|
+
task :seed => :environment do
|
78
|
+
ActiveRecord::Tasks::DatabaseTasks.seed_loader = Napa::ActiveRecordSeeder.new './db/seeds.rb'
|
79
|
+
ActiveRecord::Tasks::DatabaseTasks.load_seed
|
80
|
+
end
|
81
|
+
|
75
82
|
end
|
76
83
|
end
|
data/lib/tasks/deploy.rake
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
namespace :deploy do
|
2
2
|
desc "Deploy to production"
|
3
3
|
task :production do
|
4
|
-
|
5
|
-
Rake::Task["git:set_tag"].invoke
|
4
|
+
puts "\033[31mrake deploy:production is deprecated, please use 'napa deploy production'\033[0m"
|
6
5
|
end
|
7
6
|
|
8
7
|
desc "Deploy to staging"
|
9
8
|
task :staging do
|
10
|
-
|
11
|
-
Rake::Task["git:set_tag"].invoke("staging")
|
9
|
+
puts "\033[31mrake deploy:staging is deprecated, please use 'napa deploy staging'\033[0m"
|
12
10
|
end
|
13
11
|
end
|
data/lib/tasks/routes.rake
CHANGED
@@ -2,9 +2,10 @@ unless defined?(Rails)
|
|
2
2
|
desc "display all routes for Grape"
|
3
3
|
task :routes do
|
4
4
|
ApplicationApi.routes.each do |api|
|
5
|
-
method
|
6
|
-
path
|
7
|
-
|
5
|
+
method = api.route_method.ljust(10)
|
6
|
+
path = api.route_path.ljust(40)
|
7
|
+
description = api.route_description
|
8
|
+
puts " #{method} #{path} # #{description}"
|
8
9
|
end
|
9
10
|
end
|
10
11
|
end
|