lazy_rails 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f21a8760eee41e80888c8c6ecd3a89d66498d7808f39808f68a1286e54cdcaea
4
- data.tar.gz: d04a62658292e5ff484450de7449b134c6535ba0233d0719fa2d5918e1237d1c
3
+ metadata.gz: 796e281f26e8854d6b40a9dd57d91df307042b59bee30b18fe1e9582b701726e
4
+ data.tar.gz: db561c103f7a9068c15dfed934afa1abc8da970cff1005c6c972912d5129db58
5
5
  SHA512:
6
- metadata.gz: d97f95a95b4beae9aab0a2583be1180c93485ccdab927d2d2494dfe2b124a325452fa93af7978b37d0dac8dc7d71731305a24a0da82f17788be9fe5ad2414dc2
7
- data.tar.gz: 394fa356d1f960c3a7c488897405cd4dd55712d019f49ff67b78218b3aa92f1dc43434df5c0a52901df95b9abdc2db68e02e02dbb17a793adae496707329ef09
6
+ metadata.gz: b19a0ee24ed361427461a18c49b97c4bbd00ca6376bfb29facd8eaae8d59e39dbe05bf3e519ff8fe27afc2e512cd470c165f28cffedc75377944a92bfb40594d
7
+ data.tar.gz: d27caa2e47b0ea57f3475815677a1998884420e340e49a5cb0482d2c39fcbaa64f01a60b360222046ce9a552e9f122d10152029d6ace5a0cf390d4ea55741f91
data/README.md CHANGED
@@ -38,23 +38,24 @@ Local installation: `bundle exec rake install`
38
38
 
39
39
  ## Roadmap
40
40
 
41
+ - [ ] test compatibility with other ruby/rails versions
41
42
  - [ ] Selection of Rails version (at least last 3)
42
43
  - [ ] View template selection (ERB, Haml, Slim)
43
44
  - [ ] Test tool selection (RSpec, Minitest, Test::Unit)
44
45
  - [ ] Linter selection (RuboCop, Standard)
45
- - [ ] CSS processor selection (Tailwind, Bootstrap, Bulma, PostCSS, Sass)
46
- - [ ] JavaScript processor selection (Importmap, Bun, Webpack, esbuild, Rollup)
47
- - [ ] Database selection (SQLite3, MySQL, PostgreSQL)
48
- - [ ] App type selection (API, Web)
49
46
  - [ ] Basic setup customization (Action Cable, Active Job, Action Mailer, Action Mailbox)
50
47
  - [ ] On-the-fly popular gem installation (Devise, Sidekiq, Solid Queue)
51
48
  - [ ] Improve documentation
52
- - [ ] Increase test coverage
53
49
  - [ ] Enhance error handling and user feedback
54
50
 
55
51
  ✅ Completed:
56
52
  - [x] Basic CLI structure
57
53
  - [x] 'new' command for project generation
54
+ - [x] CSS processor selection (Tailwind, Bootstrap, Bulma, PostCSS, Sass)
55
+ - [x] JavaScript processor selection (Importmap, Bun, Webpack, esbuild, Rollup)
56
+ - [x] Database selection (SQLite3, MySQL, PostgreSQL)
57
+ - [x] Increase test coverage
58
+ - [x] App type selection (API, Web)
58
59
 
59
60
  ## Contributing
60
61
 
@@ -1,98 +1,35 @@
1
+ require "pry"
1
2
  require "thor"
2
3
  require "tty-prompt"
3
4
 
4
- # TODO: add a way to select rails version
5
+ module CommandGenerators
6
+ autoload :Options, "lazy_rails/command_generators/options"
7
+ end
8
+
5
9
  module LazyRails
6
10
  class CLI < Thor
7
- RAILS_NEW_COMMAND = ["rails new"]
8
- APP_TYPES = {
9
- "api" => "--api"
10
- }
11
- DB_OPTIONS = {
12
- "mysql" => "--database=mysql",
13
- "postgresql" => "--database=postgresql",
14
- "trilogy" => "--database=trilogy"
15
- }
16
- JS_OPTIONS = {
17
- "esbuild" => "--javascript=esbuild",
18
- "bun" => "--javascript=bun",
19
- "rollup" => "--javascript=rollup",
20
- "webpack" => "--javascript=webpack"
21
- }
22
- CSS_OPTIONS = {
23
- "tailwind" => "--css=tailwind",
24
- "bootstrap" => "--css=bootstrap",
25
- "bulma" => "--css=bulma",
26
- "postcss" => "--css=postcss",
27
- "sass" => "--css=sass"
28
- }
29
- SKIP_OPTIONS = {
30
- "jbuilder" => "--skip-jbuilder",
31
- "minitest" => "--skip-test",
32
- "rubocop" => "--skip-rubocop",
33
- "brakeman" => "--skip-brakeman"
34
- }
35
-
36
11
  desc "new", "Start new rails project"
