natra 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +4 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +167 -0
- data/Guardfile +75 -0
- data/LICENSE.txt +21 -0
- data/README.md +60 -0
- data/Rakefile +6 -0
- data/bin/console +6 -0
- data/bin/natra +7 -0
- data/bin/setup +6 -0
- data/lib/extensions/string.rb +37 -0
- data/lib/natra.rb +9 -0
- data/lib/natra/cli.rb +20 -0
- data/lib/natra/generators/app/app_generator.rb +150 -0
- data/lib/natra/generators/app/templates/Dockerfile +24 -0
- data/lib/natra/generators/app/templates/Gemfile +35 -0
- data/lib/natra/generators/app/templates/Guardfile +20 -0
- data/lib/natra/generators/app/templates/README.md +52 -0
- data/lib/natra/generators/app/templates/Rakefile +4 -0
- data/lib/natra/generators/app/templates/app/controllers/application_controller.rb +14 -0
- data/lib/natra/generators/app/templates/app/models/.gitkeep +0 -0
- data/lib/natra/generators/app/templates/app/views/layout.erb.tt +20 -0
- data/lib/natra/generators/app/templates/app/views/welcome.erb +22 -0
- data/lib/natra/generators/app/templates/bin/ci +6 -0
- data/lib/natra/generators/app/templates/bin/setup +7 -0
- data/lib/natra/generators/app/templates/config.ru +11 -0
- data/lib/natra/generators/app/templates/config/db.yml +35 -0
- data/lib/natra/generators/app/templates/config/environment.rb +19 -0
- data/lib/natra/generators/app/templates/config/initializers/database.rb +11 -0
- data/lib/natra/generators/app/templates/config/initializers/oj.rb +5 -0
- data/lib/natra/generators/app/templates/config/initializers/redis.rb +7 -0
- data/lib/natra/generators/app/templates/config/puma.rb +11 -0
- data/lib/natra/generators/app/templates/config/redis.yml +14 -0
- data/lib/natra/generators/app/templates/docker-compose.yml +22 -0
- data/lib/natra/generators/app/templates/gitignore +12 -0
- data/lib/natra/generators/app/templates/public/favicon.ico +0 -0
- data/lib/natra/generators/app/templates/public/images/.gitkeep +0 -0
- data/lib/natra/generators/app/templates/public/images/corneal-small.png +0 -0
- data/lib/natra/generators/app/templates/public/javascripts/.gitkeep +0 -0
- data/lib/natra/generators/app/templates/public/stylesheets/main.css +115 -0
- data/lib/natra/generators/app/templates/rspec +2 -0
- data/lib/natra/generators/app/templates/rubocop.yml +79 -0
- data/lib/natra/generators/app/templates/secrets.env +16 -0
- data/lib/natra/generators/app/templates/spec/application_controller_spec.rb +13 -0
- data/lib/natra/generators/app/templates/spec/spec_helper.rb +36 -0
- data/lib/natra/generators/controller/controller_generator.rb +37 -0
- data/lib/natra/generators/controller/templates/controller.rb.erb +37 -0
- data/lib/natra/generators/controller/templates/views/edit.html.erb +1 -0
- data/lib/natra/generators/controller/templates/views/index.html.erb +1 -0
- data/lib/natra/generators/controller/templates/views/new.html.erb +1 -0
- data/lib/natra/generators/controller/templates/views/show.html.erb +1 -0
- data/lib/natra/generators/model/migration.rb.erb +10 -0
- data/lib/natra/generators/model/model.rb.erb +2 -0
- data/lib/natra/generators/model/model_generator.rb +59 -0
- data/lib/natra/generators/scaffold/scaffold_generator.rb +22 -0
- data/lib/natra/version.rb +3 -0
- data/natra.gemspec +41 -0
- metadata +180 -0
data/Rakefile
ADDED
data/bin/console
ADDED
data/bin/natra
ADDED
data/bin/setup
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
module Natra
|
2
|
+
module Extensions
|
3
|
+
module String
|
4
|
+
def camel_case
|
5
|
+
return self.gsub(/^./) { |l| l.capitalize } if !match(/[_-]/)
|
6
|
+
altered_self = self.downcase.capitalize
|
7
|
+
altered_self.scan(/[_-][a-zA-Z]/).each do |match|
|
8
|
+
altered_self.gsub!(match, match[1].upcase)
|
9
|
+
end
|
10
|
+
|
11
|
+
altered_self
|
12
|
+
end
|
13
|
+
|
14
|
+
def camel_case!
|
15
|
+
self.replace camel_case
|
16
|
+
end
|
17
|
+
|
18
|
+
def directory_name
|
19
|
+
self.downcase.gsub(/[^a-z|\-|\_]/, '')
|
20
|
+
end
|
21
|
+
|
22
|
+
def file_name
|
23
|
+
self.gsub(/[\-| ]/, '_').
|
24
|
+
gsub(/([A-Z]+|[A-Z][a-z])/) { |x| "_#{x}" }.
|
25
|
+
sub(/^_/, "").
|
26
|
+
gsub(/_{2,}+/, "_").
|
27
|
+
downcase
|
28
|
+
end
|
29
|
+
|
30
|
+
def file_name!
|
31
|
+
self.replace file_name
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
String.send(:include, Natra::Extensions::String)
|
data/lib/natra.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require "extensions/string"
|
2
|
+
require "natra/generators/app/app_generator"
|
3
|
+
require "natra/generators/model/model_generator"
|
4
|
+
require "natra/generators/scaffold/scaffold_generator"
|
5
|
+
require "natra/generators/controller/controller_generator"
|
6
|
+
require "natra/version"
|
7
|
+
require "natra/cli"
|
8
|
+
|
9
|
+
module Natra; end
|
data/lib/natra/cli.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'thor'
|
2
|
+
module Natra
|
3
|
+
class CLI < Thor
|
4
|
+
desc '-v', 'Show Natra version number'
|
5
|
+
map %w[-v --version] => :version
|
6
|
+
# USAGE: Natra -v
|
7
|
+
def version
|
8
|
+
say "Natra #{Natra::VERSION}"
|
9
|
+
end
|
10
|
+
# register(class_name, subcommand_alias, usage_list_string, description_string)
|
11
|
+
register Natra::Generators::AppGenerator, 'new', 'new APP_PATH', 'Creates a new Sinatra application'
|
12
|
+
register Natra::Generators::ModelGenerator, 'model', 'model NAME', 'Generate a model'
|
13
|
+
register Natra::Generators::ControllerGenerator, 'controller', 'controller NAME', 'Generate a controller'
|
14
|
+
register Natra::Generators::ScaffoldGenerator, 'scaffold', 'scaffold NAME', 'Generate a model with its associated views and controllers'
|
15
|
+
|
16
|
+
def self.exit_on_failure
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require "thor/group"
|
3
|
+
|
4
|
+
module Natra
|
5
|
+
module Generators
|
6
|
+
class AppGenerator < Thor::Group
|
7
|
+
include Thor::Actions
|
8
|
+
|
9
|
+
desc "Creates a new Sinatra application"
|
10
|
+
argument :name, :type => :string, :desc => "The name of the new application"
|
11
|
+
class_option :capistrano, :type => :boolean, :desc => "Include Capistrano configuration"
|
12
|
+
class_option :database, :aliases => "-d", :default => "", :desc => "The type of database to use"
|
13
|
+
class_option :redis, :type => :boolean, :desc => "Include Redis configuration"
|
14
|
+
class_option :rvm, :type => :boolean, :desc => "Create .ruby-version (ruby-2.1.0) and .ruby-gemset"
|
15
|
+
class_option :bundle, :type => :boolean, :desc => "Run bundle after generating the app"
|
16
|
+
class_option :git, :type => :boolean, :desc => "Initialize a Git repository"
|
17
|
+
|
18
|
+
# Creates instance variables from options passed to natra.
|
19
|
+
def setup
|
20
|
+
@app_path = name.directory_name
|
21
|
+
@name = name.file_name
|
22
|
+
|
23
|
+
options.each do |key, value|
|
24
|
+
instance_variable_set "@#{key.to_s}".to_sym, value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.source_root
|
29
|
+
File.expand_path(File.join(File.dirname(__FILE__), "templates"))
|
30
|
+
end
|
31
|
+
|
32
|
+
# Create empty directories
|
33
|
+
def create_empty_directories
|
34
|
+
%w{config/initializers lib spec}.each do |dir|
|
35
|
+
empty_directory File.join(@app_path, dir)
|
36
|
+
end
|
37
|
+
|
38
|
+
empty_directory File.join(@app_path, 'db/migrate')
|
39
|
+
|
40
|
+
create_file File.join(@app_path, "lib", ".gitkeep")
|
41
|
+
template "config/environment.rb", File.join(@app_path, "config/environment.rb")
|
42
|
+
end
|
43
|
+
|
44
|
+
def create_public_directory
|
45
|
+
template "public/favicon.ico", File.join(@app_path, "public/favicon.ico")
|
46
|
+
end
|
47
|
+
|
48
|
+
def create_app_directory
|
49
|
+
%w{app/controllers app/views app/models}.each do |dir|
|
50
|
+
directory dir, File.join(@app_path, dir)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_app_spec
|
55
|
+
template "spec/application_controller_spec.rb", File.join(@app_path, "spec/application_controller_spec.rb")
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_spec_helper
|
59
|
+
template "spec/spec_helper.rb", File.join(@app_path, "spec/spec_helper.rb")
|
60
|
+
end
|
61
|
+
|
62
|
+
def create_config
|
63
|
+
template "config.ru", File.join(@app_path, "config.ru")
|
64
|
+
end
|
65
|
+
|
66
|
+
def create_gemfile
|
67
|
+
template "Gemfile", File.join(@app_path, "Gemfile")
|
68
|
+
end
|
69
|
+
|
70
|
+
def create_rakefile
|
71
|
+
template "Rakefile", File.join(@app_path, "Rakefile")
|
72
|
+
end
|
73
|
+
|
74
|
+
def create_readme
|
75
|
+
template("README.md", File.join(@app_path, "README.md"))
|
76
|
+
end
|
77
|
+
|
78
|
+
def create_db_config
|
79
|
+
template("config/db.yml", File.join(@app_path, "config/db.yml")) unless @database.empty?
|
80
|
+
end
|
81
|
+
|
82
|
+
def create_database_initializer
|
83
|
+
template("config/initializers/database.rb", File.join(@app_path, "config/initializers/database.rb")) unless @database.empty?
|
84
|
+
end
|
85
|
+
|
86
|
+
def create_redis_config
|
87
|
+
copy_file("config/redis.yml", File.join(@app_path, "config/redis.yml")) if @redis
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_redis_initializer
|
91
|
+
template("config/initializers/redis.rb", File.join(@app_path, "config/initializers/redis.rb")) if @redis
|
92
|
+
end
|
93
|
+
|
94
|
+
def create_gitignore
|
95
|
+
copy_file "gitignore", File.join(@app_path, '.gitignore')
|
96
|
+
end
|
97
|
+
def create_rspec
|
98
|
+
copy_file 'rspec', File.join(@app_path, '.rspec')
|
99
|
+
end
|
100
|
+
def create_rubocop
|
101
|
+
copy_file 'rubocop.yml', File.join(@app_path, '.rubocop.yml')
|
102
|
+
end
|
103
|
+
def create_docker
|
104
|
+
copy_file 'Dockerfile', File.join(@app_path, 'Dockerfile')
|
105
|
+
end
|
106
|
+
def create_docker_compose
|
107
|
+
template('docker-compose.yml', File.join(@app_path, "docker-compose.yml"))
|
108
|
+
end
|
109
|
+
def create_guardfile
|
110
|
+
copy_file 'Guardfile',File.join(@app_path, 'Guardfile')
|
111
|
+
end
|
112
|
+
def create_spec_support
|
113
|
+
create_file File.join(@app_path, "spec/support/", ".keep")
|
114
|
+
end
|
115
|
+
def create_secrets
|
116
|
+
template('secrets.env',File.join(@app_path, "secrets.env"))
|
117
|
+
end
|
118
|
+
|
119
|
+
def create_capistrano_config
|
120
|
+
if @capistrano
|
121
|
+
inside(@app_path) do
|
122
|
+
run('cap install')
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def create_rvm_gemset
|
128
|
+
if @rvm
|
129
|
+
create_file(File.join(@app_path, '.ruby-version'), 'ruby-2.1.0')
|
130
|
+
create_file(File.join(@app_path, '.ruby-gemset'), @app_path)
|
131
|
+
|
132
|
+
@bundle = false
|
133
|
+
puts "You need to run 'bundle install' manually."
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def initialize_git_repo
|
138
|
+
inside(@app_path) do
|
139
|
+
run('git init .') if @git
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def install_dependencies
|
144
|
+
inside(@app_path) do
|
145
|
+
run('bundle') if @bundle
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# base layer
|
2
|
+
FROM ruby AS base
|
3
|
+
|
4
|
+
WORKDIR /usr/src/app
|
5
|
+
|
6
|
+
RUN gem install bundler
|
7
|
+
|
8
|
+
COPY Gemfile /usr/src/app/
|
9
|
+
|
10
|
+
# development and test layer with all dependencies
|
11
|
+
FROM base AS development
|
12
|
+
|
13
|
+
RUN bundle install -j5 --without staging production
|
14
|
+
|
15
|
+
COPY . /usr/src/app
|
16
|
+
|
17
|
+
# release layer
|
18
|
+
FROM base AS release
|
19
|
+
|
20
|
+
RUN bundle install -j5 --without development test
|
21
|
+
|
22
|
+
COPY . /usr/src/app
|
23
|
+
|
24
|
+
CMD puma
|
@@ -0,0 +1,35 @@
|
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
ruby '2.5.3'
|
3
|
+
gem 'sinatra'
|
4
|
+
gem 'activerecord', '~> 4.2', '>= 4.2.6', :require => 'active_record'
|
5
|
+
gem 'sinatra-activerecord', :require => 'sinatra/activerecord'
|
6
|
+
gem 'rake'
|
7
|
+
gem 'rack-timeout'
|
8
|
+
gem 'require_all'
|
9
|
+
gem 'sqlite3'
|
10
|
+
gem 'thin'
|
11
|
+
gem 'shotgun'
|
12
|
+
gem 'scout_apm'
|
13
|
+
gem 'seed-fu'
|
14
|
+
gem 'pry'
|
15
|
+
gem 'bcrypt'
|
16
|
+
gem "tux"
|
17
|
+
gem 'oj'
|
18
|
+
group :development, :test do
|
19
|
+
gem 'pry'
|
20
|
+
gem 'pry-byebug'
|
21
|
+
gem 'shotgun'
|
22
|
+
end
|
23
|
+
group :test do
|
24
|
+
gem 'awesome_print'
|
25
|
+
gem 'database_cleaner'
|
26
|
+
gem 'factory_bot'
|
27
|
+
gem 'faker'
|
28
|
+
gem 'guard-rspec'
|
29
|
+
gem 'guard-rubocop'
|
30
|
+
gem 'rack-test'
|
31
|
+
gem 'simplecov'
|
32
|
+
gem 'rspec'
|
33
|
+
gem 'capybara'
|
34
|
+
gem 'rack-test'
|
35
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
guard :rspec, cmd: 'rspec', all_after_pass: true, all_on_start: true do
|
2
|
+
require 'guard/rspec/dsl'
|
3
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
4
|
+
|
5
|
+
# RSpec files
|
6
|
+
rspec = dsl.rspec
|
7
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
8
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
9
|
+
watch(rspec.spec_files)
|
10
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
11
|
+
|
12
|
+
# Ruby files
|
13
|
+
ruby = dsl.ruby
|
14
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
15
|
+
end
|
16
|
+
|
17
|
+
guard :rubocop, cli: ['--display-cop-names'] do
|
18
|
+
watch(/.+\.rb$/)
|
19
|
+
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
|
20
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# <%= @name.camel_case %> service
|
2
|
+
|
3
|
+
## Commands
|
4
|
+
```
|
5
|
+
natra -v # Show Natra version number
|
6
|
+
natra help [COMMAND] # Describe available commands or one specific command
|
7
|
+
natra new APP-NAME # Creates a new Sinatra application
|
8
|
+
natra model NAME # Generate a model
|
9
|
+
natra controller NAME # Generate a controller
|
10
|
+
natra scaffold NAME # Generate a model with its associated views and controllers
|
11
|
+
```
|
12
|
+
The controller generator also have an optional views flag `--no-views` to create controllers without views.
|
13
|
+
|
14
|
+
## Using Natra
|
15
|
+
|
16
|
+
To generate your app:
|
17
|
+
|
18
|
+
natra new APP-NAME
|
19
|
+
|
20
|
+
After natra is done generating your app, run `bundle install` from your app's directory:
|
21
|
+
|
22
|
+
cd APP-NAME
|
23
|
+
bundle install
|
24
|
+
|
25
|
+
## Development
|
26
|
+
|
27
|
+
This project is configured to run in Docker containers facilitated by `docker-compose`. [nib](https://github.com/technekes/nib) is our tool of choice for interacting with `docker-compose` in development.
|
28
|
+
|
29
|
+
|
30
|
+
### Running the app
|
31
|
+
|
32
|
+
Use [nib](https://github.com/technekes/nib) to build and start up the web app.
|
33
|
+
|
34
|
+
```sh
|
35
|
+
nib build --pull
|
36
|
+
nib up
|
37
|
+
```
|
38
|
+
|
39
|
+
### Running Tests
|
40
|
+
|
41
|
+
The app is configured to use [guard](https://github.com/guard/guard) facilitate running the tests as files change. To start up guard run:
|
42
|
+
|
43
|
+
```sh
|
44
|
+
nib guard web
|
45
|
+
```
|
46
|
+
|
47
|
+
Alternatively the specs can be run as a one-off with:
|
48
|
+
|
49
|
+
```sh
|
50
|
+
nib rspec web
|
51
|
+
```
|
52
|
+
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<head>
|
3
|
+
<meta charset="utf-8" />
|
4
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
|
5
|
+
|
6
|
+
<title><%= @name.camel_case %></title>
|
7
|
+
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<div class="wrapper">
|
12
|
+
|
13
|
+
<%%= yield %>
|
14
|
+
|
15
|
+
<footer class="branding">
|
16
|
+
<small>© <%= Time.now.year %> <strong><%= @name.camel_case %></strong></small>
|
17
|
+
</footer>
|
18
|
+
</div>
|
19
|
+
</body>
|
20
|
+
</html>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<div class="container">
|
2
|
+
<div class="col-md-8 col-md-offset-2">
|
3
|
+
<h2>Sinatra Template Default Page</h2>
|
4
|
+
|
5
|
+
<div class="content">
|
6
|
+
<p>Welcome to the Sinatra Template! If you're seeing this page, then everything is working
|
7
|
+
as expected. To get started, delete this file (<code>app/views/welcome.erb)</code> and begin adding
|
8
|
+
your own actions to <code>application_controller.rb</code>. For more information, see the <a href="https://github.com/thirunjuguna/natra">README</a>.</p>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="sidebar">
|
12
|
+
<h3>Environment</h3>
|
13
|
+
<ul>
|
14
|
+
<li><b>Ruby:</b> <%= RUBY_VERSION %></li>
|
15
|
+
<li><b>Environment:</b> <%= ENV["RACK_ENV"] %></li>
|
16
|
+
<li><b>Server:</b> <%= @env["SERVER_SOFTWARE"] %></li>
|
17
|
+
<li><b>Port:</b> <%= @env["SERVER_PORT"] %></li>
|
18
|
+
</ul>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
</div>
|
22
|
+
</div>
|