blue-eyes 1.3.3 → 1.3.5
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/.ruby-version +1 -0
- data/.simplecov +8 -0
- data/Gemfile +24 -0
- data/Gemfile.lock +365 -0
- data/Guardfile +25 -0
- data/LICENSE +24 -0
- data/README.md +189 -0
- data/Rakefile +17 -0
- data/lib/.DS_Store +0 -0
- data/lib/blue_eyes/.DS_Store +0 -0
- data/lib/blue_eyes/cli.rb +26 -0
- data/lib/blue_eyes/extensions/string.rb +42 -0
- data/lib/blue_eyes/generators/.DS_Store +0 -0
- data/lib/blue_eyes/generators/app/.DS_Store +0 -0
- data/lib/blue_eyes/generators/app/app_generator.rb +163 -0
- data/lib/blue_eyes/generators/app/templates/.DS_Store +0 -0
- data/lib/blue_eyes/generators/app/templates/.rubocop.yml.erb +19 -0
- data/lib/blue_eyes/generators/app/templates/.rubocop_todo.yml.erb +1 -0
- data/lib/blue_eyes/generators/app/templates/.ruby-version.erb +1 -0
- data/lib/blue_eyes/generators/app/templates/.simplecov.erb +9 -0
- data/lib/blue_eyes/generators/app/templates/Gemfile.erb +39 -0
- data/lib/blue_eyes/generators/app/templates/Guardfile.erb +25 -0
- data/lib/blue_eyes/generators/app/templates/Procfile.dev.erb +6 -0
- data/lib/blue_eyes/generators/app/templates/Procfile.erb +1 -0
- data/lib/blue_eyes/generators/app/templates/README.md +1 -0
- data/lib/blue_eyes/generators/app/templates/Rakefile.erb +4 -0
- data/lib/blue_eyes/generators/app/templates/app/controllers/application_controller.rb +15 -0
- data/lib/blue_eyes/generators/app/templates/app/models/.gitkeep +0 -0
- data/lib/blue_eyes/generators/app/templates/app/views/layout.erb.tt +32 -0
- data/lib/blue_eyes/generators/app/templates/app/views/welcome.erb +23 -0
- data/lib/blue_eyes/generators/app/templates/bin/dev +11 -0
- data/lib/blue_eyes/generators/app/templates/config/db.yml +35 -0
- data/lib/blue_eyes/generators/app/templates/config/environment.rb +18 -0
- data/lib/blue_eyes/generators/app/templates/config/initializers/database.rb.erb +16 -0
- data/lib/blue_eyes/generators/app/templates/config/initializers/redis.rb +9 -0
- data/lib/blue_eyes/generators/app/templates/config/redis.yml +14 -0
- data/lib/blue_eyes/generators/app/templates/config.ru.erb +7 -0
- data/lib/blue_eyes/generators/app/templates/public/.DS_Store +0 -0
- data/lib/blue_eyes/generators/app/templates/public/favicon.ico +0 -0
- data/lib/blue_eyes/generators/app/templates/public/images/.gitkeep +0 -0
- data/lib/blue_eyes/generators/app/templates/public/images/blue-eyes-small.png +0 -0
- data/lib/blue_eyes/generators/app/templates/public/images/blue-eyes.svg +24 -0
- data/lib/blue_eyes/generators/app/templates/public/javascripts/.gitkeep +0 -0
- data/lib/blue_eyes/generators/app/templates/public/stylesheets/main.css +115 -0
- data/lib/blue_eyes/generators/app/templates/spec/application_controller_spec.rb +17 -0
- data/lib/blue_eyes/generators/app/templates/spec/factories/.gitkeep +0 -0
- data/lib/blue_eyes/generators/app/templates/spec/spec_helper.rb +45 -0
- data/lib/blue_eyes/generators/controller/controller_generator.rb +42 -0
- data/lib/blue_eyes/generators/controller/templates/controller.rb.erb +39 -0
- data/lib/blue_eyes/generators/controller/templates/views/edit.html.erb +1 -0
- data/lib/blue_eyes/generators/controller/templates/views/index.html.erb +1 -0
- data/lib/blue_eyes/generators/controller/templates/views/new.html.erb +1 -0
- data/lib/blue_eyes/generators/controller/templates/views/show.html.erb +1 -0
- data/lib/blue_eyes/generators/model/migration.rb.erb +13 -0
- data/lib/blue_eyes/generators/model/model.rb.erb +5 -0
- data/lib/blue_eyes/generators/model/model_factory.rb.erb +8 -0
- data/lib/blue_eyes/generators/model/model_generator.rb +68 -0
- data/lib/blue_eyes/generators/model/model_spec.rb.erb +48 -0
- data/lib/blue_eyes/generators/scaffold/scaffold_generator.rb +25 -0
- data/lib/blue_eyes/version.rb +11 -0
- data/lib/blue_eyes.rb +13 -0
- data/test/blue_eyes/cli_test.rb +20 -0
- data/test/blue_eyes/extensions/string_test.rb +71 -0
- data/test/blue_eyes/generators/app_generator_test.rb +142 -0
- data/test/blue_eyes/generators/controller/controller_generator_test.rb +57 -0
- data/test/blue_eyes/generators/model/model_generator_test.rb +40 -0
- data/test/blue_eyes/generators/scaffold/scaffold_generator_test.rb +21 -0
- data/test/blue_eyes/version_test.rb +24 -0
- data/test/blue_eyes_test.rb +1 -0
- data/test/test_helper.rb +6 -0
- metadata +75 -2
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
@media screen {
|
|
2
|
+
/* --- Reset Styles --- */
|
|
3
|
+
* {
|
|
4
|
+
list-style: none;
|
|
5
|
+
margin: 0;
|
|
6
|
+
padding: 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
html, body {
|
|
10
|
+
height: 100%;
|
|
11
|
+
width: 100%;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* --- Welcome Page Styles --- */
|
|
15
|
+
body {
|
|
16
|
+
background-color: lightblue;
|
|
17
|
+
color: #333;
|
|
18
|
+
font-family: Sans-Serif;
|
|
19
|
+
line-height: 18px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.wrapper {
|
|
23
|
+
background: #fff;
|
|
24
|
+
-moz-box-shadow: 0 0 10px rgba(0,0,0,.3);
|
|
25
|
+
-webkit-box-shadow: 0 0 10px rgba(0,0,0,.3);
|
|
26
|
+
box-shadow: 0 0 10px rgba(0,0,0,.3);
|
|
27
|
+
margin: 16px auto;
|
|
28
|
+
max-width: 960px;
|
|
29
|
+
padding: 2.25%; /* 18px / 800px */
|
|
30
|
+
width: 85%;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
h1 {
|
|
34
|
+
font-size: 36px;
|
|
35
|
+
line-height: 54px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
h2 {
|
|
39
|
+
border-bottom: 2px solid #ccc;
|
|
40
|
+
font-size: 24px;
|
|
41
|
+
line-height: 36px;
|
|
42
|
+
margin-bottom: 16px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
h3 {
|
|
46
|
+
font-size: 18px;
|
|
47
|
+
line-height: 36px;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
p {
|
|
51
|
+
margin-bottom: 18px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.main {
|
|
55
|
+
overflow: hidden;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.content {
|
|
59
|
+
float: left;
|
|
60
|
+
width: 60%; /* 480px / 800px */
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.sidebar {
|
|
64
|
+
background: #eee;
|
|
65
|
+
border: 1px solid #ccc;
|
|
66
|
+
float: right;
|
|
67
|
+
padding: 2.08333333333%; /* 5px / 240px */
|
|
68
|
+
width: 30%; /* 240px / 800px */
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.sidebar ul {
|
|
72
|
+
font-size: 14px;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.branding {
|
|
76
|
+
clear: both;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
footer.branding {
|
|
80
|
+
border-top: 2px solid #ccc;
|
|
81
|
+
margin-top: 20px;
|
|
82
|
+
padding-top: 20px;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@media screen and (max-width: 600px) {
|
|
87
|
+
.wrapper {
|
|
88
|
+
-moz-box-shadow: none;
|
|
89
|
+
-webkit-box-shadow: none;
|
|
90
|
+
box-shadow: none;
|
|
91
|
+
width: auto;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.content, .sidebar {
|
|
95
|
+
float: none;
|
|
96
|
+
width: 100%;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.sidebar {
|
|
100
|
+
background: transparent;
|
|
101
|
+
border: none;
|
|
102
|
+
border-top: 2px solid #ccc;
|
|
103
|
+
padding: 0;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
h1 {
|
|
107
|
+
font-size: 24px;
|
|
108
|
+
line-height: 36px;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
h2 {
|
|
112
|
+
font-size: 18px;
|
|
113
|
+
line-height: 24px;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe ApplicationController do
|
|
6
|
+
before do
|
|
7
|
+
get '/'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it 'responds with HTTP status 200 OK' do
|
|
11
|
+
expect(last_response.status).to eq(200)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'responds with a welcome message' do
|
|
15
|
+
expect(last_response.body).to include('Welcome to the Sinatra Template!')
|
|
16
|
+
end
|
|
17
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Ensure environment is set to test
|
|
4
|
+
ENV['RACK_ENV'] = ENV['SINATRA_ENV'] = 'test'
|
|
5
|
+
|
|
6
|
+
require_relative '../config/environment'
|
|
7
|
+
require 'capybara/rspec'
|
|
8
|
+
require 'capybara/dsl'
|
|
9
|
+
require 'factory_bot'
|
|
10
|
+
require 'pry'
|
|
11
|
+
require 'rack/test'
|
|
12
|
+
require 'simplecov'
|
|
13
|
+
|
|
14
|
+
def app
|
|
15
|
+
Rack::Builder.parse_file('config.ru')
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
ActiveRecord::Base.logger = nil
|
|
19
|
+
ActiveRecord::Migration.check_all_pending!
|
|
20
|
+
Capybara.app = app
|
|
21
|
+
DatabaseCleaner.strategy = :truncation
|
|
22
|
+
|
|
23
|
+
configure :test do
|
|
24
|
+
disable :protection # bypass DoS
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
RSpec.configure do |config|
|
|
28
|
+
config.run_all_when_everything_filtered = true
|
|
29
|
+
config.filter_run :focus
|
|
30
|
+
config.include Capybara::DSL
|
|
31
|
+
config.include FactoryBot::Syntax::Methods
|
|
32
|
+
config.include Rack::Test::Methods
|
|
33
|
+
|
|
34
|
+
config.before do
|
|
35
|
+
DatabaseCleaner.clean
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
config.before(:suite) do
|
|
39
|
+
FactoryBot.find_definitions
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
config.after do
|
|
43
|
+
DatabaseCleaner.clean
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'thor/group'
|
|
4
|
+
require 'active_support/inflector'
|
|
5
|
+
|
|
6
|
+
module BlueEyes
|
|
7
|
+
module Generators
|
|
8
|
+
# Generates a Rails-style Controller with associated views
|
|
9
|
+
class ControllerGenerator < Thor::Group
|
|
10
|
+
include Thor::Actions
|
|
11
|
+
|
|
12
|
+
attr_reader :controller_name, :class_name, :file_name
|
|
13
|
+
|
|
14
|
+
desc 'Generate an Controller with associated views'
|
|
15
|
+
argument :name, type: :string, desc: 'Name of the controller'
|
|
16
|
+
|
|
17
|
+
# --no-views make views optional
|
|
18
|
+
class_option :views, type: :boolean, default: true, desc: 'Generate views for controller'
|
|
19
|
+
|
|
20
|
+
def self.source_root
|
|
21
|
+
File.dirname(__FILE__)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def setup
|
|
25
|
+
@controller_name = name.pluralize.underscore
|
|
26
|
+
@class_name = "#{controller_name.camel_case}Controller"
|
|
27
|
+
@file_name = class_name.underscore
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def create_controller
|
|
31
|
+
template 'templates/controller.rb.erb', File.join('app/controllers', "#{file_name}.rb")
|
|
32
|
+
insert_into_file 'config.ru', "use #{class_name}\n", after: "run ApplicationController\n"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def create_views
|
|
36
|
+
return unless options[:views]
|
|
37
|
+
|
|
38
|
+
directory 'templates/views', File.join('app/views', controller_name.to_s)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# <%= class_name %> controller
|
|
4
|
+
class <%= class_name %> < ApplicationController
|
|
5
|
+
# GET: /<%= controller_name %>
|
|
6
|
+
get '/<%= controller_name %>' do
|
|
7
|
+
erb :'/<%= controller_name %>/index.html'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# GET: /<%= controller_name %>/new
|
|
11
|
+
get '/<%= controller_name %>/new' do
|
|
12
|
+
erb :'/<%= controller_name %>/new.html'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# POST: /<%= controller_name %>
|
|
16
|
+
post '/<%= controller_name %>' do
|
|
17
|
+
redirect '/<%= controller_name %>'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# GET: /<%= controller_name %>/5
|
|
21
|
+
get '/<%= controller_name %>/:id' do
|
|
22
|
+
erb :'/<%= controller_name %>/show.html'
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# GET: /<%= controller_name %>/5/edit
|
|
26
|
+
get '/<%= controller_name %>/:id/edit' do
|
|
27
|
+
erb :'/<%= controller_name %>/edit.html'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# PATCH: /<%= controller_name %>/5
|
|
31
|
+
patch '/<%= controller_name %>/:id' do
|
|
32
|
+
redirect '/<%= controller_name %>/:id'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# DELETE: /<%= controller_name %>/5/delete
|
|
36
|
+
delete '/<%= controller_name %>/:id/delete' do
|
|
37
|
+
redirect '/<%= controller_name %>'
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<h1>Insert the form to edit an instance of your model here.</h1>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<h1>This is the Model's index page.</h1>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<h1>Insert the form to create a new instance of your model.</h1>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<h1>This is the show page for an individual instance of your model.</h1>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# <%= migration_class_name %> migration
|
|
4
|
+
class <%= migration_class_name %> < ActiveRecord::Migration[5.2]
|
|
5
|
+
def change
|
|
6
|
+
create_table :<%= table_name %> do |t|
|
|
7
|
+
<% attributes.each do |attribute| -%>
|
|
8
|
+
t.<%= attribute[:type] %> :<%= attribute[:name] %>
|
|
9
|
+
<% end %>
|
|
10
|
+
t.timestamps null: false
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'thor/group'
|
|
4
|
+
require 'active_support/inflector'
|
|
5
|
+
|
|
6
|
+
module BlueEyes
|
|
7
|
+
module Generators
|
|
8
|
+
# Generates an ActiveRecord model
|
|
9
|
+
class ModelGenerator < Thor::Group
|
|
10
|
+
include Thor::Actions
|
|
11
|
+
|
|
12
|
+
attr_reader :file_name, :class_name, :model_name, :migration_name, :migration_class_name, :table_name
|
|
13
|
+
|
|
14
|
+
desc 'Generate an ActiveRecord model'
|
|
15
|
+
argument :name, type: :string, desc: 'Name of the model'
|
|
16
|
+
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
|
17
|
+
|
|
18
|
+
# --no-migration make migrations optional
|
|
19
|
+
class_option :migration, type: :boolean, default: true, desc: 'Generate migration for model'
|
|
20
|
+
|
|
21
|
+
def self.source_root
|
|
22
|
+
File.dirname(__FILE__)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def setup
|
|
26
|
+
@model_name = name.singularize
|
|
27
|
+
@class_name = model_name.camel_case
|
|
28
|
+
@file_name = model_name.underscore
|
|
29
|
+
@table_name = file_name.pluralize
|
|
30
|
+
@migration_name = "create_#{table_name}"
|
|
31
|
+
@migration_class_name = migration_name.camel_case
|
|
32
|
+
|
|
33
|
+
attributes.map! do |attribute|
|
|
34
|
+
field = attribute.split(':')
|
|
35
|
+
{ name: field[0], type: field[1] || 'string' }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def create_model
|
|
40
|
+
unless model_name == name
|
|
41
|
+
say '[WARNING] ' &
|
|
42
|
+
"The model name '#{name}' was recognized as a plural, using the singular '#{model_name}' instead."
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
template 'model.rb.erb', File.join('app/models', "#{file_name}.rb")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def create_migration
|
|
49
|
+
return unless options[:migration]
|
|
50
|
+
|
|
51
|
+
migration_files = Dir.entries('db/migrate').reject { |path| File.directory? path }
|
|
52
|
+
|
|
53
|
+
if (duplicate = migration_files.find { |file| file.include?(migration_name) })
|
|
54
|
+
say_status :identical, "db/migrate/#{duplicate}", :blue
|
|
55
|
+
else
|
|
56
|
+
version = Time.now.utc.strftime('%Y%m%d%H%M%S')
|
|
57
|
+
migration_file_name = "#{version}_#{migration_name}.rb"
|
|
58
|
+
|
|
59
|
+
template 'migration.rb.erb', File.join('db/migrate', migration_file_name)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def create_spec
|
|
64
|
+
template 'model_spec.rb.erb', File.join('spec/models', "#{file_name}_spec.rb")
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../spec_helper'
|
|
4
|
+
|
|
5
|
+
describe <%= class_name %> do
|
|
6
|
+
it 'has a valid factory' do
|
|
7
|
+
skip 'factories not implemented'
|
|
8
|
+
expect(build(:<%= file_name %>)).to be_valid
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it 'instantiates' do
|
|
12
|
+
expect(described_class.new).to be_valid
|
|
13
|
+
end
|
|
14
|
+
# TODO: implement attribute tests
|
|
15
|
+
# <% attributes.each do |attribute| -%>
|
|
16
|
+
# it '#<%= attribute[:name] %>' do
|
|
17
|
+
# skip 'attribute type not implemented'
|
|
18
|
+
# case <%= attribute[:type] %>
|
|
19
|
+
# when 'string'
|
|
20
|
+
# expect(described_class.new).to be_valid
|
|
21
|
+
# when 'integer'
|
|
22
|
+
# expect(described_class.new).to be_valid
|
|
23
|
+
# when 'float'
|
|
24
|
+
# expect(described_class.new).to be_valid
|
|
25
|
+
# when 'boolean'
|
|
26
|
+
# expect(described_class.new).to be_valid
|
|
27
|
+
# when 'date'
|
|
28
|
+
# expect(described_class.new).to be_valid
|
|
29
|
+
# when 'datetime'
|
|
30
|
+
# expect(described_class.new).to be_valid
|
|
31
|
+
# when 'time'
|
|
32
|
+
# expect(described_class.new).to be_valid
|
|
33
|
+
# when 'decimal'
|
|
34
|
+
# expect(described_class.new).to be_valid
|
|
35
|
+
# when 'text'
|
|
36
|
+
# expect(described_class.new).to be_valid
|
|
37
|
+
# when 'binary'
|
|
38
|
+
# expect(described_class.new).to be_valid
|
|
39
|
+
# when 'json'
|
|
40
|
+
# expect(described_class.new).to be_valid
|
|
41
|
+
# when 'jsonb'
|
|
42
|
+
# expect(described_class.new).to be_valid
|
|
43
|
+
# when 'uuid'
|
|
44
|
+
# expect(described_class.new).to be_valid
|
|
45
|
+
# end
|
|
46
|
+
# end
|
|
47
|
+
# <% end %>
|
|
48
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'thor/group'
|
|
4
|
+
require 'active_support/inflector'
|
|
5
|
+
|
|
6
|
+
module BlueEyes
|
|
7
|
+
module Generators
|
|
8
|
+
# Generates Rails-style scaffold
|
|
9
|
+
class ScaffoldGenerator < Thor::Group
|
|
10
|
+
include Thor::Actions
|
|
11
|
+
|
|
12
|
+
desc "Generate an ActiveRecord model with it's associated views and controllers"
|
|
13
|
+
argument :name, type: :string, desc: 'Name of the model'
|
|
14
|
+
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
|
15
|
+
|
|
16
|
+
def create_model
|
|
17
|
+
ModelGenerator.new([name, attributes]).invoke_all
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def create_controller
|
|
21
|
+
ControllerGenerator.new([name]).invoke_all
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/lib/blue_eyes.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'blue_eyes/extensions/string'
|
|
4
|
+
require 'blue_eyes/generators/app/app_generator'
|
|
5
|
+
require 'blue_eyes/generators/controller/controller_generator'
|
|
6
|
+
require 'blue_eyes/generators/model/model_generator'
|
|
7
|
+
require 'blue_eyes/generators/scaffold/scaffold_generator'
|
|
8
|
+
require 'blue_eyes/cli'
|
|
9
|
+
require 'blue_eyes/version'
|
|
10
|
+
|
|
11
|
+
# BlueEyes is a Rails-style generator for Sinatra
|
|
12
|
+
module BlueEyes
|
|
13
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../test_helper'
|
|
4
|
+
|
|
5
|
+
class CLITest < Minitest::Test
|
|
6
|
+
def subject
|
|
7
|
+
BlueEyes::CLI
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_version
|
|
11
|
+
expected_response = "BlueEyes #{BlueEyes::VERSION::STRING}"
|
|
12
|
+
assert_output(/#{expected_response}/) do
|
|
13
|
+
subject.new.version
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_exit_on_failure
|
|
18
|
+
assert subject.exit_on_failure
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: false
|
|
2
|
+
|
|
3
|
+
require_relative '../../test_helper'
|
|
4
|
+
# require_relative "../../../lib/blue_eyes/extensions/string"
|
|
5
|
+
|
|
6
|
+
CAMEL_CASES = [
|
|
7
|
+
%w[my_app MyApp],
|
|
8
|
+
%w[my_App MyApp],
|
|
9
|
+
%w[MY_APP MyApp],
|
|
10
|
+
%w[my-app MyApp],
|
|
11
|
+
%w[MY-APP MyApp],
|
|
12
|
+
%w[myapp Myapp],
|
|
13
|
+
%w[MyApp MyApp]
|
|
14
|
+
].freeze
|
|
15
|
+
|
|
16
|
+
DIRECTORY_NAME_CASES = [
|
|
17
|
+
%w[my_app my_app],
|
|
18
|
+
%w[my_App my_app],
|
|
19
|
+
%w[MY_APP my_app],
|
|
20
|
+
%w[my-app my-app],
|
|
21
|
+
%w[my-App my-app],
|
|
22
|
+
%w[MY-APP my-app],
|
|
23
|
+
%w[myapp myapp],
|
|
24
|
+
%w[MyApp myapp]
|
|
25
|
+
].freeze
|
|
26
|
+
|
|
27
|
+
FILE_NAME_CASES = [
|
|
28
|
+
%w[my_app my_app],
|
|
29
|
+
%w[my_App my_app],
|
|
30
|
+
%w[MY_APP my_app],
|
|
31
|
+
%w[my-app my_app],
|
|
32
|
+
%w[MY-APP my_app],
|
|
33
|
+
%w[myapp myapp],
|
|
34
|
+
%w[MyApp my_app]
|
|
35
|
+
].freeze
|
|
36
|
+
|
|
37
|
+
module BlueEyes
|
|
38
|
+
module Extensions
|
|
39
|
+
class StringTest < Minitest::Test
|
|
40
|
+
def test_camel_case
|
|
41
|
+
CAMEL_CASES.each do |input, expected|
|
|
42
|
+
assert_equal input.camel_case, expected
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_camel_case!
|
|
47
|
+
CAMEL_CASES.each do |input, expected|
|
|
48
|
+
assert_equal input.camel_case!, expected
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def test_directory_name
|
|
53
|
+
DIRECTORY_NAME_CASES.each do |input, expected|
|
|
54
|
+
assert_equal input.directory_name, expected
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_file_name
|
|
59
|
+
FILE_NAME_CASES.each do |input, expected|
|
|
60
|
+
assert_equal input.file_name, expected
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_file_name!
|
|
65
|
+
FILE_NAME_CASES.each do |input, expected|
|
|
66
|
+
assert_equal input.file_name!, expected
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|