37
12
  def new
38
- prompt = TTY::Prompt.new
39
-
40
13
  puts "Welcome to the Rails Project Setup Wizard!"
41
14
 
42
- # Project name
43
- project_name = prompt.ask("What is the name of your project?") do |q|
44
- q.default "rails-app-#{Time.now.strftime("%Y%m%d%H%M%S")}"
45
- q.required true
46
- q.validate(/\A[\w-]+\z/)
47
- q.messages[:valid?] = "Project name can only contain letters, numbers, underscores, and dashes"
48
- end
49
-
50
- # Database selection
51
- db_option = prompt.select("Choose your database:", show_help: :always) do |menu|
52
- menu.choice "SQLite(default)", "sqlite3"
53
- menu.choice "MySQL", "mysql"
54
- menu.choice "Trilogy", "trilogy"
55
- menu.choice "PostgreSQL", "postgresql"
56
- end
57
-
58
- # Project type
59
- project_type = prompt.select("Choose your project type:", %w[web api], show_help: :always)
60
-
61
- unless project_type == "api"
62
- # JavaScript approach
63
- js_option = prompt.select("Choose your JavaScript approach:", %w[importmap esbuild bun rollup webpack], show_help: :always)
15
+ command = CommandBuilder.new(
16
+ PromptGenerators::AskAppName.new(prompt).call
17
+ )
18
+ command.options << PromptGenerators::SelectDb.new(prompt).call
19
+ command.options << app_type = PromptGenerators::SelectAppType.new(prompt).call
64
20
 
65
- # CSS processor
66
- css_option = prompt.select("Choose your CSS processor:", %w[none tailwind bootstrap bulma postcss sass], show_help: :always)
21
+ if app_type == "web"
22
+ command.options << PromptGenerators::SelectJs.new(prompt).call
23
+ command.options << PromptGenerators::SelectCss.new(prompt).call
67
24
  end
68
25
 
69
- # Skip rails setup defaults
70
- rails_setup_defaults = prompt.multi_select("SKIP RAILS DEFAULTS:", show_help: :always) do |menu|
71
- menu.choice "jbuilder"
72
- menu.choice "minitest"
73
- menu.choice "rubocop"
74
- menu.choice "brakeman"
75
- end
76
-
77
- RAILS_NEW_COMMAND << project_name
78
- RAILS_NEW_COMMAND << DB_OPTIONS[db_option] if db_option
79
- RAILS_NEW_COMMAND << APP_TYPES[project_type] if project_type
80
- RAILS_NEW_COMMAND << JS_OPTIONS[js_option] if js_option
81
- RAILS_NEW_COMMAND << CSS_OPTIONS[css_option] if css_option
82
-
83
- rails_setup_defaults.each do |tool|
84
- RAILS_NEW_COMMAND << SKIP_OPTIONS[tool]
85
- end
86
-
87
- rails_new_command = RAILS_NEW_COMMAND.compact.join(" ")
88
- # Display the final command
26
+ command.options << PromptGenerators::SelectTools.new(prompt).call
89
27
  puts "\nYour Rails project will be created with the following command:"
90
- puts rails_new_command
28
+ puts command.build
91
29
 
92
- # Ask for confirmation
93
30
  if prompt.yes?("Do you want to run this command now?")
94
- system(rails_new_command)
95
- puts "Rails project '#{project_name}' has been created!"
31
+ system(command.build)
32
+ puts "Rails project '#{command.app_name}' has been created!"
96
33
  else
97
34
  puts "Command not executed. You can run it manually when you're ready."
98
35
  end
@@ -102,5 +39,11 @@ module LazyRails
102
39
  def version
103
40
  puts "LazyRails version #{LazyRails::VERSION}"
104
41
  end
42
+
43
+ private
44
+
45
+ def prompt
46
+ @_prompt ||= TTY::Prompt.new
47
+ end
105
48
  end
106
49
  end
