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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/.simplecov +8 -0
  4. data/Gemfile +24 -0
  5. data/Gemfile.lock +365 -0
  6. data/Guardfile +25 -0
  7. data/LICENSE +24 -0
  8. data/README.md +189 -0
  9. data/Rakefile +17 -0
  10. data/lib/.DS_Store +0 -0
  11. data/lib/blue_eyes/.DS_Store +0 -0
  12. data/lib/blue_eyes/cli.rb +26 -0
  13. data/lib/blue_eyes/extensions/string.rb +42 -0
  14. data/lib/blue_eyes/generators/.DS_Store +0 -0
  15. data/lib/blue_eyes/generators/app/.DS_Store +0 -0
  16. data/lib/blue_eyes/generators/app/app_generator.rb +163 -0
  17. data/lib/blue_eyes/generators/app/templates/.DS_Store +0 -0
  18. data/lib/blue_eyes/generators/app/templates/.rubocop.yml.erb +19 -0
  19. data/lib/blue_eyes/generators/app/templates/.rubocop_todo.yml.erb +1 -0
  20. data/lib/blue_eyes/generators/app/templates/.ruby-version.erb +1 -0
  21. data/lib/blue_eyes/generators/app/templates/.simplecov.erb +9 -0
  22. data/lib/blue_eyes/generators/app/templates/Gemfile.erb +39 -0
  23. data/lib/blue_eyes/generators/app/templates/Guardfile.erb +25 -0
  24. data/lib/blue_eyes/generators/app/templates/Procfile.dev.erb +6 -0
  25. data/lib/blue_eyes/generators/app/templates/Procfile.erb +1 -0
  26. data/lib/blue_eyes/generators/app/templates/README.md +1 -0
  27. data/lib/blue_eyes/generators/app/templates/Rakefile.erb +4 -0
  28. data/lib/blue_eyes/generators/app/templates/app/controllers/application_controller.rb +15 -0
  29. data/lib/blue_eyes/generators/app/templates/app/models/.gitkeep +0 -0
  30. data/lib/blue_eyes/generators/app/templates/app/views/layout.erb.tt +32 -0
  31. data/lib/blue_eyes/generators/app/templates/app/views/welcome.erb +23 -0
  32. data/lib/blue_eyes/generators/app/templates/bin/dev +11 -0
  33. data/lib/blue_eyes/generators/app/templates/config/db.yml +35 -0
  34. data/lib/blue_eyes/generators/app/templates/config/environment.rb +18 -0
  35. data/lib/blue_eyes/generators/app/templates/config/initializers/database.rb.erb +16 -0
  36. data/lib/blue_eyes/generators/app/templates/config/initializers/redis.rb +9 -0
  37. data/lib/blue_eyes/generators/app/templates/config/redis.yml +14 -0
  38. data/lib/blue_eyes/generators/app/templates/config.ru.erb +7 -0
  39. data/lib/blue_eyes/generators/app/templates/public/.DS_Store +0 -0
  40. data/lib/blue_eyes/generators/app/templates/public/favicon.ico +0 -0
  41. data/lib/blue_eyes/generators/app/templates/public/images/.gitkeep +0 -0
  42. data/lib/blue_eyes/generators/app/templates/public/images/blue-eyes-small.png +0 -0
  43. data/lib/blue_eyes/generators/app/templates/public/images/blue-eyes.svg +24 -0
  44. data/lib/blue_eyes/generators/app/templates/public/javascripts/.gitkeep +0 -0
  45. data/lib/blue_eyes/generators/app/templates/public/stylesheets/main.css +115 -0
  46. data/lib/blue_eyes/generators/app/templates/spec/application_controller_spec.rb +17 -0
  47. data/lib/blue_eyes/generators/app/templates/spec/factories/.gitkeep +0 -0
  48. data/lib/blue_eyes/generators/app/templates/spec/spec_helper.rb +45 -0
  49. data/lib/blue_eyes/generators/controller/controller_generator.rb +42 -0
  50. data/lib/blue_eyes/generators/controller/templates/controller.rb.erb +39 -0
  51. data/lib/blue_eyes/generators/controller/templates/views/edit.html.erb +1 -0
  52. data/lib/blue_eyes/generators/controller/templates/views/index.html.erb +1 -0
  53. data/lib/blue_eyes/generators/controller/templates/views/new.html.erb +1 -0
  54. data/lib/blue_eyes/generators/controller/templates/views/show.html.erb +1 -0
  55. data/lib/blue_eyes/generators/model/migration.rb.erb +13 -0
  56. data/lib/blue_eyes/generators/model/model.rb.erb +5 -0
  57. data/lib/blue_eyes/generators/model/model_factory.rb.erb +8 -0
  58. data/lib/blue_eyes/generators/model/model_generator.rb +68 -0
  59. data/lib/blue_eyes/generators/model/model_spec.rb.erb +48 -0
  60. data/lib/blue_eyes/generators/scaffold/scaffold_generator.rb +25 -0
  61. data/lib/blue_eyes/version.rb +11 -0
  62. data/lib/blue_eyes.rb +13 -0
  63. data/test/blue_eyes/cli_test.rb +20 -0
  64. data/test/blue_eyes/extensions/string_test.rb +71 -0
  65. data/test/blue_eyes/generators/app_generator_test.rb +142 -0
  66. data/test/blue_eyes/generators/controller/controller_generator_test.rb +57 -0
  67. data/test/blue_eyes/generators/model/model_generator_test.rb +40 -0
  68. data/test/blue_eyes/generators/scaffold/scaffold_generator_test.rb +21 -0
  69. data/test/blue_eyes/version_test.rb +24 -0
  70. data/test/blue_eyes_test.rb +1 -0
  71. data/test/test_helper.rb +6 -0
  72. 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
@@ -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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ # <%= class_name %> model
4
+ class <%= class_name %> < ActiveRecord::Base
5
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :<%= file_name %> do
5
+ # TODO: Add attributes with faker data
6
+ # name { Faker::Name.name }
7
+ end
8
+ 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
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BlueEyes
4
+ module VERSION
5
+ MAJOR = 1
6
+ MINOR = 3
7
+ TINY = 5
8
+
9
+ STRING = [MAJOR, MINOR, TINY].join('.')
10
+ end
11
+ 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