pliny 0.0.3 → 0.0.4
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/README.md +1 -0
- data/bin/pliny-generate +13 -2
- data/bin/pliny-new +9 -2
- data/lib/pliny.rb +16 -15
- data/lib/pliny/commands/creator.rb +24 -4
- data/lib/pliny/commands/generator.rb +22 -16
- data/lib/pliny/config_helpers.rb +10 -0
- data/lib/pliny/helpers/params.rb +21 -0
- data/lib/pliny/middleware/rescue_errors.rb +8 -3
- data/lib/pliny/tasks/db.rake +13 -3
- data/lib/pliny/tasks/schema.rake +8 -0
- data/lib/pliny/templates/endpoint.erb +1 -1
- data/lib/pliny/templates/endpoint_scaffold.erb +3 -3
- data/lib/pliny/templates/endpoint_scaffold_acceptance_test.erb +1 -1
- data/lib/pliny/templates/model.erb +3 -0
- data/lib/pliny/templates/model_migration.erb +2 -0
- data/lib/pliny/templates/serializer.erb +1 -1
- data/lib/pliny/version.rb +1 -1
- data/template/.env.sample +3 -0
- data/template/.env.test +2 -0
- data/template/.ruby-version +1 -1
- data/template/Gemfile +3 -2
- data/template/Gemfile.lock +9 -6
- data/template/config/config.rb +9 -2
- data/template/config/initializers/database.rb +1 -0
- data/template/config/initializers/honeybadger.rb +1 -1
- data/template/db/seeds.rb +6 -0
- data/template/lib/endpoints/base.rb +1 -0
- data/template/lib/initializer.rb +8 -7
- data/template/lib/routes.rb +7 -4
- data/template/spec/spec_helper.rb +4 -0
- data/test/commands/creator_test.rb +17 -1
- data/test/commands/generator_test.rb +13 -9
- data/test/middleware/rescue_errors_test.rb +20 -5
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 337f0a1c9784e2c41009e2aa6001ff6e79b4d5be
|
4
|
+
data.tar.gz: 9d67fc07db66c537931d4ce40c1a072077a49bdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92788bde19907756871bb04f9205c2221be2dcaf557aa72ea323910790712fa5e9cec12fa5fba6503bd6ba243a9ef0f338bae7a35ffbdbdf21dfa2d939571d7b
|
7
|
+
data.tar.gz: ceaea90eaeb893e0ed855a2607b19c535234b24b9cb1877468359037f05b511d173ad423e6a1557a4ea646d01872327a8daa2496eafbb250fe8ec41504ab8a34
|
data/README.md
CHANGED
@@ -17,6 +17,7 @@ And gems/helpers to tie these together and support operations:
|
|
17
17
|
- [CORS middleware](lib/pliny/middleware/cors.rb) to allow JS developers to consume your API
|
18
18
|
- [Honeybadger](https://www.honeybadger.io/) for tracking exceptions
|
19
19
|
- [Log helper](test/log_test.rb) that logs in [data format](https://www.youtube.com/watch?v=rpmc-wHFUBs) [to stdout](https://adam.heroku.com/past/2011/4/1/logs_are_streams_not_files)
|
20
|
+
- [Mediators](http://brandur.org/mediator) to help encapsulate more complex interactions
|
20
21
|
- [Rspec](https://github.com/rspec/rspec) for lean and fast testing
|
21
22
|
- [Puma](http://puma.io/) as the web server, [configured for optimal performance on Heroku](config/puma.rb)
|
22
23
|
- [Rack-test](https://github.com/brynary/rack-test) to test the API endpoints
|
data/bin/pliny-generate
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "optparse"
|
4
|
+
require_relative "../lib/pliny"
|
4
5
|
|
5
|
-
|
6
|
+
ARGV.options do |options|
|
7
|
+
opts = {}
|
8
|
+
|
9
|
+
options.on("--paranoid", "Generate paranoid support in models") do
|
10
|
+
opts[:paranoid] = true
|
11
|
+
end
|
12
|
+
|
13
|
+
options.parse!
|
14
|
+
|
15
|
+
Pliny::Commands::Generator.run(ARGV.dup, opts)
|
16
|
+
end
|
data/bin/pliny-new
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "optparse"
|
4
|
+
require_relative "../lib/pliny"
|
4
5
|
|
5
|
-
|
6
|
+
ARGV.options do |options|
|
7
|
+
opts = {}
|
8
|
+
|
9
|
+
options.parse!
|
10
|
+
|
11
|
+
Pliny::Commands::Creator.run(ARGV.dup, opts)
|
12
|
+
end
|
data/lib/pliny.rb
CHANGED
@@ -1,21 +1,22 @@
|
|
1
1
|
require "multi_json"
|
2
2
|
require "sinatra/base"
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
4
|
+
require_relative "pliny/version"
|
5
|
+
require_relative "pliny/commands/creator"
|
6
|
+
require_relative "pliny/commands/generator"
|
7
|
+
require_relative "pliny/errors"
|
8
|
+
require_relative "pliny/extensions/instruments"
|
9
|
+
require_relative "pliny/helpers/params"
|
10
|
+
require_relative "pliny/log"
|
11
|
+
require_relative "pliny/request_store"
|
12
|
+
require_relative "pliny/router"
|
13
|
+
require_relative "pliny/utils"
|
14
|
+
require_relative "pliny/middleware/cors"
|
15
|
+
require_relative "pliny/middleware/request_id"
|
16
|
+
require_relative "pliny/middleware/request_store"
|
17
|
+
require_relative "pliny/middleware/rescue_errors"
|
18
|
+
require_relative "pliny/middleware/timeout"
|
19
|
+
require_relative "pliny/middleware/versioning"
|
19
20
|
|
20
21
|
module Pliny
|
21
22
|
extend Log
|
@@ -2,14 +2,15 @@ require "fileutils"
|
|
2
2
|
|
3
3
|
module Pliny::Commands
|
4
4
|
class Creator
|
5
|
-
attr_accessor :args, :stream
|
5
|
+
attr_accessor :args, :opts, :stream
|
6
6
|
|
7
|
-
def self.run(args, stream=$stdout)
|
8
|
-
new(args, stream).run!
|
7
|
+
def self.run(args, opts={}, stream=$stdout)
|
8
|
+
new(args, opts, stream).run!
|
9
9
|
end
|
10
10
|
|
11
|
-
def initialize(args={}, stream=$stdout)
|
11
|
+
def initialize(args={}, opts={}, stream=$stdout)
|
12
12
|
@args = args
|
13
|
+
@opts = opts
|
13
14
|
@stream = stream
|
14
15
|
end
|
15
16
|
|
@@ -20,12 +21,31 @@ module Pliny::Commands
|
|
20
21
|
|
21
22
|
FileUtils.copy_entry template_dir, app_dir
|
22
23
|
FileUtils.rm_rf("#{app_dir}/.git")
|
24
|
+
setup_database_urls
|
23
25
|
display "Pliny app created. To start, run:"
|
24
26
|
display "cd #{app_dir} && bin/setup"
|
25
27
|
end
|
26
28
|
|
27
29
|
protected
|
28
30
|
|
31
|
+
def setup_database_urls
|
32
|
+
db = URI.parse("postgres:///#{name}")
|
33
|
+
{
|
34
|
+
".env.sample" => "development",
|
35
|
+
".env.test" => "test"
|
36
|
+
}.each do |env_file, db_env_suffix|
|
37
|
+
env_path = "#{app_dir}/#{env_file}"
|
38
|
+
db.path = "/#{name}-#{db_env_suffix}"
|
39
|
+
env = File.read(env_path)
|
40
|
+
File.open(env_path, "w") do |f|
|
41
|
+
# ruby's URI#to_s renders foo:/bar when there's no host
|
42
|
+
# we want foo:///bar instead!
|
43
|
+
db_url = db.to_s.sub(":/", ":///")
|
44
|
+
f.puts env.sub(/DATABASE_URL=.*/, "DATABASE_URL=#{db_url}")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
29
49
|
def display(msg)
|
30
50
|
stream.puts msg
|
31
51
|
end
|
@@ -6,14 +6,15 @@ require "prmd"
|
|
6
6
|
|
7
7
|
module Pliny::Commands
|
8
8
|
class Generator
|
9
|
-
attr_accessor :args, :stream
|
9
|
+
attr_accessor :args, :opts, :stream
|
10
10
|
|
11
|
-
def self.run(args, stream=$stdout)
|
12
|
-
new(args).run!
|
11
|
+
def self.run(args, opts={}, stream=$stdout)
|
12
|
+
new(args, opts).run!
|
13
13
|
end
|
14
14
|
|
15
|
-
def initialize(args={}, stream=$stdout)
|
15
|
+
def initialize(args={}, opts={}, stream=$stdout)
|
16
16
|
@args = args
|
17
|
+
@opts = opts
|
17
18
|
@stream = stream
|
18
19
|
end
|
19
20
|
|
@@ -39,8 +40,6 @@ module Pliny::Commands
|
|
39
40
|
create_model
|
40
41
|
create_model_migration
|
41
42
|
create_model_test
|
42
|
-
create_serializer
|
43
|
-
create_serializer_test
|
44
43
|
when "scaffold"
|
45
44
|
create_endpoint(scaffold: true)
|
46
45
|
create_endpoint_test
|
@@ -71,6 +70,10 @@ module Pliny::Commands
|
|
71
70
|
args[1]
|
72
71
|
end
|
73
72
|
|
73
|
+
def paranoid
|
74
|
+
opts[:paranoid]
|
75
|
+
end
|
76
|
+
|
74
77
|
def singular_class_name
|
75
78
|
name.gsub(/-/, '_').singularize.camelize
|
76
79
|
end
|
@@ -92,7 +95,7 @@ module Pliny::Commands
|
|
92
95
|
end
|
93
96
|
|
94
97
|
def create_endpoint(options = {})
|
95
|
-
endpoint = "./lib/endpoints/#{
|
98
|
+
endpoint = "./lib/endpoints/#{table_name}.rb"
|
96
99
|
template = options[:scaffold] ? "endpoint_scaffold.erb" : "endpoint.erb"
|
97
100
|
render_template(template, endpoint, {
|
98
101
|
plural_class_name: plural_class_name,
|
@@ -106,7 +109,7 @@ module Pliny::Commands
|
|
106
109
|
end
|
107
110
|
|
108
111
|
def create_endpoint_test
|
109
|
-
test = "./spec/endpoints/#{
|
112
|
+
test = "./spec/endpoints/#{table_name}_spec.rb"
|
110
113
|
render_template("endpoint_test.erb", test, {
|
111
114
|
plural_class_name: plural_class_name,
|
112
115
|
singular_class_name: singular_class_name,
|
@@ -116,7 +119,7 @@ module Pliny::Commands
|
|
116
119
|
end
|
117
120
|
|
118
121
|
def create_endpoint_acceptance_test(options = {})
|
119
|
-
test = "./spec/acceptance/#{
|
122
|
+
test = "./spec/acceptance/#{table_name}_spec.rb"
|
120
123
|
template = options[:scaffold] ? "endpoint_scaffold_acceptance_test.erb" :
|
121
124
|
"endpoint_acceptance_test.erb"
|
122
125
|
render_template(template, test, {
|
@@ -129,13 +132,13 @@ module Pliny::Commands
|
|
129
132
|
end
|
130
133
|
|
131
134
|
def create_mediator
|
132
|
-
mediator = "./lib/mediators/#{
|
135
|
+
mediator = "./lib/mediators/#{field_name}.rb"
|
133
136
|
render_template("mediator.erb", mediator, plural_class_name: plural_class_name)
|
134
137
|
display "created mediator file #{mediator}"
|
135
138
|
end
|
136
139
|
|
137
140
|
def create_mediator_test
|
138
|
-
test = "./spec/mediators/#{
|
141
|
+
test = "./spec/mediators/#{field_name}_spec.rb"
|
139
142
|
render_template("mediator_test.erb", test, plural_class_name: plural_class_name)
|
140
143
|
display "created test #{test}"
|
141
144
|
end
|
@@ -147,26 +150,29 @@ module Pliny::Commands
|
|
147
150
|
end
|
148
151
|
|
149
152
|
def create_model
|
150
|
-
model = "./lib/models/#{
|
151
|
-
render_template("model.erb", model,
|
153
|
+
model = "./lib/models/#{field_name}.rb"
|
154
|
+
render_template("model.erb", model,
|
155
|
+
singular_class_name: singular_class_name,
|
156
|
+
paranoid: paranoid)
|
152
157
|
display "created model file #{model}"
|
153
158
|
end
|
154
159
|
|
155
160
|
def create_model_migration
|
156
161
|
migration = "./db/migrate/#{Time.now.to_i}_create_#{table_name}.rb"
|
157
162
|
render_template("model_migration.erb", migration,
|
158
|
-
table_name: table_name
|
163
|
+
table_name: table_name,
|
164
|
+
paranoid: paranoid)
|
159
165
|
display "created migration #{migration}"
|
160
166
|
end
|
161
167
|
|
162
168
|
def create_model_test
|
163
|
-
test = "./spec/models/#{
|
169
|
+
test = "./spec/models/#{field_name}_spec.rb"
|
164
170
|
render_template("model_test.erb", test, singular_class_name: singular_class_name)
|
165
171
|
display "created test #{test}"
|
166
172
|
end
|
167
173
|
|
168
174
|
def create_schema
|
169
|
-
schema = "./docs/schema/schemata/#{
|
175
|
+
schema = "./docs/schema/schemata/#{field_name}.yaml"
|
170
176
|
write_file(schema) do
|
171
177
|
Prmd.init(name.singularize, yaml: true)
|
172
178
|
end
|
data/lib/pliny/config_helpers.rb
CHANGED
@@ -3,18 +3,28 @@ module Pliny
|
|
3
3
|
def optional(*attrs)
|
4
4
|
attrs.each do |attr|
|
5
5
|
instance_eval "def #{attr}; @#{attr} ||= ENV['#{attr.upcase}'] end", __FILE__, __LINE__
|
6
|
+
ConfigHelpers.add_question_method(attr)
|
6
7
|
end
|
7
8
|
end
|
8
9
|
|
9
10
|
def mandatory(*attrs)
|
10
11
|
attrs.each do |attr|
|
11
12
|
instance_eval "def #{attr}; @#{attr} ||= ENV['#{attr.upcase}'] || raise('missing=#{attr.upcase}') end", __FILE__, __LINE__
|
13
|
+
ConfigHelpers.add_question_method(attr)
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
15
17
|
def override(attrs)
|
16
18
|
attrs.each do |attr, value|
|
17
19
|
instance_eval "def #{attr}; @#{attr} ||= ENV['#{attr.upcase}'] || '#{value}'.to_s end", __FILE__, __LINE__
|
20
|
+
ConfigHelpers.add_question_method(attr)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.add_question_method(attr)
|
25
|
+
define_method "#{attr}?" do
|
26
|
+
return false if send(attr).nil?
|
27
|
+
!!(send(attr) =~ /\Atrue|yes|on\z/i || send(attr).to_i > 0)
|
18
28
|
end
|
19
29
|
end
|
20
30
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pliny::Helpers
|
2
|
+
module Params
|
3
|
+
def body_params
|
4
|
+
@body_params ||= parse_body_params
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def parse_body_params
|
10
|
+
if request.content_type == "application/json"
|
11
|
+
p = indifferent_params(MultiJson.decode(request.body.read))
|
12
|
+
request.body.rewind
|
13
|
+
p
|
14
|
+
elsif request.form_data?
|
15
|
+
indifferent_params(request.POST)
|
16
|
+
else
|
17
|
+
{}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module Pliny::Middleware
|
2
2
|
class RescueErrors
|
3
|
-
def initialize(app)
|
3
|
+
def initialize(app, options = {})
|
4
4
|
@app = app
|
5
|
+
@raise = options[:raise]
|
5
6
|
end
|
6
7
|
|
7
8
|
def call(env)
|
@@ -9,8 +10,12 @@ module Pliny::Middleware
|
|
9
10
|
rescue Pliny::Errors::Error => e
|
10
11
|
render(e, env)
|
11
12
|
rescue Exception => e
|
12
|
-
|
13
|
-
|
13
|
+
if @raise
|
14
|
+
raise
|
15
|
+
else
|
16
|
+
# Pliny.log_exception(e)
|
17
|
+
render(Pliny::Errors::InternalServerError.new, env)
|
18
|
+
end
|
14
19
|
end
|
15
20
|
|
16
21
|
private
|
data/lib/pliny/tasks/db.rake
CHANGED
@@ -36,12 +36,22 @@ namespace :db do
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
desc "Seed the database with data"
|
40
|
+
task :seed do
|
41
|
+
if File.exist?('./db/seeds.rb')
|
42
|
+
database_urls.each do |database_url|
|
43
|
+
Sequel.connect(database_url)
|
44
|
+
load 'db/seeds.rb'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
39
49
|
desc "Reset the database"
|
40
|
-
task :reset => [:nuke, :migrate]
|
50
|
+
task :reset => [:nuke, :migrate, :seed]
|
41
51
|
|
42
52
|
desc "Create the database"
|
43
53
|
task :create do
|
44
|
-
db = Sequel.connect("postgres
|
54
|
+
db = Sequel.connect("postgres:///postgres")
|
45
55
|
database_urls.each do |database_url|
|
46
56
|
exists = false
|
47
57
|
name = name_from_uri(database_url)
|
@@ -57,7 +67,7 @@ namespace :db do
|
|
57
67
|
|
58
68
|
desc "Drop the database"
|
59
69
|
task :drop do
|
60
|
-
db = Sequel.connect("postgres
|
70
|
+
db = Sequel.connect("postgres:///postgres")
|
61
71
|
database_urls.each do |database_url|
|
62
72
|
name = name_from_uri(database_url)
|
63
73
|
db.run(%{DROP DATABASE IF EXISTS "#{name}"})
|
@@ -2,7 +2,7 @@ module Endpoints
|
|
2
2
|
class <%= plural_class_name %> < Base
|
3
3
|
namespace "<%= url_path %>" do
|
4
4
|
before do
|
5
|
-
content_type :json
|
5
|
+
content_type :json, charset: 'utf-8'
|
6
6
|
end
|
7
7
|
|
8
8
|
get do
|
@@ -11,7 +11,7 @@ module Endpoints
|
|
11
11
|
|
12
12
|
post do
|
13
13
|
# warning: not safe
|
14
|
-
<%= field_name %> = <%= singular_class_name %>.new(
|
14
|
+
<%= field_name %> = <%= singular_class_name %>.new(body_params)
|
15
15
|
<%= field_name %>.save
|
16
16
|
status 201
|
17
17
|
MultiJson.encode serialize(<%= field_name %>)
|
@@ -25,7 +25,7 @@ module Endpoints
|
|
25
25
|
patch "/:id" do |id|
|
26
26
|
<%= field_name %> = <%= singular_class_name %>.first(uuid: id) || halt(404)
|
27
27
|
# warning: not safe
|
28
|
-
#<%= field_name %>.update(
|
28
|
+
#<%= field_name %>.update(body_params)
|
29
29
|
MultiJson.encode serialize(<%= field_name %>)
|
30
30
|
end
|
31
31
|
|
@@ -4,7 +4,9 @@ Sequel.migration do
|
|
4
4
|
uuid :uuid, default: Sequel.function(:uuid_generate_v4), primary_key: true
|
5
5
|
timestamptz :created_at, default: Sequel.function(:now), null: false
|
6
6
|
timestamptz :updated_at
|
7
|
+
<% if paranoid %>
|
7
8
|
timestamptz :deleted_at
|
9
|
+
<% end %>
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
data/lib/pliny/version.rb
CHANGED
data/template/.env.sample
CHANGED
data/template/.env.test
CHANGED
data/template/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.2
|
data/template/Gemfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
|
-
ruby "2.1.
|
2
|
+
ruby "2.1.2"
|
3
3
|
|
4
|
-
gem "honeybadger"
|
4
|
+
gem "honeybadger", '~> 1.14'
|
5
5
|
gem "multi_json"
|
6
6
|
gem "oj"
|
7
7
|
gem "pg"
|
@@ -10,6 +10,7 @@ gem "puma"
|
|
10
10
|
gem "rack-ssl"
|
11
11
|
gem "rake"
|
12
12
|
gem "sequel"
|
13
|
+
gem "sequel-paranoid"
|
13
14
|
gem "sequel_pg", require: "sequel"
|
14
15
|
gem "sinatra", require: "sinatra/base"
|
15
16
|
gem "sinatra-contrib", require: ["sinatra/namespace", "sinatra/reloader"]
|
data/template/Gemfile.lock
CHANGED
@@ -18,7 +18,7 @@ GEM
|
|
18
18
|
foreman (0.67.0)
|
19
19
|
dotenv (~> 0.7.0)
|
20
20
|
thor (~> 0.17.0)
|
21
|
-
honeybadger (1.
|
21
|
+
honeybadger (1.15.0)
|
22
22
|
json
|
23
23
|
http_accept (0.1.5)
|
24
24
|
i18n (0.6.9)
|
@@ -27,7 +27,7 @@ GEM
|
|
27
27
|
multi_json (1.10.1)
|
28
28
|
oj (2.9.0)
|
29
29
|
pg (0.17.1)
|
30
|
-
pliny (0.0.
|
30
|
+
pliny (0.0.3)
|
31
31
|
activesupport (~> 4.1, >= 4.1.0)
|
32
32
|
http_accept (~> 0.1, >= 0.1.5)
|
33
33
|
multi_json (~> 1.9, >= 1.9.3)
|
@@ -52,7 +52,9 @@ GEM
|
|
52
52
|
rspec-core (2.14.8)
|
53
53
|
rspec-expectations (2.14.5)
|
54
54
|
diff-lcs (>= 1.1.3, < 2.0)
|
55
|
-
sequel (4.
|
55
|
+
sequel (4.11.0)
|
56
|
+
sequel-paranoid (0.4.3)
|
57
|
+
sequel
|
56
58
|
sequel_pg (1.6.9)
|
57
59
|
pg (>= 0.8.0)
|
58
60
|
sequel (>= 3.39.0)
|
@@ -70,9 +72,9 @@ GEM
|
|
70
72
|
sinatra-router (0.2.3)
|
71
73
|
sinatra (~> 1.4)
|
72
74
|
thor (0.17.0)
|
73
|
-
thread_safe (0.3.
|
75
|
+
thread_safe (0.3.4)
|
74
76
|
tilt (1.4.1)
|
75
|
-
tzinfo (1.1
|
77
|
+
tzinfo (1.2.1)
|
76
78
|
thread_safe (~> 0.1)
|
77
79
|
|
78
80
|
PLATFORMS
|
@@ -82,7 +84,7 @@ DEPENDENCIES
|
|
82
84
|
committee
|
83
85
|
database_cleaner
|
84
86
|
foreman
|
85
|
-
honeybadger
|
87
|
+
honeybadger (~> 1.14)
|
86
88
|
multi_json
|
87
89
|
oj
|
88
90
|
pg
|
@@ -95,6 +97,7 @@ DEPENDENCIES
|
|
95
97
|
rspec-core
|
96
98
|
rspec-expectations
|
97
99
|
sequel
|
100
|
+
sequel-paranoid
|
98
101
|
sequel_pg
|
99
102
|
sinatra
|
100
103
|
sinatra-contrib
|
data/template/config/config.rb
CHANGED
@@ -19,7 +19,10 @@ module Config
|
|
19
19
|
|
20
20
|
# Optional -- value is returned or `nil` if it wasn't present.
|
21
21
|
optional \
|
22
|
-
:
|
22
|
+
:honeybadger_api_key,
|
23
|
+
:placeholder,
|
24
|
+
:versioning_default,
|
25
|
+
:versioning_app_name
|
23
26
|
|
24
27
|
# Override -- value is returned or the set default. Remember to typecast.
|
25
28
|
override \
|
@@ -28,5 +31,9 @@ module Config
|
|
28
31
|
puma_max_threads: 16,
|
29
32
|
puma_min_threads: 1,
|
30
33
|
puma_workers: 3,
|
31
|
-
rack_env:
|
34
|
+
rack_env: 'development',
|
35
|
+
rescue_errors: 'true',
|
36
|
+
timeout: 45,
|
37
|
+
force_ssl: 'true',
|
38
|
+
versioning: 'false'
|
32
39
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Sequel.connect(Config.database_url, max_connections: Config.db_pool)
|
@@ -0,0 +1,6 @@
|
|
1
|
+
# This file should contain all the record creation needed to seed the database
|
2
|
+
# with its default values.
|
3
|
+
# The data can then be loaded with the rake db:seed (or created alongside the
|
4
|
+
# db with db:setup).
|
5
|
+
#
|
6
|
+
# A Sequel database connection can be obtained via Sequel::Model.db
|
data/template/lib/initializer.rb
CHANGED
@@ -1,29 +1,30 @@
|
|
1
1
|
module Initializer
|
2
2
|
def self.run
|
3
3
|
require_config
|
4
|
-
initialize_database
|
5
4
|
require_lib
|
6
5
|
require_initializers
|
6
|
+
require_models
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.require_config
|
10
10
|
require! "config/config"
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.initialize_database
|
14
|
-
Sequel.connect(Config.database_url, max_connections: Config.db_pool)
|
15
|
-
end
|
16
|
-
|
17
13
|
def self.require_lib
|
18
14
|
require! %w(
|
19
15
|
lib/endpoints/base
|
20
16
|
lib/endpoints/**/*
|
21
17
|
lib/mediators/base
|
22
18
|
lib/mediators/**/*
|
23
|
-
lib/models/**/*
|
24
19
|
lib/routes
|
25
20
|
lib/serializers/base
|
26
|
-
lib/serializers
|
21
|
+
lib/serializers/**/*
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.require_models
|
26
|
+
require! %w(
|
27
|
+
lib/models/**/*
|
27
28
|
)
|
28
29
|
end
|
29
30
|
|
data/template/lib/routes.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
Routes = Rack::Builder.new do
|
2
|
-
use Pliny::Middleware::RescueErrors
|
3
|
-
use Honeybadger::Rack
|
2
|
+
use Pliny::Middleware::RescueErrors, raise: !Config.rescue_errors?
|
3
|
+
use Honeybadger::Rack::ErrorNotifier if Config.honeybadger_api_key
|
4
4
|
use Pliny::Middleware::CORS
|
5
5
|
use Pliny::Middleware::RequestID
|
6
6
|
use Pliny::Middleware::RequestStore, store: Pliny::RequestStore
|
7
|
-
use Pliny::Middleware::Timeout, timeout:
|
7
|
+
use Pliny::Middleware::Timeout, timeout: Config.timeout.to_i if Config.timeout.to_i > 0
|
8
|
+
use Pliny::Middleware::Versioning,
|
9
|
+
default: Config.versioning_default,
|
10
|
+
app_name: Config.versioning_app_name if Config.versioning.downcase == 'true'
|
8
11
|
use Rack::Deflater
|
9
12
|
use Rack::MethodOverride
|
10
|
-
use Rack::SSL if Config.
|
13
|
+
use Rack::SSL if Config.force_ssl.downcase == 'true'
|
11
14
|
|
12
15
|
use Pliny::Router do
|
13
16
|
# mount all endpoints here
|
@@ -25,6 +25,10 @@ Pliny::Utils.require_glob("#{Initializer.root}/spec/support/**/*.rb")
|
|
25
25
|
RSpec.configure do |config|
|
26
26
|
config.mock_framework = :rr
|
27
27
|
|
28
|
+
config.before :all do
|
29
|
+
load('db/seeds.rb') if File.exist?('db/seeds.rb')
|
30
|
+
end
|
31
|
+
|
28
32
|
config.before :each do
|
29
33
|
DatabaseCleaner.start
|
30
34
|
end
|
@@ -2,7 +2,7 @@ require "test_helper"
|
|
2
2
|
|
3
3
|
describe Pliny::Commands::Creator do
|
4
4
|
before do
|
5
|
-
@gen = Pliny::Commands::Creator.new(["foobar"], StringIO.new)
|
5
|
+
@gen = Pliny::Commands::Creator.new(["foobar"], {}, StringIO.new)
|
6
6
|
end
|
7
7
|
|
8
8
|
describe "#run!" do
|
@@ -22,5 +22,21 @@ describe Pliny::Commands::Creator do
|
|
22
22
|
@gen.run!
|
23
23
|
refute File.exists?("./foobar/.git")
|
24
24
|
end
|
25
|
+
|
26
|
+
it "changes DATABASE_URL in .env.sample to use the app name" do
|
27
|
+
@gen.run!
|
28
|
+
db_url = File.read("./foobar/.env.sample").split("\n").detect do |line|
|
29
|
+
line.include?("DATABASE_URL=")
|
30
|
+
end
|
31
|
+
assert_equal "DATABASE_URL=postgres:///foobar-development", db_url
|
32
|
+
end
|
33
|
+
|
34
|
+
it "changes DATABASE_URL in .env.test to use the app name" do
|
35
|
+
@gen.run!
|
36
|
+
db_url = File.read("./foobar/.env.test").split("\n").detect do |line|
|
37
|
+
line.include?("DATABASE_URL=")
|
38
|
+
end
|
39
|
+
assert_equal "DATABASE_URL=postgres:///foobar-test", db_url
|
40
|
+
end
|
25
41
|
end
|
26
42
|
end
|
@@ -2,7 +2,19 @@ require "test_helper"
|
|
2
2
|
|
3
3
|
describe Pliny::Commands::Generator do
|
4
4
|
before do
|
5
|
-
@gen = Pliny::Commands::Generator.new({}, StringIO.new)
|
5
|
+
@gen = Pliny::Commands::Generator.new({}, {}, StringIO.new)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#field_name" do
|
9
|
+
it "uses the singular form" do
|
10
|
+
@gen.args = ["model", "resource_histories"]
|
11
|
+
assert_equal "resource_history", @gen.field_name
|
12
|
+
end
|
13
|
+
|
14
|
+
it "handles hyphens as underscores" do
|
15
|
+
@gen.args = ["model", "resource-histories"]
|
16
|
+
assert_equal "resource_history", @gen.field_name
|
17
|
+
end
|
6
18
|
end
|
7
19
|
|
8
20
|
describe "#plural_class_name" do
|
@@ -104,14 +116,6 @@ describe Pliny::Commands::Generator do
|
|
104
116
|
it "creates a test" do
|
105
117
|
assert File.exists?("spec/models/artist_spec.rb")
|
106
118
|
end
|
107
|
-
|
108
|
-
it "creates a serializer" do
|
109
|
-
assert File.exists?("lib/serializers/artist_serializer.rb")
|
110
|
-
end
|
111
|
-
|
112
|
-
it "creates a serializer test" do
|
113
|
-
assert File.exists?("spec/serializers/artist_serializer_spec.rb")
|
114
|
-
end
|
115
119
|
end
|
116
120
|
|
117
121
|
describe "generating scaffolds" do
|
@@ -14,14 +14,11 @@ describe Pliny::Middleware::RescueErrors do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def app
|
17
|
-
|
18
|
-
use Rack::Lint
|
19
|
-
use Pliny::Middleware::RescueErrors
|
20
|
-
run BadMiddleware.new
|
21
|
-
end
|
17
|
+
@app
|
22
18
|
end
|
23
19
|
|
24
20
|
it "intercepts Pliny errors and renders" do
|
21
|
+
@app = new_rack_app
|
25
22
|
get "/api-error"
|
26
23
|
assert_equal 503, last_response.status
|
27
24
|
error_json = MultiJson.decode(last_response.body)
|
@@ -31,6 +28,7 @@ describe Pliny::Middleware::RescueErrors do
|
|
31
28
|
end
|
32
29
|
|
33
30
|
it "intercepts exceptions and renders" do
|
31
|
+
@app = new_rack_app
|
34
32
|
get "/"
|
35
33
|
assert_equal 500, last_response.status
|
36
34
|
error_json = MultiJson.decode(last_response.body)
|
@@ -38,4 +36,21 @@ describe Pliny::Middleware::RescueErrors do
|
|
38
36
|
assert_equal "Internal server error.", error_json["message"]
|
39
37
|
assert_equal 500, error_json["status"]
|
40
38
|
end
|
39
|
+
|
40
|
+
it "raises given the raise option" do
|
41
|
+
@app = new_rack_app(raise: true)
|
42
|
+
assert_raises(RuntimeError) do
|
43
|
+
get "/"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def new_rack_app(options = {})
|
50
|
+
Rack::Builder.new do
|
51
|
+
use Rack::Lint
|
52
|
+
use Pliny::Middleware::RescueErrors, raise: options[:raise]
|
53
|
+
run BadMiddleware.new
|
54
|
+
end
|
55
|
+
end
|
41
56
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pliny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandur Leach
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-06-
|
12
|
+
date: 2014-06-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -205,6 +205,7 @@ files:
|
|
205
205
|
- lib/pliny/config_helpers.rb
|
206
206
|
- lib/pliny/errors.rb
|
207
207
|
- lib/pliny/extensions/instruments.rb
|
208
|
+
- lib/pliny/helpers/params.rb
|
208
209
|
- lib/pliny/log.rb
|
209
210
|
- lib/pliny/middleware/cors.rb
|
210
211
|
- lib/pliny/middleware/request_id.rb
|
@@ -216,6 +217,7 @@ files:
|
|
216
217
|
- lib/pliny/router.rb
|
217
218
|
- lib/pliny/tasks.rb
|
218
219
|
- lib/pliny/tasks/db.rake
|
220
|
+
- lib/pliny/tasks/schema.rake
|
219
221
|
- lib/pliny/tasks/test.rake
|
220
222
|
- lib/pliny/templates/endpoint.erb
|
221
223
|
- lib/pliny/templates/endpoint_acceptance_test.erb
|
@@ -248,9 +250,11 @@ files:
|
|
248
250
|
- template/bin/setup
|
249
251
|
- template/config.ru
|
250
252
|
- template/config/config.rb
|
253
|
+
- template/config/initializers/database.rb
|
251
254
|
- template/config/initializers/honeybadger.rb
|
252
255
|
- template/config/puma.rb
|
253
256
|
- template/db/schema.sql
|
257
|
+
- template/db/seeds.rb
|
254
258
|
- template/docs/schema/meta.json
|
255
259
|
- template/docs/schema/schemata/.gitkeep
|
256
260
|
- template/lib/endpoints/base.rb
|
@@ -296,8 +300,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
296
300
|
version: '0'
|
297
301
|
requirements: []
|
298
302
|
rubyforge_project:
|
299
|
-
rubygems_version: 2.2.
|
303
|
+
rubygems_version: 2.2.2
|
300
304
|
signing_key:
|
301
305
|
specification_version: 4
|
302
306
|
summary: Basic tooling to support API apps in Sinatra
|
303
307
|
test_files: []
|
308
|
+
has_rdoc:
|