@@ -0,0 +1,48 @@
1
+ require "thor"
2
+ require "tty-prompt"
3
+
4
+ module LazyRails
5
+ module Commands
6
+ class New < Thor
7
+ include NewCommand::Options
8
+
9
+ RAILS_NEW_COMMAND = ["rails new"]
10
+
11
+ desc "new", "Start new rails project"
12
+ def new
13
+ puts "Welcome to the Rails Project Setup Wizard!"
14
+
15
+ app_name = PromptGenerators::AppName.new(prompt).call
16
+ selected_db = PromptGenerators.new(prompt).call
17
+ selected_app_type = PromptGenerators::SelectAppType.new(prompt).call
18
+
19
+ if selected_app_type == "web"
20
+ selected_js = PromptGenerators::SelectJs.new(prompt).call
21
+ selected_css = PromptGenerators::SelectCss.new(prompt).call
22
+ end
23
+
24
+ selected_tools = PromptGenerators::SelectTools.new(prompt).call
25
+
26
+ rails_new_command = RAILS_NEW_COMMAND.compact.join(" ")
27
+
28
+ # Display the final command
29
+ puts "\nYour Rails project will be created with the following command:"
30
+ puts rails_new_command
31
+
32
+ # Ask for confirmation
33
+ if prompt.yes?("Do you want to run this command now?")
34
+ system(rails_new_command)
35
+ puts "Rails project '#{project_name}' has been created!"
36
+ else
37
+ puts "Command not executed. You can run it manually when you're ready."
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def prompt
44
+ @_prompt ||= TTY::Prompt.new
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,8 @@
1
+ module LazyRails
2
+ module Commands
3
+ module NewCommand
4
+ class Generator
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ module NewCommand
2
+ OPTIONS = {
3
+ "api" => "--api",
4
+ "mysql" => "--database=mysql",
5
+ "postgresql" => "--database=postgresql",
6
+ "trilogy" => "--database=trilogy",
7
+ "esbuild" => "--javascript=esbuild",
8
+ "bun" => "--javascript=bun",
9
+ "rollup" => "--javascript=rollup",
10
+ "webpack" => "--javascript=webpack",
11
+ "tailwind" => "--css=tailwind",
12
+ "bootstrap" => "--css=bootstrap",
13
+ "bulma" => "--css=bulma",
14
+ "postcss" => "--css=postcss",
15
+ "sass" => "--css=sass",
16
+ "jbuilder" => "--skip-jbuilder",
17
+ "minitest" => "--skip-test",
18
+ "rubocop" => "--skip-rubocop",
19
+ "brakeman" => "--skip-brakeman"
20
+ }
21
+ end
@@ -0,0 +1,8 @@
1
+ module LazyRails
2
+ module Commands
3
+ module NewCommand
4
+ class Generator
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ module LazyRails
2
+ module NewCommand
3
+ OPTIONS = {
4
+ "api" => "--api",
5
+ "mysql" => "--database=mysql",
6
+ "postgresql" => "--database=postgresql",
7
+ "trilogy" => "--database=trilogy",
8
+ "esbuild" => "--javascript=esbuild",
9
+ "bun" => "--javascript=bun",
10
+ "rollup" => "--javascript=rollup",
11
+ "webpack" => "--javascript=webpack",
12
+ "tailwind" => "--css=tailwind",
13
+ "bootstrap" => "--css=bootstrap",
14
+ "bulma" => "--css=bulma",
15
+ "postcss" => "--css=postcss",
16
+ "sass" => "--css=sass",
17
+ "jbuilder" => "--skip-jbuilder",
18
+ "minitest" => "--skip-test",
19
+ "rubocop" => "--skip-rubocop",
20
+ "brakeman" => "--skip-brakeman"
21
+ }
22
+ end
23
+ end
@@ -0,0 +1,74 @@
1
+ module LazyRails
2
+ module PromptGenerators
3
+ class Base
4
+ attr_reader :prompt
5
+
6
+ def initialize(prompt)
7
+ @prompt = prompt
8
+ end
9
+ end
10
+
11
+ class SelectAppType < Base
12
+ def call
13
+ prompt.select(
14
+ "Choose your project type:",
15
+ %w[web api],
16
+ show_help: :always
17
+ )
18
+ end
19
+ end
20
+
21
+ class SelectDb < Base
22
+ def call
23
+ prompt.select("Choose your database:", show_help: :always) do |menu|
24
+ menu.choice "SQLite(default)", "sqlite3"
25
+ menu.choice "MySQL", "mysql"
26
+ menu.choice "Trilogy", "trilogy"
27
+ menu.choice "PostgreSQL", "postgresql"
28
+ end
29
+ end
30
+ end
31
+
32
+ class SelectJs < Base
33
+ def call
34
+ prompt.select(
35
+ "Choose your JavaScript approach:",
36
+ %w[importmap esbuild bun rollup webpack],
37
+ show_help: :always
38
+ )
39
+ end
40
+ end
41
+
42
+ class SelectCss < Base
43
+ def call
44
+ prompt.select(
45
+ "Choose your CSS processor:",
46
+ %w[none tailwind bootstrap bulma postcss sass],
47
+ show_help: :always
48
+ )
49
+ end
50
+ end
51
+
52
+ class AskAppName < Base
53
+ def call
54
+ prompt.ask("What is the name of your project?") do |q|
55
+ q.default "rails-app-#{Time.now.to_i}"
56
+ q.required true
57
+ q.validate(/\A[\w-]+\z/)
58
+ q.messages[:valid?] = "Project name can only contain letters, numbers, underscores, and dashes"
59
+ end
60
+ end
61
+ end
62
+
63
+ class SelectTools < Base
64
+ def call
65
+ prompt.multi_select("SKIP RAILS DEFAULTS:", show_help: :always) do |menu|
66
+ menu.choice "jbuilder"
67
+ menu.choice "minitest"
68
+ menu.choice "rubocop"
69
+ menu.choice "brakeman"
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LazyRails
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
data/lib/lazy_rails.rb CHANGED
@@ -1,9 +1,60 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "lazy_rails/version"
4
+ require_relative "lazy_rails/prompt_generators"
4
5
  require_relative "lazy_rails/cli"
