napa 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|