grape_bootstrap 0.0.1
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 +15 -0
- data/bin/grape +3 -0
- data/grape-bootstrap.gemspec +28 -0
- data/lib/grape_bootstrap.rb +2 -0
- data/lib/grape_bootstrap/cli.rb +6 -0
- data/lib/grape_bootstrap/commands/app_init.rb +72 -0
- data/lib/grape_bootstrap/commands/application.rb +15 -0
- data/lib/grape_bootstrap/commands/base.rb +14 -0
- data/lib/grape_bootstrap/commands/generate.rb +50 -0
- data/lib/grape_bootstrap/commands/help.rb +6 -0
- data/lib/grape_bootstrap/templates/Gemfile.erb +11 -0
- data/lib/grape_bootstrap/templates/README.md.erb +1 -0
- data/lib/grape_bootstrap/templates/Rakefile.erb +66 -0
- data/lib/grape_bootstrap/templates/app/api/base.rb.erb +30 -0
- data/lib/grape_bootstrap/templates/app/api/status.rb.erb +6 -0
- data/lib/grape_bootstrap/templates/app/models/new.rb.erb +5 -0
- data/lib/grape_bootstrap/templates/application.rb.erb +40 -0
- data/lib/grape_bootstrap/templates/config.ru.erb +3 -0
- data/lib/grape_bootstrap/templates/config/database.yml.erb +15 -0
- data/lib/grape_bootstrap/templates/config/environments/development.rb.erb +3 -0
- data/lib/grape_bootstrap/templates/environment.rb.erb +24 -0
- data/lib/grape_bootstrap/templates/public/index.html.erb +9 -0
- data/lib/grape_bootstrap/version.rb +3 -0
- metadata +110 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
M2U4NGQ2NjcyODMzYmFkM2MxNzE3Yzc4YjlhMmM1MDIxM2RkZWQxYg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MGY1MzlkMWU3YzlhOTQ1YjE4NzA5NTEyMjIzM2Q5ZGQ0YjFjNDQ5OA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZTk3Y2U1YjI3MjZjZTRmM2NkMWE1YTM2ZDIyZWQ0NTM4NzdjM2U2MjZmZDkw
|
10
|
+
N2U4MGQ3Yjc0YmNkZjQ3MWE1NDkxZmZmMmI0ZGIwMGU1NjdjZjNkZmU0ODU4
|
11
|
+
YzI3YWVmMjc0NjdiM2Y5MmU0NTkxZDI3NjFlMmNiZjQ5MWMzZWY=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YjE4OGIzNmJkZWMwMTU2NjRmYjdhODJmNzIxYzc3ODhjYTM1MDE4NTkyOWUy
|
14
|
+
OWY1NmQ3N2E0MmRmZjRmM2MwYjEyMzkwY2Q4N2JmNzI4MjUxZjczYTRhZGMw
|
15
|
+
ODI1OTliNjE2ODFlY2FmYjQwMGViNGNiNzg2Yjk4MzhkMDI2OTg=
|
data/bin/grape
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/grape_bootstrap/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Mate Marjai"]
|
6
|
+
gem.email = ["mate.marjai@gmail.com"]
|
7
|
+
gem.description = %q{This library contains an executable to bootstrap and scaffold the minimum for a grape REST API.}
|
8
|
+
gem.summary = %q{Grape REST API bootstrap.}
|
9
|
+
gem.homepage = "https://github.com/marjaimate/grape-bootstrap"
|
10
|
+
gem.license = "MIT"
|
11
|
+
|
12
|
+
gem.files = [
|
13
|
+
Dir.glob("lib/**/*.rb"),
|
14
|
+
Dir.glob("lib/**/*.erb"),
|
15
|
+
Dir.glob("bin/*"),
|
16
|
+
['grape-bootstrap.gemspec']
|
17
|
+
].inject(:+)
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
19
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
20
|
+
gem.name = "grape_bootstrap"
|
21
|
+
gem.require_paths = ["lib"]
|
22
|
+
gem.version = GrapeBootstrap::VERSION
|
23
|
+
|
24
|
+
# Declare the gem dependecies
|
25
|
+
gem.add_dependency('grape', '~> 0')
|
26
|
+
gem.add_dependency('rake', '~> 0')
|
27
|
+
gem.add_dependency('activesupport', '~> 3.0')
|
28
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'grape_bootstrap/commands/base'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
module GrapeBootstrap
|
6
|
+
module Commands
|
7
|
+
class AppInit < Base
|
8
|
+
def initialize path, options=[]
|
9
|
+
super path, options
|
10
|
+
@dry = (options & ["--dry"]).length > 0
|
11
|
+
|
12
|
+
setup_dirs
|
13
|
+
setup_base_files
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def setup_dirs
|
18
|
+
{
|
19
|
+
"app/api" => ["base.rb", "status.rb"],
|
20
|
+
"app/helpers" => [],
|
21
|
+
"app/models" => [],
|
22
|
+
"config" => ["database.yml"],
|
23
|
+
"config/environments" => ["development.rb"],
|
24
|
+
"db/migrate" => [],
|
25
|
+
"lib" => [],
|
26
|
+
"docs" => [],
|
27
|
+
"public" => ["index.html"]
|
28
|
+
}.each do |dir, files|
|
29
|
+
puts "Creating #{dir}"
|
30
|
+
FileUtils.mkdir_p("#{@path}/#{dir}") unless @dry
|
31
|
+
|
32
|
+
files.each do |f|
|
33
|
+
puts "Creating #{dir}/#{f}"
|
34
|
+
file_from_template(f, dir) unless @dry
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def setup_base_files
|
40
|
+
[
|
41
|
+
"Gemfile",
|
42
|
+
"README.md",
|
43
|
+
"application.rb",
|
44
|
+
"environment.rb",
|
45
|
+
"config.ru",
|
46
|
+
"Rakefile"
|
47
|
+
].each do |filename|
|
48
|
+
puts "Creating #{filename}"
|
49
|
+
file_from_template(filename) unless @dry
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def file_from_template template_name, sub_path=nil
|
54
|
+
erb_binding = -> {
|
55
|
+
app_name = "APP"
|
56
|
+
binding
|
57
|
+
}
|
58
|
+
|
59
|
+
template_name = "#{sub_path}/#{template_name}" if sub_path
|
60
|
+
tpl = ERB.new(
|
61
|
+
File.read(
|
62
|
+
"#{File.dirname(__FILE__)}/../templates/#{template_name}.erb"
|
63
|
+
)
|
64
|
+
)
|
65
|
+
|
66
|
+
File.open("#{@path}/#{template_name}", 'w') do |file|
|
67
|
+
file << tpl.result(erb_binding.call)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "grape_bootstrap/commands/app_init.rb"
|
2
|
+
require "grape_bootstrap/commands/generate.rb"
|
3
|
+
|
4
|
+
main_cmd = ARGV.shift.downcase
|
5
|
+
path = %x(pwd).gsub(/\n/, '')
|
6
|
+
|
7
|
+
case main_cmd
|
8
|
+
when 'init'
|
9
|
+
GrapeBootstrap::Commands::AppInit.new(path, ARGV)
|
10
|
+
when 'generate'
|
11
|
+
GrapeBootstrap::Commands::Generate.new(path, ARGV.shift, ARGV)
|
12
|
+
else
|
13
|
+
puts "Unknown command"
|
14
|
+
exit 1
|
15
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'grape_bootstrap/commands/base'
|
2
|
+
require 'active_support/core_ext'
|
3
|
+
|
4
|
+
module GrapeBootstrap
|
5
|
+
module Commands
|
6
|
+
class Generate < Base
|
7
|
+
def initialize path, type, options=[]
|
8
|
+
super path, options
|
9
|
+
if type.nil?
|
10
|
+
throw "Type not specified"
|
11
|
+
end
|
12
|
+
@type = type
|
13
|
+
|
14
|
+
self.send type.downcase, options.shift
|
15
|
+
end
|
16
|
+
|
17
|
+
def model name
|
18
|
+
if name.nil?
|
19
|
+
throw "Model needs a name to be generated"
|
20
|
+
end
|
21
|
+
|
22
|
+
render_template name
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def render_template name
|
27
|
+
template_type = @type
|
28
|
+
erb_binding = -> {
|
29
|
+
name = name.camelize
|
30
|
+
binding
|
31
|
+
}
|
32
|
+
|
33
|
+
template_path = [
|
34
|
+
File.dirname(__FILE__),
|
35
|
+
"..",
|
36
|
+
"templates",
|
37
|
+
"app",
|
38
|
+
template_type.pluralize,
|
39
|
+
"new.rb.erb"
|
40
|
+
].join('/')
|
41
|
+
tpl = ERB.new(File.read(template_path))
|
42
|
+
target_path = "app/#{template_type.pluralize}/#{name.underscore}.rb"
|
43
|
+
|
44
|
+
File.open("#{@path}/#{target_path}", 'w') do |file|
|
45
|
+
file << tpl.result(erb_binding.call)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# A sample Gemfile
|
2
|
+
source 'https://rubygems.org'
|
3
|
+
|
4
|
+
gem 'rack'
|
5
|
+
gem 'grape'
|
6
|
+
gem 'activerecord', '~>3.2.13', require: 'active_record'
|
7
|
+
gem 'sqlite3', group: [:development, :test]
|
8
|
+
gem 'pg', group: :production
|
9
|
+
gem 'rake'
|
10
|
+
gem 'encode_with_alphabet'
|
11
|
+
gem 'racksh'
|
@@ -0,0 +1 @@
|
|
1
|
+
README skeleton
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require File.expand_path('../environment', __FILE__)
|
3
|
+
|
4
|
+
task :rails_env do
|
5
|
+
end
|
6
|
+
|
7
|
+
task :environment do
|
8
|
+
end
|
9
|
+
|
10
|
+
module Rails
|
11
|
+
def self.application
|
12
|
+
Struct.new(:config, :paths) do
|
13
|
+
def load_seed
|
14
|
+
require File.expand_path('../application', __FILE__)
|
15
|
+
require File.expand_path('../db/seeds', __FILE__)
|
16
|
+
end
|
17
|
+
end.new(config, paths)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.config
|
21
|
+
require 'erb'
|
22
|
+
db_config = YAML.load(ERB.new(File.read("config/database.yml")).result)
|
23
|
+
Struct.new(:database_configuration).new(db_config)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.paths
|
27
|
+
{ 'db/migrate' => ["#{root}/db/migrate"] }
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.env
|
31
|
+
env = ENV['RACK_ENV'] || "development"
|
32
|
+
ActiveSupport::StringInquirer.new(env)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.root
|
36
|
+
File.dirname(__FILE__)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
namespace :g do
|
41
|
+
desc "Generate migration. Specify name in the NAME variable"
|
42
|
+
task :migration => :environment do
|
43
|
+
name = ENV['NAME'] || raise("Specify name: rake g:migration NAME=create_users")
|
44
|
+
timestamp = Time.now.strftime("%Y%m%d%H%M%S")
|
45
|
+
|
46
|
+
path = File.expand_path("../db/migrate/#{timestamp}_#{name}.rb", __FILE__)
|
47
|
+
migration_class = name.split("_").map(&:capitalize).join
|
48
|
+
|
49
|
+
File.open(path, 'w') do |file|
|
50
|
+
file.write <<-EOF.strip_heredoc
|
51
|
+
class #{migration_class} < ActiveRecord::Migration
|
52
|
+
def self.up
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.down
|
56
|
+
end
|
57
|
+
end
|
58
|
+
EOF
|
59
|
+
end
|
60
|
+
|
61
|
+
puts "DONE"
|
62
|
+
puts path
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
Rake.load_rakefile "active_record/railties/databases.rake"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class API::Base < Grape::API
|
2
|
+
def self.inherited(subclass)
|
3
|
+
super
|
4
|
+
subclass.instance_eval do
|
5
|
+
version 'v1', :using => :path
|
6
|
+
format :json
|
7
|
+
|
8
|
+
rescue_from ActiveRecord::RecordNotFound do |e|
|
9
|
+
message = e.message.gsub(/\s*\[.*\Z/, '')
|
10
|
+
Rack::Response.new(
|
11
|
+
[{ status: 404, status_code: "not_found", error: message }.to_json],
|
12
|
+
404,
|
13
|
+
{ 'Content-Type' => 'application/json' }
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
rescue_from ActiveRecord::RecordInvalid do |e|
|
18
|
+
record = e.record
|
19
|
+
message = e.message.downcase.capitalize
|
20
|
+
Rack::Response.new(
|
21
|
+
[{ status: 403, status_code: "record_invalid", error: message }.to_json],
|
22
|
+
403,
|
23
|
+
{ 'Content-Type' => 'application/json' }
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
default_format :json
|
30
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path('../environment', __FILE__)
|
2
|
+
|
3
|
+
module API
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'app/api/base'
|
7
|
+
|
8
|
+
Dir["#{File.dirname(__FILE__)}/app/models/extensions/**/*.rb"].each {|f| require f}
|
9
|
+
Dir["#{File.dirname(__FILE__)}/app/models/**/*.rb"].each {|f| require f}
|
10
|
+
Dir["#{File.dirname(__FILE__)}/app/**/*.rb"].each {|f| require f}
|
11
|
+
|
12
|
+
ActiveRecord::Base.instance_eval do
|
13
|
+
include ActiveModel::MassAssignmentSecurity
|
14
|
+
attr_accessible []
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
class API::Root < Grape::API
|
19
|
+
format :json
|
20
|
+
|
21
|
+
before do
|
22
|
+
header['Access-Control-Allow-Origin'] = '*'
|
23
|
+
header['Access-Control-Request-Method'] = '*'
|
24
|
+
end
|
25
|
+
|
26
|
+
mount API::Base
|
27
|
+
mount API::Status
|
28
|
+
end
|
29
|
+
|
30
|
+
ApplicationServer = Rack::Builder.new {
|
31
|
+
use Rack::Static, :urls => [
|
32
|
+
"/css",
|
33
|
+
"/images",
|
34
|
+
"/lib"
|
35
|
+
], :root => "public", index: 'index.html'
|
36
|
+
|
37
|
+
map "/" do
|
38
|
+
run API::Root
|
39
|
+
end
|
40
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
development:
|
2
|
+
adapter: postgresql
|
3
|
+
encoding: utf-8
|
4
|
+
database: grape_api_development
|
5
|
+
pool: 5
|
6
|
+
username: grape
|
7
|
+
password: password
|
8
|
+
|
9
|
+
test: &test
|
10
|
+
adapter: postgresql
|
11
|
+
encoding: utf-8
|
12
|
+
database: grape_api_test
|
13
|
+
pool: 5
|
14
|
+
username: grape
|
15
|
+
password: password
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
env = (ENV['RACK_ENV'] || :development)
|
3
|
+
|
4
|
+
require 'bundler'
|
5
|
+
Bundler.require :default, env.to_sym
|
6
|
+
require 'erb'
|
7
|
+
|
8
|
+
module Application
|
9
|
+
include ActiveSupport::Configurable
|
10
|
+
end
|
11
|
+
|
12
|
+
Application.configure do |config|
|
13
|
+
config.root = File.dirname(__FILE__)
|
14
|
+
config.env = ActiveSupport::StringInquirer.new(env.to_s)
|
15
|
+
end
|
16
|
+
|
17
|
+
db_config = YAML.load(ERB.new(File.read("config/database.yml")).result)[Application.config.env]
|
18
|
+
ActiveRecord::Base.default_timezone = :utc
|
19
|
+
ActiveRecord::Base.establish_connection(db_config)
|
20
|
+
|
21
|
+
specific_environment = "config/environments/#{Application.config.env}.rb"
|
22
|
+
require specific_environment if File.exists? specific_environment
|
23
|
+
Dir["config/initializers/**/*.rb"].each {|f| require f}
|
24
|
+
|
metadata
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: grape_bootstrap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mate Marjai
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: grape
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
description: This library contains an executable to bootstrap and scaffold the minimum
|
56
|
+
for a grape REST API.
|
57
|
+
email:
|
58
|
+
- mate.marjai@gmail.com
|
59
|
+
executables:
|
60
|
+
- grape
|
61
|
+
extensions: []
|
62
|
+
extra_rdoc_files: []
|
63
|
+
files:
|
64
|
+
- bin/grape
|
65
|
+
- grape-bootstrap.gemspec
|
66
|
+
- lib/grape_bootstrap.rb
|
67
|
+
- lib/grape_bootstrap/cli.rb
|
68
|
+
- lib/grape_bootstrap/commands/app_init.rb
|
69
|
+
- lib/grape_bootstrap/commands/application.rb
|
70
|
+
- lib/grape_bootstrap/commands/base.rb
|
71
|
+
- lib/grape_bootstrap/commands/generate.rb
|
72
|
+
- lib/grape_bootstrap/commands/help.rb
|
73
|
+
- lib/grape_bootstrap/templates/Gemfile.erb
|
74
|
+
- lib/grape_bootstrap/templates/README.md.erb
|
75
|
+
- lib/grape_bootstrap/templates/Rakefile.erb
|
76
|
+
- lib/grape_bootstrap/templates/app/api/base.rb.erb
|
77
|
+
- lib/grape_bootstrap/templates/app/api/status.rb.erb
|
78
|
+
- lib/grape_bootstrap/templates/app/models/new.rb.erb
|
79
|
+
- lib/grape_bootstrap/templates/application.rb.erb
|
80
|
+
- lib/grape_bootstrap/templates/config.ru.erb
|
81
|
+
- lib/grape_bootstrap/templates/config/database.yml.erb
|
82
|
+
- lib/grape_bootstrap/templates/config/environments/development.rb.erb
|
83
|
+
- lib/grape_bootstrap/templates/environment.rb.erb
|
84
|
+
- lib/grape_bootstrap/templates/public/index.html.erb
|
85
|
+
- lib/grape_bootstrap/version.rb
|
86
|
+
homepage: https://github.com/marjaimate/grape-bootstrap
|
87
|
+
licenses:
|
88
|
+
- MIT
|
89
|
+
metadata: {}
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
requirements: []
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 2.2.2
|
107
|
+
signing_key:
|
108
|
+
specification_version: 4
|
109
|
+
summary: Grape REST API bootstrap.
|
110
|
+
test_files: []
|