6
+ # require_relative "lazy_rails/commands/new"
7
+ # require_relative "lazy_rails/commands/new_command/generator"
5
8
 
6
9
  module LazyRails
10
+ module NewCommand
11
+ OPTIONS = {
12
+ "api" => "--api",
13
+ "mysql" => "--database=mysql",
14
+ "postgresql" => "--database=postgresql",
15
+ "trilogy" => "--database=trilogy",
16
+ "esbuild" => "--javascript=esbuild",
17
+ "bun" => "--javascript=bun",
18
+ "rollup" => "--javascript=rollup",
19
+ "webpack" => "--javascript=webpack",
20
+ "tailwind" => "--css=tailwind",
21
+ "bootstrap" => "--css=bootstrap",
22
+ "bulma" => "--css=bulma",
23
+ "postcss" => "--css=postcss",
24
+ "sass" => "--css=sass",
25
+ "jbuilder" => "--skip-jbuilder",
26
+ "minitest" => "--skip-test",
27
+ "rubocop" => "--skip-rubocop",
28
+ "brakeman" => "--skip-brakeman"
29
+ }
30
+ end
31
+
7
32
  class Error < StandardError; end
8
- # Your code goes here...
33
+
34
+ class CommandBuilder
35
+ attr_accessor :app_name, :options
36
+
37
+ def initialize(app_name)
38
+ @app_name = app_name
39
+ @options = []
40
+ end
41
+
42
+ def build
43
+ if block_given?
44
+ yield self
45
+ end
46
+ command = base_command + build_options
47
+ command.compact.join(" ").strip
48
+ end
49
+
50
+ def build_options
51
+ options.flatten.map do |option|
52
+ NewCommand::OPTIONS[option]
53
+ end
54
+ end
55
+
56
+ def base_command
57
+ ["rails new #{app_name}"]
58
+ end
59
+ end
9
60
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lazy_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fagner Pereira Rosa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-15 00:00:00.000000000 Z
11
+ date: 2024-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: thor
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
13
  - !ruby/object:Gem::Dependency
28
14
  name: tty-prompt
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -65,6 +51,12 @@ files:
65
51
  - bin/lazy_rails
66
52
  - lib/lazy_rails.rb
67
53
  - lib/lazy_rails/cli.rb
54
+ - lib/lazy_rails/commands/new.rb
55
+ - lib/lazy_rails/commands/new_command/generator.rb
56
+ - lib/lazy_rails/commands/new_command/options.rb
57
+ - lib/lazy_rails/new_command/generator.rb
58
+ - lib/lazy_rails/new_command/options.rb
59
+ - lib/lazy_rails/prompt_generators.rb
68
60
  - lib/lazy_rails/version.rb
69
61
  homepage: https://github.com/fagnerpereira/lazy_rails
70
62
  licenses: