napa 0.1.2 → 0.1.3
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.
- data/.rubocop.yml +17 -0
- data/bin/napa +1 -1
- data/lib/generators/scaffold.rb +28 -27
- data/lib/generators/templates/scaffold/.rubocop.yml +14 -0
- data/lib/generators/templates/scaffold/Rakefile +1 -1
- data/lib/generators/templates/scaffold/app/apis/hello_api.rb +3 -3
- data/lib/generators/templates/scaffold/app.rb +6 -6
- data/lib/generators/templates/scaffold/lib/password_protected_helpers.rb +5 -5
- data/lib/generators/templates/scaffold/spec/apis/hello_api_spec.rb +2 -2
- data/lib/generators/templates/scaffold/spec/spec_helper.rb +2 -3
- data/lib/napa/activerecord.rb +1 -1
- data/lib/napa/grape_api.rb +6 -6
- data/lib/napa/logger/log_transaction.rb +1 -1
- data/lib/napa/logger/logger.rb +3 -5
- data/lib/napa/middleware/app_monitor.rb +1 -1
- data/lib/napa/middleware/logger.rb +36 -38
- data/lib/napa/version.rb +11 -11
- data/lib/napa.rb +11 -11
- data/lib/tasks/db.rake +78 -76
- data/napa.gemspec +2 -1
- data/spec/identity_spec.rb +20 -20
- data/spec/logger/log_transaction_spec.rb +7 -7
- data/spec/version_spec.rb +21 -21
- metadata +26 -8
data/.rubocop.yml
ADDED
data/bin/napa
CHANGED
data/lib/generators/scaffold.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Napa
|
2
2
|
module Generators
|
3
3
|
class Scaffold
|
4
|
-
def initialize(app_name, app_path=nil)
|
4
|
+
def initialize(app_name, app_path = nil)
|
5
5
|
@app_name = app_name
|
6
6
|
@app_path = app_path.nil? ? app_name : app_path
|
7
7
|
@template_path = File.expand_path(File.join(File.dirname(__FILE__), 'templates/scaffold'))
|
@@ -13,28 +13,29 @@ module Napa
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def file_list
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
16
|
+
[
|
17
|
+
'app/apis/hello_api.rb',
|
18
|
+
'app/models/.keep',
|
19
|
+
'config/database.yml',
|
20
|
+
'config/initializers/active_record.rb',
|
21
|
+
'config/middleware/honeybadger.rb',
|
22
|
+
'db/migrate/.keep',
|
23
|
+
'lib/tasks/.keep',
|
24
|
+
'log/.keep',
|
25
|
+
'public/.keep',
|
26
|
+
'spec/spec_helper.rb',
|
27
|
+
'spec/apis/hello_api_spec.rb',
|
28
|
+
'tmp/.keep',
|
29
|
+
'.env',
|
30
|
+
'.env.test',
|
31
|
+
'.rubocopy.yml',
|
32
|
+
'.gitignore.tpl',
|
33
|
+
'app.rb',
|
34
|
+
'config.ru',
|
35
|
+
'console',
|
36
|
+
'Gemfile',
|
37
|
+
'Rakefile',
|
38
|
+
'README.md'
|
38
39
|
]
|
39
40
|
end
|
40
41
|
|
@@ -45,8 +46,8 @@ module Napa
|
|
45
46
|
end
|
46
47
|
|
47
48
|
def create_file_with_template(file)
|
48
|
-
template_file = [@template_path, file].join(
|
49
|
-
new_file = [@app_name, file.gsub(/.tpl$/,'')].join(
|
49
|
+
template_file = [@template_path, file].join('/')
|
50
|
+
new_file = [@app_name, file.gsub(/.tpl$/, '')].join('/')
|
50
51
|
|
51
52
|
FileUtils.mkdir_p(File.dirname(new_file))
|
52
53
|
|
@@ -55,7 +56,7 @@ module Napa
|
|
55
56
|
|
56
57
|
# replace template variables
|
57
58
|
file_content.gsub!(/{{app_name}}/, @app_name)
|
58
|
-
File.open(new_file, 'w') { |
|
59
|
+
File.open(new_file, 'w') { |f| f.write(file_content) }
|
59
60
|
else
|
60
61
|
FileUtils.touch(new_file)
|
61
62
|
end
|
@@ -64,4 +65,4 @@ module Napa
|
|
64
65
|
end
|
65
66
|
end
|
66
67
|
end
|
67
|
-
end
|
68
|
+
end
|
@@ -2,10 +2,10 @@ module HelloService
|
|
2
2
|
class API < Grape::API
|
3
3
|
format :json
|
4
4
|
|
5
|
-
resource :hello do
|
6
|
-
desc
|
5
|
+
resource :hello do
|
6
|
+
desc 'Return a Hello World message'
|
7
7
|
get do
|
8
|
-
{message:
|
8
|
+
{ message: 'Hello Wonderful World!' }
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -3,19 +3,19 @@ Bundler.setup(:default)
|
|
3
3
|
require 'napa'
|
4
4
|
Bundler.require(:default, Napa.env.to_sym)
|
5
5
|
require 'will_paginate'
|
6
|
-
require 'will_paginate/active_record'
|
6
|
+
require 'will_paginate/active_record'
|
7
7
|
|
8
8
|
# load environment
|
9
|
-
Dotenv.load(Napa.env.test? ?
|
9
|
+
Dotenv.load(Napa.env.test? ? '.env.test' : '.env')
|
10
10
|
|
11
11
|
# autoload lib
|
12
|
-
Dir['./lib/**/**/*.rb'].map {|file| require file }
|
12
|
+
Dir['./lib/**/**/*.rb'].map { |file| require file }
|
13
13
|
|
14
14
|
# autoload initalizers
|
15
|
-
Dir['./config/initializers/**/*.rb'].map {|file| require file }
|
15
|
+
Dir['./config/initializers/**/*.rb'].map { |file| require file }
|
16
16
|
|
17
17
|
# load middleware configs
|
18
|
-
Dir['./config/middleware/**/*.rb'].map {|file| require file }
|
18
|
+
Dir['./config/middleware/**/*.rb'].map { |file| require file }
|
19
19
|
|
20
20
|
# autoload app
|
21
|
-
Dir['./app/**/**/*.rb'].map {|file| require file }
|
21
|
+
Dir['./app/**/**/*.rb'].map { |file| require file }
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module PasswordProtectedHelpers
|
2
2
|
if ENV['HEADER_PASSWORDS']
|
3
|
-
PW_ARRAY = ENV['HEADER_PASSWORDS'].split(',').
|
3
|
+
PW_ARRAY = ENV['HEADER_PASSWORDS'].split(',').map { |pw| pw.strip }.freeze
|
4
4
|
else
|
5
5
|
PW_ARRAY = [nil].freeze
|
6
6
|
end
|
7
7
|
|
8
|
-
def authenticate
|
9
|
-
error!(
|
10
|
-
:
|
11
|
-
:
|
8
|
+
def authenticate(headers)
|
9
|
+
error!(error: {
|
10
|
+
code: 'bad_password',
|
11
|
+
message: 'bad password' }
|
12
12
|
) unless PW_ARRAY.include? headers['Password']
|
13
13
|
end
|
14
14
|
|
@@ -10,8 +10,8 @@ describe HelloService::API do
|
|
10
10
|
describe 'GET /hello' do
|
11
11
|
it 'returns a hello world message' do
|
12
12
|
get '/hello'
|
13
|
-
expect(last_response.body).to eq({message:
|
13
|
+
expect(last_response.body).to eq({ message: 'Hello Wonderful World!' }.to_json)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
end
|
17
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
ENV['RACK_ENV'] = 'test'
|
2
2
|
|
3
3
|
require 'webmock/rspec'
|
4
|
-
require
|
4
|
+
require 'rack/test'
|
5
5
|
require 'simplecov'
|
6
6
|
require 'factory_girl'
|
7
7
|
|
@@ -14,8 +14,7 @@ require 'database_cleaner'
|
|
14
14
|
|
15
15
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
16
16
|
# in spec/support/ and its subdirectories.
|
17
|
-
Dir[
|
18
|
-
|
17
|
+
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
19
18
|
|
20
19
|
RSpec.configure do |config|
|
21
20
|
config.include FactoryGirl::Syntax::Methods
|
data/lib/napa/activerecord.rb
CHANGED
data/lib/napa/grape_api.rb
CHANGED
@@ -2,14 +2,14 @@ require 'grape'
|
|
2
2
|
require 'grape-swagger'
|
3
3
|
|
4
4
|
class Napa::GrapeAPI < Grape::API
|
5
|
-
|
5
|
+
|
6
6
|
def after
|
7
|
-
@app_response[1][
|
8
|
-
@app_response[1][
|
9
|
-
@app_response[1][
|
7
|
+
@app_response[1]['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
|
8
|
+
@app_response[1]['Pragma'] = 'no-cache'
|
9
|
+
@app_response[1]['Expires'] = 'Fri, 01 Jan 1990 00:00:00 GMT'
|
10
10
|
@app_response
|
11
11
|
end
|
12
12
|
|
13
13
|
add_swagger_documentation
|
14
|
-
|
15
|
-
end
|
14
|
+
|
15
|
+
end
|
data/lib/napa/logger/logger.rb
CHANGED
@@ -13,17 +13,15 @@ module Napa
|
|
13
13
|
unless @logger
|
14
14
|
Logging.appenders.stdout(
|
15
15
|
'stdout',
|
16
|
-
:
|
16
|
+
layout: Logging.layouts.json
|
17
17
|
)
|
18
18
|
Logging.appenders.file(
|
19
19
|
"log/#{Napa.env}.log",
|
20
|
-
:
|
20
|
+
layout: Logging.layouts.json
|
21
21
|
)
|
22
22
|
|
23
23
|
@logger = Logging.logger["[#{name}]"]
|
24
|
-
unless Napa.env.test?
|
25
|
-
@logger.add_appenders 'stdout'
|
26
|
-
end
|
24
|
+
@logger.add_appenders 'stdout' unless Napa.env.test?
|
27
25
|
@logger.add_appenders "log/#{Napa.env}.log"
|
28
26
|
end
|
29
27
|
|
@@ -7,7 +7,7 @@ module Napa
|
|
7
7
|
|
8
8
|
def call(env)
|
9
9
|
if env['REQUEST_PATH'] == '/health'
|
10
|
-
[200, {'Content-type' => 'application/json'}, [Napa::Identity.health.to_json]]
|
10
|
+
[200, { 'Content-type' => 'application/json' }, [Napa::Identity.health.to_json]]
|
11
11
|
else
|
12
12
|
@app.call(env)
|
13
13
|
end
|
@@ -6,9 +6,6 @@ module Napa
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def call(env)
|
9
|
-
# set transaction_id
|
10
|
-
transaction_id=SecureRandom.uuid
|
11
|
-
|
12
9
|
# log the request
|
13
10
|
Napa::Logger.logger.debug format_request(env)
|
14
11
|
|
@@ -25,45 +22,46 @@ module Napa
|
|
25
22
|
Napa::LogTransaction.clear
|
26
23
|
end
|
27
24
|
|
28
|
-
|
29
|
-
def format_request(env)
|
30
|
-
request = Rack::Request.new(env)
|
31
|
-
params = request.params
|
32
|
-
begin
|
33
|
-
params = JSON.parse(request.body.read) if env['CONTENT_TYPE'] == 'application/json'
|
34
|
-
rescue
|
35
|
-
# do nothing, params is already set
|
36
|
-
end
|
25
|
+
private
|
37
26
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
}
|
47
|
-
request_data[:user_id] = current_user.try(:id) if defined?(current_user)
|
48
|
-
{request: request_data}
|
49
|
-
end
|
27
|
+
def format_request(env)
|
28
|
+
request = Rack::Request.new(env)
|
29
|
+
params = request.params
|
30
|
+
begin
|
31
|
+
params = JSON.parse(request.body.read) if env['CONTENT_TYPE'] == 'application/json'
|
32
|
+
rescue
|
33
|
+
# do nothing, params is already set
|
34
|
+
end
|
50
35
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
36
|
+
request_data = {
|
37
|
+
method: env['REQUEST_METHOD'],
|
38
|
+
path: env['PATH_INFO'],
|
39
|
+
query: env['QUERY_STRING'],
|
40
|
+
host: Napa::Identity.hostname,
|
41
|
+
pid: Napa::Identity.pid,
|
42
|
+
revision: Napa::Identity.revision,
|
43
|
+
params: params
|
44
|
+
}
|
45
|
+
request_data[:user_id] = current_user.try(:id) if defined?(current_user)
|
46
|
+
{ request: request_data }
|
57
47
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
48
|
+
|
49
|
+
def format_response(status, headers, body)
|
50
|
+
response_body = nil
|
51
|
+
begin
|
52
|
+
response_body = body.respond_to?(:body) ? body.body.map { |r| r } : nil
|
53
|
+
rescue
|
54
|
+
response_body = body.inspect
|
55
|
+
end
|
56
|
+
|
57
|
+
{ response:
|
58
|
+
{
|
59
|
+
status: status,
|
60
|
+
headers: headers,
|
61
|
+
response: response_body
|
62
|
+
}
|
64
63
|
}
|
65
|
-
|
66
|
-
end
|
64
|
+
end
|
67
65
|
end
|
68
66
|
end
|
69
67
|
end
|
data/lib/napa/version.rb
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
module Napa
|
2
|
-
VERSION =
|
2
|
+
VERSION = '0.1.3'
|
3
3
|
|
4
4
|
class Version
|
5
5
|
class << self
|
6
6
|
def next_major
|
7
|
-
|
7
|
+
next_level(:major)
|
8
8
|
end
|
9
9
|
|
10
10
|
def next_minor
|
11
|
-
|
11
|
+
next_level(:minor)
|
12
12
|
end
|
13
13
|
|
14
14
|
def next_patch
|
15
|
-
|
15
|
+
next_level(:patch)
|
16
16
|
end
|
17
17
|
|
18
18
|
def next_level(level)
|
19
|
-
|
19
|
+
fail 'Unidentified Level' unless [:major, :minor, :patch].include?(level)
|
20
20
|
|
21
|
-
parts = Napa::VERSION.split('.').map{|p| p.to_i}
|
21
|
+
parts = Napa::VERSION.split('.').map { |p| p.to_i }
|
22
22
|
|
23
23
|
if level == :major
|
24
|
-
parts[0] += 1
|
24
|
+
parts[0] += 1
|
25
25
|
significant_index = 1
|
26
26
|
end
|
27
27
|
|
28
28
|
if level == :minor
|
29
|
-
parts[1] += 1
|
30
|
-
significant_index = 2
|
29
|
+
parts[1] += 1
|
30
|
+
significant_index = 2
|
31
31
|
end
|
32
32
|
|
33
33
|
if level == :patch
|
34
|
-
parts[2] += 1
|
34
|
+
parts[2] += 1
|
35
35
|
significant_index = 3
|
36
36
|
end
|
37
37
|
|
38
|
-
parts.map.with_index{|p,i| parts[i] = 0 if i >= significant_index}
|
38
|
+
parts.map.with_index { |p, i| parts[i] = 0 if i >= significant_index }
|
39
39
|
|
40
40
|
parts.join('.')
|
41
41
|
end
|
data/lib/napa.rb
CHANGED
@@ -6,19 +6,19 @@ require 'octokit'
|
|
6
6
|
require 'grape'
|
7
7
|
|
8
8
|
# require internal files
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
9
|
+
require 'napa/version'
|
10
|
+
require 'napa/logger/logger'
|
11
|
+
require 'napa/logger/log_transaction'
|
12
|
+
require 'napa/identity'
|
13
|
+
require 'napa/middleware/logger'
|
14
|
+
require 'napa/middleware/app_monitor'
|
15
|
+
require 'napa/activerecord'
|
16
|
+
require 'napa/grape_api'
|
17
|
+
require 'generators/scaffold'
|
18
18
|
|
19
19
|
# load rake tasks if Rake installed
|
20
20
|
if defined?(Rake)
|
21
|
-
|
21
|
+
load 'tasks/git.rake'
|
22
22
|
load 'tasks/deploy.rake'
|
23
23
|
load 'tasks/routes.rake'
|
24
24
|
load 'tasks/db.rake'
|
@@ -27,7 +27,7 @@ end
|
|
27
27
|
module Napa
|
28
28
|
class << self
|
29
29
|
def env
|
30
|
-
@_env ||= ActiveSupport::StringInquirer.new(ENV[
|
30
|
+
@_env ||= ActiveSupport::StringInquirer.new(ENV['RACK_ENV'] || 'development')
|
31
31
|
end
|
32
32
|
|
33
33
|
def env=(environment)
|
data/lib/tasks/db.rake
CHANGED
@@ -1,87 +1,89 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
unless defined?(Rails)
|
2
|
+
task :environment do
|
3
|
+
require 'erb'
|
4
|
+
require './app'
|
4
5
|
|
5
|
-
|
6
|
-
end
|
7
|
-
|
8
|
-
namespace :db do
|
9
|
-
desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x"
|
10
|
-
task :migrate => :environment do
|
11
|
-
ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil )
|
12
|
-
Rake::Task["db:schema:dump"].invoke
|
6
|
+
raise "ActiveRecord Not Found" unless Module.const_defined?(:ActiveRecord)
|
13
7
|
end
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
9
|
+
namespace :db do
|
10
|
+
desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x"
|
11
|
+
task :migrate => :environment do
|
12
|
+
ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil )
|
13
|
+
Rake::Task["db:schema:dump"].invoke unless Napa.env.production?
|
14
|
+
end
|
22
15
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
16
|
+
desc "Create the database"
|
17
|
+
task :create => :environment do
|
18
|
+
db = YAML.load(ERB.new(File.read('./config/database.yml')).result)[Napa.env]
|
19
|
+
adapter = db.merge({'database'=> 'mysql'})
|
20
|
+
ActiveRecord::Base.establish_connection(adapter)
|
21
|
+
ActiveRecord::Base.connection.create_database(db.fetch('database'))
|
22
|
+
end
|
30
23
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
24
|
+
desc "Delete the database"
|
25
|
+
task :drop => :environment do
|
26
|
+
db = YAML.load(ERB.new(File.read('./config/database.yml')).result)[Napa.env]
|
27
|
+
adapter = db.merge({'database'=> 'mysql'})
|
28
|
+
ActiveRecord::Base.establish_connection(adapter)
|
29
|
+
ActiveRecord::Base.connection.drop_database(db.fetch('database'))
|
30
|
+
end
|
37
31
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
# Find migration name from env
|
44
|
-
migration_name = ENV['NAME'].strip.chomp
|
45
|
-
|
46
|
-
# Define migrations path (needed later)
|
47
|
-
migrations_path = './db/migrate'
|
48
|
-
|
49
|
-
# Find the highest existing migration version or set to 1
|
50
|
-
if (existing_migrations = Dir[File.join(migrations_path, '*.rb')]).length > 0
|
51
|
-
version = File.basename(existing_migrations.sort.reverse.first)[/^(\d+)_/,1].to_i + 1
|
52
|
-
else
|
53
|
-
version = 1
|
54
|
-
end
|
55
|
-
|
56
|
-
# Use the migration template to fill the body of the migration
|
57
|
-
migration_content = Napa::ActiveRecord.migration_template(migration_name.camelize)
|
58
|
-
|
59
|
-
# Generate migration filename
|
60
|
-
migration_filename = "#{"%03d" % version}_#{migration_name}.rb"
|
61
|
-
|
62
|
-
# Write the migration
|
63
|
-
File.open(File.join(migrations_path, migration_filename), "w+") do |migration|
|
64
|
-
migration.puts migration_content
|
65
|
-
end
|
66
|
-
|
67
|
-
# Done!
|
68
|
-
puts "Successfully created migration #{migration_filename}"
|
32
|
+
desc "Create the test database"
|
33
|
+
task :reset => :environment do
|
34
|
+
Rake::Task["db:drop"].invoke
|
35
|
+
Rake::Task["db:create"].invoke
|
36
|
+
Rake::Task["db:schema:load"].invoke
|
69
37
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
38
|
+
|
39
|
+
namespace :generate do
|
40
|
+
desc "Generate a migration with given name. Specify migration name with NAME=my_migration_name"
|
41
|
+
task :migration => :environment do
|
42
|
+
raise "Please specify desired migration name with NAME=my_migration_name" unless ENV['NAME']
|
43
|
+
|
44
|
+
# Find migration name from env
|
45
|
+
migration_name = ENV['NAME'].strip.chomp
|
46
|
+
|
47
|
+
# Define migrations path (needed later)
|
48
|
+
migrations_path = './db/migrate'
|
49
|
+
|
50
|
+
# Find the highest existing migration version or set to 1
|
51
|
+
if (existing_migrations = Dir[File.join(migrations_path, '*.rb')]).length > 0
|
52
|
+
version = File.basename(existing_migrations.sort.reverse.first)[/^(\d+)_/,1].to_i + 1
|
53
|
+
else
|
54
|
+
version = 1
|
55
|
+
end
|
56
|
+
|
57
|
+
# Use the migration template to fill the body of the migration
|
58
|
+
migration_content = Napa::ActiveRecord.migration_template(migration_name.camelize)
|
59
|
+
|
60
|
+
# Generate migration filename
|
61
|
+
migration_filename = "#{"%03d" % version}_#{migration_name}.rb"
|
62
|
+
|
63
|
+
# Write the migration
|
64
|
+
File.open(File.join(migrations_path, migration_filename), "w+") do |migration|
|
65
|
+
migration.puts migration_content
|
66
|
+
end
|
67
|
+
|
68
|
+
# Done!
|
69
|
+
puts "Successfully created migration #{migration_filename}"
|
78
70
|
end
|
79
71
|
end
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
72
|
+
|
73
|
+
namespace :schema do
|
74
|
+
desc "Create a db/schema.rb file that can be portably used against any DB supported by AR"
|
75
|
+
task :dump => :environment do
|
76
|
+
require 'active_record/schema_dumper'
|
77
|
+
File.open(ENV['SCHEMA'] || "db/schema.rb", "w") do |file|
|
78
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "Load a schema.rb file into the database"
|
83
|
+
task :load => :environment do
|
84
|
+
file = ENV['SCHEMA'] || "db/schema.rb"
|
85
|
+
load(file)
|
86
|
+
end
|
85
87
|
end
|
86
88
|
end
|
87
|
-
end
|
89
|
+
end
|
data/napa.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.add_dependency 'logging'
|
21
21
|
gem.add_dependency 'dotenv'
|
22
22
|
gem.add_dependency 'octokit', '~> 1.25'
|
23
|
-
gem.add_dependency 'virtus'
|
23
|
+
gem.add_dependency 'virtus'
|
24
24
|
gem.add_dependency 'grape'
|
25
25
|
gem.add_dependency 'grape-swagger'
|
26
26
|
gem.add_dependency 'unicorn'
|
@@ -28,4 +28,5 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.add_development_dependency "rspec"
|
29
29
|
gem.add_development_dependency "pry"
|
30
30
|
gem.add_development_dependency "git"
|
31
|
+
gem.add_development_dependency "rubocop"
|
31
32
|
end
|
data/spec/identity_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'napa/identity'
|
3
3
|
|
4
4
|
describe Napa::Identity do
|
5
|
-
context
|
5
|
+
context '#name' do
|
6
6
|
it "returns 'api-service' if no ENV['SERVICE_NAME'] is set" do
|
7
7
|
ENV['SERVICE_NAME'] = nil
|
8
8
|
Napa::Identity.name.should == 'api-service'
|
@@ -11,40 +11,40 @@ describe Napa::Identity do
|
|
11
11
|
it "returns the ENV['SERVICE_NAME'] when specified" do
|
12
12
|
ENV['SERVICE_NAME'] = nil
|
13
13
|
ENV['SERVICE_NAME'] = 'my-service'
|
14
|
-
Napa::Identity.name.should
|
14
|
+
Napa::Identity.name.should eq('my-service')
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
context
|
19
|
-
it
|
20
|
-
Napa::Identity.should_receive(:`).with(
|
21
|
-
Napa::Identity.hostname.should
|
18
|
+
context '#hostname' do
|
19
|
+
it 'returns the value of the hostname system call and doesn\'t make a second system call' do
|
20
|
+
Napa::Identity.should_receive(:`).with('hostname').and_return('system-hostname')
|
21
|
+
Napa::Identity.hostname.should eq('system-hostname')
|
22
22
|
|
23
|
-
Napa::Identity.should_not_receive(:`).with(
|
24
|
-
Napa::Identity.hostname.should
|
23
|
+
Napa::Identity.should_not_receive(:`).with('hostname')
|
24
|
+
Napa::Identity.hostname.should eq('system-hostname')
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
context
|
29
|
-
it
|
30
|
-
Napa::Identity.should_receive(:`).with(
|
31
|
-
Napa::Identity.revision.should
|
28
|
+
context '#revision' do
|
29
|
+
it 'returns the value of the \'git rev-parse HEAD\' system call and doesn\'t make a second system call' do
|
30
|
+
Napa::Identity.should_receive(:`).with('git rev-parse HEAD').and_return('12345')
|
31
|
+
Napa::Identity.revision.should eq('12345')
|
32
32
|
|
33
|
-
Napa::Identity.should_not_receive(:`).with(
|
34
|
-
Napa::Identity.revision.should
|
33
|
+
Napa::Identity.should_not_receive(:`).with('git rev-parse HEAD')
|
34
|
+
Napa::Identity.revision.should eq('12345')
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
context
|
39
|
-
it
|
38
|
+
context '#pid' do
|
39
|
+
it 'returns the process ID value' do
|
40
40
|
Process.stub(:pid).and_return(112233)
|
41
|
-
Napa::Identity.pid.should
|
41
|
+
Napa::Identity.pid.should be(112233)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
context
|
46
|
-
it
|
45
|
+
context '#platform_revision' do
|
46
|
+
it 'returns the current version of the platform gem' do
|
47
47
|
Napa::Identity.platform_revision.should == Napa::VERSION
|
48
48
|
end
|
49
49
|
end
|
50
|
-
end
|
50
|
+
end
|
@@ -6,29 +6,29 @@ describe Napa::LogTransaction do
|
|
6
6
|
Napa::LogTransaction.clear
|
7
7
|
end
|
8
8
|
|
9
|
-
context
|
10
|
-
it
|
9
|
+
context '#id' do
|
10
|
+
it 'returns the current transaction id if it has been set' do
|
11
11
|
id = SecureRandom.hex(10)
|
12
12
|
Thread.current[:napa_tid] = id
|
13
13
|
Napa::LogTransaction.id.should == id
|
14
14
|
end
|
15
15
|
|
16
|
-
it
|
16
|
+
it 'sets and returns a new id if the transaction id hasn\'t been set' do
|
17
17
|
Napa::LogTransaction.id.should_not be_nil
|
18
18
|
end
|
19
19
|
|
20
|
-
it
|
20
|
+
it 'allows the id to be overridden by a setter' do
|
21
21
|
Napa::LogTransaction.id.should_not be_nil
|
22
22
|
Napa::LogTransaction.id = 'foo'
|
23
23
|
Napa::LogTransaction.id.should == 'foo'
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
context
|
28
|
-
it
|
27
|
+
context '#clear' do
|
28
|
+
it 'sets the id to nil' do
|
29
29
|
Napa::LogTransaction.id.should_not be_nil
|
30
30
|
Napa::LogTransaction.clear
|
31
31
|
Thread.current[:napa_tid].should be_nil
|
32
32
|
end
|
33
33
|
end
|
34
|
-
end
|
34
|
+
end
|
data/spec/version_spec.rb
CHANGED
@@ -2,39 +2,39 @@ require 'spec_helper'
|
|
2
2
|
require 'napa/version'
|
3
3
|
|
4
4
|
describe Napa::Version do
|
5
|
-
context
|
6
|
-
it
|
7
|
-
stub_const(
|
8
|
-
Napa::Version.next_major.should ==
|
5
|
+
context '#major_bump' do
|
6
|
+
it 'should set the major revision value, and the rest should be 0' do
|
7
|
+
stub_const('Napa::VERSION', '1.2.3')
|
8
|
+
Napa::Version.next_major.should == '2.0.0'
|
9
9
|
end
|
10
10
|
|
11
|
-
it
|
12
|
-
stub_const(
|
13
|
-
Napa::Version.next_major.should ==
|
11
|
+
it 'should set the major revision value, and the rest should be 0' do
|
12
|
+
stub_const('Napa::VERSION', '5.0.0')
|
13
|
+
Napa::Version.next_major.should == '6.0.0'
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
context
|
18
|
-
it
|
19
|
-
stub_const(
|
20
|
-
Napa::Version.next_minor.should ==
|
17
|
+
context '#minor_bump' do
|
18
|
+
it 'should set the minor revision value, leaving the major value unchanged and the patch value to 0' do
|
19
|
+
stub_const('Napa::VERSION', '1.2.3')
|
20
|
+
Napa::Version.next_minor.should == '1.3.0'
|
21
21
|
end
|
22
22
|
|
23
|
-
it
|
24
|
-
stub_const(
|
25
|
-
Napa::Version.next_minor.should ==
|
23
|
+
it 'should set the minor revision value, leaving the major value unchanged and the patch value to 0' do
|
24
|
+
stub_const('Napa::VERSION', '0.5.0')
|
25
|
+
Napa::Version.next_minor.should == '0.6.0'
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
context
|
30
|
-
it
|
31
|
-
stub_const(
|
32
|
-
Napa::Version.next_patch.should ==
|
29
|
+
context 'patch_bump' do
|
30
|
+
it 'should set the patch revision value, leaving the major and minor values unchanged' do
|
31
|
+
stub_const('Napa::VERSION', '1.2.3')
|
32
|
+
Napa::Version.next_patch.should == '1.2.4'
|
33
33
|
end
|
34
34
|
|
35
|
-
it
|
36
|
-
stub_const(
|
37
|
-
Napa::Version.next_patch.should ==
|
35
|
+
it 'should set the patch revision value, leaving the major and minor values unchanged' do
|
36
|
+
stub_const('Napa::VERSION', '5.5.5')
|
37
|
+
Napa::Version.next_patch.should == '5.5.6'
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: napa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -80,17 +80,17 @@ dependencies:
|
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
|
-
- - '
|
83
|
+
- - ! '>='
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version: 0
|
85
|
+
version: '0'
|
86
86
|
type: :runtime
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
89
|
none: false
|
90
90
|
requirements:
|
91
|
-
- - '
|
91
|
+
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version: 0
|
93
|
+
version: '0'
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
95
|
name: grape
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -187,6 +187,22 @@ dependencies:
|
|
187
187
|
- - ! '>='
|
188
188
|
- !ruby/object:Gem::Version
|
189
189
|
version: '0'
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: rubocop
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
194
|
+
requirements:
|
195
|
+
- - ! '>='
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '0'
|
198
|
+
type: :development
|
199
|
+
prerelease: false
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - ! '>='
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: '0'
|
190
206
|
description: A simple framework for building APIs with Grape
|
191
207
|
email:
|
192
208
|
- darby@bellycard.com
|
@@ -196,6 +212,7 @@ extensions: []
|
|
196
212
|
extra_rdoc_files: []
|
197
213
|
files:
|
198
214
|
- .gitignore
|
215
|
+
- .rubocop.yml
|
199
216
|
- Gemfile
|
200
217
|
- LICENSE
|
201
218
|
- README.md
|
@@ -205,6 +222,7 @@ files:
|
|
205
222
|
- lib/generators/templates/scaffold/.env
|
206
223
|
- lib/generators/templates/scaffold/.env.test
|
207
224
|
- lib/generators/templates/scaffold/.gitignore.tpl
|
225
|
+
- lib/generators/templates/scaffold/.rubocop.yml
|
208
226
|
- lib/generators/templates/scaffold/Gemfile
|
209
227
|
- lib/generators/templates/scaffold/README.md
|
210
228
|
- lib/generators/templates/scaffold/Rakefile
|
@@ -252,7 +270,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
252
270
|
version: '0'
|
253
271
|
segments:
|
254
272
|
- 0
|
255
|
-
hash: -
|
273
|
+
hash: -3815573023004026351
|
256
274
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
257
275
|
none: false
|
258
276
|
requirements:
|
@@ -261,7 +279,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
261
279
|
version: '0'
|
262
280
|
segments:
|
263
281
|
- 0
|
264
|
-
hash: -
|
282
|
+
hash: -3815573023004026351
|
265
283
|
requirements: []
|
266
284
|
rubyforge_project:
|
267
285
|
rubygems_version: 1.8.25
|