tractor_beam 0.1.1 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f49e5bfadcf96d455602acc17ecdde6d7d87504c2dc24c4b34317e5949a4300
4
- data.tar.gz: fdbe9a0b243273b8f3e940febe616be01e3f158fe66e744ad06d55d16c879bc7
3
+ metadata.gz: 75dd77823d41fe116f0fc1b2d8285e150f1e1f772d1d74c520241f288ef82ea4
4
+ data.tar.gz: fd19dea1a3946b93220ab38e6eafba1f280fc73a5461ff3e419af08d334eae23
5
5
  SHA512:
6
- metadata.gz: 04ba7de3e527c5122ed8b6e76b1dc8adeac43082cad13db0c4c1b36e79beab5b29f561c52261334b877d8e839faccae87489e628e353a259bf2af7f1c99ee5be
7
- data.tar.gz: 5d68257efcb7144cf0386fa25ad07a339afafcf064b77726944d02c20cc1b4f2a112a4c52dc6710f854bf3d6f3d7f9ed4965d3ef5977e1fa9614584975fb5669
6
+ metadata.gz: 59513cd6a6ffbe68e575a5418aa0a9ff605bc1a7ab2cdf259e8766b7b572a8fe1ba7c6af0a4d18514cfe7925a8caf0ca061bf4c57fa591a08f4926c04e38c6a0
7
+ data.tar.gz: 88b2da410bad5e396f0faa3e0d347e78598edd48f1b4ac8dc8da1ab05c987a26758a95865ea635d854b8974902c255b49ddadc8e51b5d6c56683cebd6dcfaecc
data/.rubocop.yml ADDED
@@ -0,0 +1,50 @@
1
+ AllCops:
2
+ Exclude:
3
+ - templates/**/*
4
+
5
+ Style/StringLiterals:
6
+ EnforcedStyle: double_quotes
7
+
8
+ Metrics/LineLength:
9
+ Enabled: false
10
+
11
+ Layout/AlignParameters:
12
+ EnforcedStyle: with_first_parameter
13
+
14
+ Layout/IndentHeredoc:
15
+ Enabled: false
16
+
17
+ Metrics/ClassLength:
18
+ Enabled: false
19
+
20
+ Metrics/MethodLength:
21
+ Enabled: false
22
+
23
+ Naming/AccessorMethodName:
24
+ Exclude:
25
+ - 'lib/tractor_beam/generators/app_generator.rb'
26
+
27
+ Style/Documentation:
28
+ Enabled: false
29
+
30
+ Metrics/LineLength:
31
+ Enabled: false
32
+
33
+ Metrics/BlockLength:
34
+ Enabled: false
35
+
36
+ Style/PercentLiteralDelimiters:
37
+ Enabled: true
38
+ PreferredDelimiters:
39
+ "%": "()"
40
+ "%i": "()"
41
+ "%q": "()"
42
+ "%Q": "()"
43
+ "%r": "{}"
44
+ "%s": "()"
45
+ "%w": "()"
46
+ "%W": "()"
47
+ "%x": "()"
48
+
49
+ Style/TrailingCommaInArguments:
50
+ EnforcedStyleForMultiline: comma
data/.travis.yml CHANGED
@@ -1,5 +1,25 @@
1
- sudo: false
2
1
  language: ruby
3
- rvm:
4
- - 2.5.0
5
- before_install: gem install bundler -v 1.16.1
2
+ rvm: 2.5.0
3
+ cache: bundler
4
+ sudo: false
5
+ before_install:
6
+ - "echo '--colour' > ~/.rspec"
7
+ - git config --global user.name 'Travis CI'
8
+ - git config --global user.email 'travis-ci@example.com'
9
+ - gem update --system
10
+ -
11
+ install: bundle install
12
+
13
+ env:
14
+ global:
15
+ - CC_TEST_REPORTER_ID="09ed0410f3fbea5adfde57a2176ee68472404421c98b17ea57139beaa425308b"
16
+
17
+ before_script:
18
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
19
+ - chmod +x ./cc-test-reporter
20
+ - ./cc-test-reporter before-build
21
+
22
+ script:
23
+ - bundle exec rubocop
24
+ - bundle exec rspec
25
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # Change log
2
+
3
+ ## 0.1.2 (2018-01-017)
4
+
5
+ * Add rubocop development dependency
6
+ * Setup project on Travis CI
7
+ * Ensure jquery-ujs yarn package is installed
8
+ * Ensure actioncable yarn package is install unless `skip_action_cable` option is true
9
+ * Ensure turbolinks yarn package is install unless `skip_turbolinks` option is true
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
6
 
5
7
  # Specify your gem's dependencies in tractor_beam.gemspec
6
8
  gemspec
data/README.md CHANGED
@@ -1,3 +1,6 @@
1
+ [![Maintainability](https://api.codeclimate.com/v1/badges/c07d77e147686e90e0b0/maintainability)](https://codeclimate.com/github/gizotti/tractor_beam/maintainability)
2
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/c07d77e147686e90e0b0/test_coverage)](https://codeclimate.com/github/gizotti/tractor_beam/test_coverage)
3
+
1
4
  # Tractor Beam
2
5
 
3
6
  <img src="https://www.dropbox.com/s/cidq3h3jta78fto/tractor-beam.png?raw=1"
@@ -94,11 +97,6 @@ frontend/components
94
97
 
95
98
  ## Todo List
96
99
  - [ ] Write Specs
97
- - [ ] Setup rubocop for gem (not generated project)
98
- - [ ] Edit Readme.md.erb so it's not just a copy of thoughtbot's template
99
- - [ ] jquery-ujs yarn package
100
- - [ ] ActionCable yarn package unless skip-actioncable
101
- - [ ] Turbolinks yarn package and config unless skip-turbolinks
102
100
  - [ ] Normalize css
103
101
  - [ ] Simple Form
104
102
  - [ ] Testing configuration
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
data/USAGE ADDED
@@ -0,0 +1,14 @@
1
+ Description:
2
+ Suspenders is a Rails template with with defaults
3
+ for component based frontend, as described by
4
+ https://evilmartians.com/chronicles/evil-front-part-1
5
+
6
+ For full details on the changes we've made compared to
7
+ a vanilla Rails app, check our GitHub project:
8
+ https://github.com/gizotti/tractor_beam
9
+
10
+ Example:
11
+ tractor_beam ~/Code/weblog
12
+
13
+ This generates a Rails installation in ~/Code/weblog configured
14
+ with our preferred defaults.
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "bundler/setup"
4
5
  require "tractor_beam"
data/bin/tractor_beam CHANGED
@@ -1,17 +1,19 @@
1
1
  #!/usr/bin/env ruby
2
- require 'pathname'
2
+ # frozen_string_literal: true
3
3
 
4
- source_path = (Pathname.new(__FILE__).dirname + '../lib').expand_path
4
+ require "pathname"
5
+
6
+ source_path = (Pathname.new(__FILE__).dirname + "../lib").expand_path
5
7
  $LOAD_PATH << source_path
6
8
 
7
- require 'tractor_beam'
9
+ require "tractor_beam"
8
10
 
9
11
  if ARGV.empty?
10
12
  puts "Please provide a path for the new application"
11
13
  puts
12
14
  puts "See --help for more info"
13
15
  exit 0
14
- elsif ['-v', '--version'].include? ARGV[0]
16
+ elsif ["-v", "--version"].include? ARGV[0]
15
17
  puts TractorBeam::VERSION
16
18
  exit 0
17
19
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TractorBeam
2
4
  class AppBuilder < Rails::AppBuilder
3
5
  def readme
@@ -13,7 +15,7 @@ module TractorBeam
13
15
  end
14
16
 
15
17
  def set_ruby_version
16
- create_file '.ruby-version', "#{TractorBeam::RUBY_VERSION}\n"
18
+ create_file ".ruby-version", "#{TractorBeam::RUBY_VERSION}\n"
17
19
  end
18
20
 
19
21
  def procfile_dev
@@ -40,14 +42,17 @@ module TractorBeam
40
42
 
41
43
  inside "frontend" do
42
44
  directory "packs"
43
- directory "init"
45
+ empty_directory "init"
44
46
  end
47
+
48
+ template "frontend/init/index.css", "frontend/init/index.css", force: true
49
+ template "frontend/init/index.js.erb", "frontend/init/index.js", force: true
45
50
  end
46
51
 
47
52
  def create_application_layout
48
- template 'tractor_beam_layout.html.erb.erb',
49
- 'app/views/layouts/application.html.erb',
50
- force: true
53
+ template "tractor_beam_layout.html.erb.erb",
54
+ "app/views/layouts/application.html.erb",
55
+ force: true
51
56
  end
52
57
 
53
58
  def setup_browserlist_rc
@@ -62,8 +67,8 @@ module TractorBeam
62
67
 
63
68
  def prepend_view_path_to_application_controller
64
69
  insert_into_file "app/controllers/application_controller.rb",
65
- " prepend_view_path Rails.root.join(\"frontend\")\n",
66
- after: "protect_from_forgery with: :exception\n"
70
+ " prepend_view_path Rails.root.join(\"frontend\")\n",
71
+ after: "protect_from_forgery with: :exception\n"
67
72
  end
68
73
 
69
74
  # Linting
@@ -111,8 +116,8 @@ module TractorBeam
111
116
  SCRIPTS
112
117
 
113
118
  insert_into_file "package.json",
114
- scripts,
115
- after: "},\n"
119
+ scripts,
120
+ after: "},\n"
116
121
  end
117
122
 
118
123
  # Generators
@@ -131,7 +136,7 @@ module TractorBeam
131
136
  end
132
137
  RUBY
133
138
 
134
- inject_into_class 'config/application.rb', 'Application', config
139
+ inject_into_class "config/application.rb", "Application", config
135
140
  end
136
141
 
137
142
  def component_generator
@@ -139,5 +144,29 @@ module TractorBeam
139
144
 
140
145
  template "component_generator", "lib/generators/component_generator.rb"
141
146
  end
147
+
148
+ # Default Rails Features
149
+
150
+ def setup_rails_ujs
151
+ say "Installing rails-ujs"
152
+
153
+ run "yarn add rails-ujs"
154
+ end
155
+
156
+ def setup_actioncable
157
+ return if options[:skip_action_cable]
158
+ say "Installing actioncable"
159
+
160
+ run "yarn add actioncable"
161
+
162
+ empty_directory "frontend/client"
163
+ template "cable_js", "frontend/client/cable.js", force: true
164
+ end
165
+
166
+ def setup_turbolinks
167
+ return if options[:skip_turbolinks]
168
+
169
+ run "yarn add turbolinks"
170
+ end
142
171
  end
143
172
  end
@@ -1,45 +1,47 @@
1
- require 'rails/generators'
2
- require 'rails/generators/rails/app/app_generator'
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "rails/generators/rails/app/app_generator"
3
5
 
4
6
  module TractorBeam
5
7
  class AppGenerator < Rails::Generators::AppGenerator
6
8
  hide!
7
9
 
8
10
  class_option :database, type: :string, aliases: "-d", default: "postgresql",
9
- desc: "Configure for selected database (options: #{DATABASES.join("/")})"
11
+ desc: "Configure for selected database (options: #{DATABASES.join('/')})"
10
12
 
11
13
  class_option :version, type: :boolean, aliases: "-v", group: :tractor_beam,
12
- desc: "Show TractorBeam version number and quit"
14
+ desc: "Show TractorBeam version number and quit"
13
15
 
14
- class_option :help, type: :boolean, aliases: '-h', group: :tractor_beam,
15
- desc: "Show this help message and quit"
16
+ class_option :help, type: :boolean, aliases: "-h", group: :tractor_beam,
17
+ desc: "Show this help message and quit"
16
18
 
17
19
  class_option :path, type: :string, default: nil,
18
- desc: "Path to the gem"
20
+ desc: "Path to the gem"
19
21
 
20
22
  class_option :skip_test, type: :boolean, default: true,
21
- desc: "Skip Test Unit"
23
+ desc: "Skip Test Unit"
22
24
 
23
25
  class_option :skip_system_test, type: :boolean, default: true,
24
- desc: "Skip system test files"
26
+ desc: "Skip system test files"
25
27
 
26
28
  class_option :skip_turbolinks, type: :boolean, default: true,
27
- desc: "Skip turbolinks gem"
29
+ desc: "Skip turbolinks gem"
28
30
 
29
31
  class_option :skip_sprockets, type: :boolean, aliases: "-S",
30
- default: true, desc: "Skip Sprockets files"
32
+ default: true, desc: "Skip Sprockets files"
31
33
 
32
34
  class_option :skip_coffee, type: :boolean, default: true,
33
- desc: "Don't use CoffeeScript"
35
+ desc: "Don't use CoffeeScript"
34
36
 
35
37
  class_option :webpack, type: :string, default: "webpack",
36
- desc: "Preconfigure for app-like JavaScript with Webpack (options: #{WEBPACKS.join('/')})"
37
-
38
- def finish_template
39
- invoke :beam_customizations
38
+ desc: "Preconfigure for app-like JavaScript with Webpack (options: #{WEBPACKS.join('/')})"
40
39
 
41
- super
42
- end
40
+ # def finish_template
41
+ # invoke :beam_customizations
42
+ #
43
+ # super
44
+ # end
43
45
 
44
46
  def beam_customizations
45
47
  build :set_ruby_version
@@ -48,6 +50,7 @@ module TractorBeam
48
50
  invoke :setup_production_environment
49
51
  invoke :run_bundle
50
52
  invoke :run_webpack
53
+ invoke :setup_defaul_rails_features_on_webpack
51
54
  invoke :setup_component_based_frontend
52
55
  invoke :setup_linters
53
56
  invoke :generate_spring_binstubs
@@ -89,6 +92,12 @@ module TractorBeam
89
92
  build :procfile
90
93
  end
91
94
 
95
+ def setup_defaul_rails_features_on_webpack
96
+ build :setup_rails_ujs
97
+ build :setup_actioncable
98
+ build :setup_turbolinks
99
+ end
100
+
92
101
  def git_first_commit
93
102
  say "Commiting skeleton app to git"
94
103
 
@@ -106,6 +115,10 @@ OUTRO
106
115
  say outro_text, :blue
107
116
  end
108
117
 
118
+ def self.banner
119
+ "tractor_beam #{arguments.map(&:usage).join(' ')} [options]"
120
+ end
121
+
109
122
  protected
110
123
 
111
124
  def get_builder_class
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TractorBeam
2
- RAILS_VERSION = "~> 5.1.4".freeze
3
- RUBY_VERSION = "2.5.0".freeze
4
- VERSION = "0.1.1"
4
+ RAILS_VERSION = "~> 5.1.4"
5
+ RUBY_VERSION = "2.5.0"
6
+ VERSION = "0.1.2"
5
7
  end
data/lib/tractor_beam.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "tractor_beam/version"
2
4
  require "tractor_beam/generators/app_generator"
3
5
  require "tractor_beam/app_builder"
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe "Command line help output" do
6
+ let(:help_text) { tractor_beam_help_command }
7
+
8
+ it "does not contain the default rails usage statement" do
9
+ expect(help_text).not_to include("rails new APP_PATH [options]")
10
+ end
11
+
12
+ it "provides the correct usage statement for tractor_beam" do
13
+ expect(help_text).to include <<~TEXT
14
+ Usage:
15
+ tractor_beam APP_PATH [options]
16
+ TEXT
17
+ end
18
+
19
+ it "does not contain the default rails group" do
20
+ expect(help_text).not_to include("Rails options:")
21
+ end
22
+
23
+ it "provides help and version usage within the tractor_beam group" do
24
+ expect(help_text).to include <<~TEXT
25
+ Tractor_beam options:
26
+ -h, [--help], [--no-help] # Show this help message and quit
27
+ -v, [--version], [--no-version] # Show TractorBeam version number and quit
28
+ TEXT
29
+ end
30
+
31
+ it "does not show the default extended rails help section" do
32
+ expect(help_text).not_to include("Create tractor_beam files for app generator.")
33
+ end
34
+
35
+ it "contains the usage statement from the tractor_beam gem" do
36
+ expect(help_text).to include IO.read(usage_file)
37
+ end
38
+ end
@@ -0,0 +1,203 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe "Bootstraps new project with default configuration" do
6
+ before(:all) do
7
+ drop_dummy_database
8
+ remove_project_directory
9
+ run_tractor_beam
10
+ end
11
+
12
+ it "uses custom Gemfile" do
13
+ gemfile_file = IO.read("#{project_path}/Gemfile")
14
+ expect(gemfile_file).to match(
15
+ /^ruby "#{TractorBeam::RUBY_VERSION}"$/,
16
+ )
17
+ expect(gemfile_file).to match(
18
+ /^gem "rails", "#{TractorBeam::RAILS_VERSION}"$/,
19
+ )
20
+ end
21
+
22
+ # it "ensures project specs pass" do
23
+ # Dir.chdir(project_path) do
24
+ # Bundler.with_clean_env do
25
+ # expect(`rake`).to include('0 failures')
26
+ # end
27
+ # end
28
+ # end
29
+
30
+ # it "includes the bundle:audit task" do
31
+ # Dir.chdir(project_path) do
32
+ # Bundler.with_clean_env do
33
+ # expect(`rails -T`).to include("rails bundle:audit")
34
+ # end
35
+ # end
36
+ # end
37
+
38
+ it "creates .ruby-version from TractorBeam .ruby-version" do
39
+ ruby_version_file = IO.read("#{project_path}/.ruby-version")
40
+
41
+ expect(ruby_version_file).to eq "#{RUBY_VERSION}\n"
42
+ end
43
+
44
+ # it "copies dotfiles" do
45
+ # %w[.ctags .env].each do |dotfile|
46
+ # expect(File).to exist("#{project_path}/#{dotfile}")
47
+ # end
48
+ # end
49
+
50
+ it "doesn't generate test directory" do
51
+ expect(File).not_to exist("#{project_path}/test")
52
+ end
53
+
54
+ # it "loads secret_key_base from env" do
55
+ # secrets_file = IO.read("#{project_path}/config/secrets.yml")
56
+ #
57
+ # expect(secrets_file).
58
+ # to match(/secret_key_base: <%= ENV\["SECRET_KEY_BASE"\] %>/)
59
+ # end
60
+
61
+ it "adds bin/setup file" do
62
+ expect(File).to exist("#{project_path}/bin/setup")
63
+ end
64
+
65
+ it "makes bin/setup executable" do
66
+ bin_setup_path = "#{project_path}/bin/setup"
67
+
68
+ expect(File.stat(bin_setup_path)).to be_executable
69
+ end
70
+
71
+ # it "adds support file for action mailer" do
72
+ # expect(File).to exist("#{project_path}/spec/support/action_mailer.rb")
73
+ # end
74
+
75
+ # it "configures capybara-webkit" do
76
+ # expect(File).to exist("#{project_path}/spec/support/capybara_webkit.rb")
77
+ # end
78
+
79
+ # it "adds support file for i18n" do
80
+ # expect(File).to exist("#{project_path}/spec/support/i18n.rb")
81
+ # end
82
+
83
+ # it "initializes ActiveJob to avoid memory bloat" do
84
+ # expect(File).
85
+ # to exist("#{project_path}/config/initializers/active_job.rb")
86
+ # end
87
+
88
+ # fit "raises on unpermitted parameters in all environments" do
89
+ # result = IO.read("#{project_path}/config/application.rb")
90
+ #
91
+ # expect(result).to match(
92
+ # /^ +config.action_controller.action_on_unpermitted_parameters = :raise$/,
93
+ # )
94
+ # end
95
+
96
+ # it "configures production environment to enforce SSL" do
97
+ # expect(production_config).to match(
98
+ # /^ +config.force_ssl = true/,
99
+ # )
100
+ # end
101
+
102
+ # it "configs simple_form" do
103
+ # expect(File).to exist("#{project_path}/config/initializers/simple_form.rb")
104
+ # end
105
+
106
+ # it "configs :test email delivery method for development" do
107
+ # expect(development_config).
108
+ # to match(/^ +config.action_mailer.delivery_method = :file$/)
109
+ # end
110
+
111
+ # it "sets action mailer default host and asset host" do
112
+ # config_key = 'config\.action_mailer\.asset_host'
113
+ # config_value =
114
+ # %q{ENV\.fetch\("ASSET_HOST", ENV\.fetch\("APPLICATION_HOST"\)\)}
115
+ # expect(production_config).to match(/#{config_key} = #{config_value}/)
116
+ # end
117
+
118
+ # it "uses APPLICATION_HOST, not HOST in the production config" do
119
+ # expect(production_config).to match(/"APPLICATION_HOST"/)
120
+ # expect(production_config).not_to match(/"HOST"/)
121
+ # end
122
+
123
+ # it "configures email interceptor in smtp config" do
124
+ # smtp_file = IO.read("#{project_path}/config/smtp.rb")
125
+ # expect(smtp_file).
126
+ # to match(/RecipientInterceptor.new\(ENV\["EMAIL_RECIPIENTS"\]\)/)
127
+ # end
128
+
129
+ it "adds spring to binstubs" do
130
+ expect(File).to exist("#{project_path}/bin/spring")
131
+
132
+ bin_stubs = %w(rake rails rspec)
133
+ bin_stubs.each do |bin_stub|
134
+ expect(IO.read("#{project_path}/bin/#{bin_stub}")).to match(/spring/)
135
+ end
136
+ end
137
+
138
+ # it "removes comments and extra newlines from config files" do
139
+ # config_files = [
140
+ # IO.read("#{project_path}/config/application.rb"),
141
+ # IO.read("#{project_path}/config/environment.rb"),
142
+ # development_config,
143
+ # test_config,
144
+ # production_config,
145
+ # ]
146
+ #
147
+ # config_files.each do |file|
148
+ # expect(file).not_to match(/.*#.*/)
149
+ # expect(file).not_to match(/^$\n/)
150
+ # end
151
+ # end
152
+
153
+ # it "copies factories.rb" do
154
+ # expect(File).to exist("#{project_path}/spec/factories.rb")
155
+ # end
156
+
157
+ def app_name
158
+ TractorBeamTestHelpers::APP_NAME
159
+ end
160
+
161
+ # it "configure modern frontend tools" do
162
+ # flashes_path = %w(app assets stylesheets refills _flashes.scss)
163
+ # expect(read_project_file(flashes_path)).to match(/\$flashes/m)
164
+ #
165
+ # app_css = read_project_file(%w(app assets stylesheets application.scss))
166
+ # expect(app_css).to match(
167
+ # /normalize\.css\/normalize\.css.*bourbon.*neat.*base.*refills/m,
168
+ # )
169
+ # end
170
+
171
+ it "doesn't use turbolinks" do
172
+ js_file = read_project_file(%w(frontend init index.js))
173
+ expect(js_file).not_to match(/Turbolinks/)
174
+ end
175
+
176
+ it "use rails-ujs" do
177
+ js_file = read_project_file(%w(frontend init index.js))
178
+ expect(js_file).to match(/Rails/)
179
+ end
180
+
181
+ it "setup actioncable" do
182
+ js_file = read_project_file(%w(frontend client cable.js))
183
+ expect(js_file).to match(/actioncable/)
184
+ end
185
+
186
+ def development_config
187
+ @_development_config ||=
188
+ read_project_file %w(config environments development.rb)
189
+ end
190
+
191
+ def test_config
192
+ @_test_config ||= read_project_file %w(config environments test.rb)
193
+ end
194
+
195
+ def production_config
196
+ @_production_config ||=
197
+ read_project_file %w(config environments production.rb)
198
+ end
199
+
200
+ def read_project_file(path)
201
+ IO.read(File.join(project_path, *path))
202
+ end
203
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,12 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "simplecov"
4
+ if ENV["CIRCLE_ARTIFACTS"]
5
+ dir = File.join(ENV["CIRCLE_ARTIFACTS"], "coverage")
6
+ SimpleCov.coverage_dir(dir)
7
+ end
8
+ SimpleCov.start do
9
+ add_filter "/spec/"
10
+ end
11
+
1
12
  require "bundler/setup"
2
- require "tractor_beam"
13
+
14
+ Bundler.require(:default, :test)
15
+ Dir["./spec/support/**/*.rb"].each { |file| require file }
3
16
 
4
17
  RSpec.configure do |config|
5
- # Enable flags like --only-failures and --next-failure
6
- config.example_status_persistence_file_path = ".rspec_status"
18
+ config.include SuspendersTestHelpers
7
19
 
8
- # Disable RSpec exposing methods globally on `Module` and `main`
9
- config.disable_monkey_patching!
20
+ config.before(:all) do
21
+ create_tmp_directory
22
+ end
10
23
 
11
24
  config.expect_with :rspec do |c|
12
25
  c.syntax = :expect
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SuspendersTestHelpers
4
+ APP_NAME = "dummy_app"
5
+
6
+ def remove_project_directory
7
+ FileUtils.rm_rf(project_path)
8
+ end
9
+
10
+ def create_tmp_directory
11
+ FileUtils.mkdir_p(tmp_path)
12
+ end
13
+
14
+ def run_tractor_beam(arguments = nil)
15
+ Dir.chdir(tmp_path) do
16
+ Bundler.with_clean_env do
17
+ `#{tractor_beam_bin} #{APP_NAME} #{arguments}`
18
+ end
19
+ end
20
+ end
21
+
22
+ def tractor_beam_help_command
23
+ Dir.chdir(tmp_path) do
24
+ Bundler.with_clean_env do
25
+ `#{tractor_beam_bin} -h`
26
+ end
27
+ end
28
+ end
29
+
30
+ def setup_app_dependencies
31
+ return unless File.exist?(project_path)
32
+
33
+ Dir.chdir(project_path) do
34
+ Bundler.with_clean_env do
35
+ `bundle check || bundle install`
36
+ end
37
+ end
38
+ end
39
+
40
+ def drop_dummy_database
41
+ return unless File.exist?(project_path)
42
+
43
+ Dir.chdir(project_path) do
44
+ Bundler.with_clean_env do
45
+ `rails db:drop`
46
+ end
47
+ end
48
+ end
49
+
50
+ def project_path
51
+ @project_path ||= Pathname.new("#{tmp_path}/#{APP_NAME}")
52
+ end
53
+
54
+ def usage_file
55
+ @usage_path ||= File.join(root_path, "USAGE")
56
+ end
57
+
58
+ private
59
+
60
+ def tmp_path
61
+ @tmp_path ||= Pathname.new("#{root_path}/tmp")
62
+ end
63
+
64
+ def tractor_beam_bin
65
+ File.join(root_path, "bin", "tractor_beam")
66
+ end
67
+
68
+ def root_path
69
+ File.expand_path("../../../", __FILE__)
70
+ end
71
+ end
data/templates/bin_setup CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
- require 'pathname'
3
- require 'fileutils'
2
+ require "pathname"
3
+ require "fileutils"
4
4
  include FileUtils
5
5
 
6
6
  # path to your application root.
7
- APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
7
+ APP_ROOT = Pathname.new File.expand_path("../../", __FILE__)
8
8
 
9
9
  def system!(*args)
10
10
  system(*args) || abort("\n== Command #{args} failed ==")
@@ -14,17 +14,17 @@ chdir APP_ROOT do
14
14
  # This script is a starting point to setup your application.
15
15
  # Add necessary setup steps to this file.
16
16
 
17
- puts '== Installing dependencies =='
18
- system! 'gem install bundler --conservative'
19
- system('bundle check') || system!('bundle install')
17
+ puts "== Installing dependencies =="
18
+ system! "gem install bundler --conservative"
19
+ system("bundle check") || system!("bundle install")
20
20
 
21
21
  puts "\n== Preparing database =="
22
- system! 'bin/rails db:create'
23
- system! 'bin/rails db:migrate'
22
+ system! "bin/rails db:create"
23
+ system! "bin/rails db:migrate"
24
24
 
25
25
  puts "\n== Removing old logs and tempfiles =="
26
- system! 'bin/rails log:clear tmp:clear'
26
+ system! "bin/rails log:clear tmp:clear"
27
27
 
28
28
  puts "\n== Restarting application server =="
29
- system! 'bin/rails restart'
29
+ system! "bin/rails restart"
30
30
  end
@@ -0,0 +1,14 @@
1
+ // frontend/client/cable.js
2
+ import cable from "actioncable";
3
+
4
+ let consumer;
5
+
6
+ function createChannel(...args) {
7
+ if (!consumer) {
8
+ consumer = cable.createConsumer();
9
+ }
10
+
11
+ return consumer.subscriptions.create(...args);
12
+ }
13
+
14
+ export default createChannel;
@@ -0,0 +1,11 @@
1
+ // Insert any global javascript needed on initialization here
2
+ import Rails from "rails-ujs";
3
+ <% unless options[:skip_turbolinks] %>
4
+ import Turbolinks from "turbolinks";
5
+ <% end %>
6
+
7
+
8
+ Rails.start();
9
+ <% unless options[:skip_turbolinks] %>
10
+ Turbolinks.start();
11
+ <% end %>
data/tractor_beam.gemspec CHANGED
@@ -1,17 +1,19 @@
1
- $:.push File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push File.expand_path("../lib", __FILE__)
2
4
  require "tractor_beam/version"
3
- require 'date'
5
+ require "date"
4
6
 
5
7
  Gem::Specification.new do |spec|
6
8
  spec.required_ruby_version = ">= #{TractorBeam::RUBY_VERSION}"
7
- spec.required_rubygems_version = ">= 2.7.4"
9
+ spec.required_rubygems_version = ">= 2.7.3"
8
10
  spec.authors = ["Gabriel Gizotti"]
9
11
  spec.email = ["gabriel@gizotti.com"]
10
- spec.date = Date.today.strftime('%Y-%m-%d')
12
+ spec.date = Date.today.strftime("%Y-%m-%d")
11
13
  spec.name = "tractor_beam"
12
14
  spec.version = TractorBeam::VERSION
13
15
 
14
- spec.description = <<-HERE
16
+ spec.description = <<-HERE
15
17
  Tractor Beam is a base Rails project with all the modern javascript goodness
16
18
  described by https://evilmartians.com/chronicles/evil-front-part-1.
17
19
  Use it to get your rails app up and running with webpacker and a component
@@ -27,7 +29,10 @@ HERE
27
29
  spec.executables = ["tractor_beam"]
28
30
  spec.require_paths = ["lib"]
29
31
 
30
- spec.add_dependency 'rails', TractorBeam::RAILS_VERSION
32
+ spec.add_dependency "rails", TractorBeam::RAILS_VERSION
31
33
 
32
34
  spec.add_development_dependency "rspec", "~> 3.2"
35
+ spec.add_development_dependency "rubocop", "0.52.1"
36
+ spec.add_development_dependency "rubocop-rspec", "1.22.0"
37
+ spec.add_development_dependency "simplecov", "~> 0.12.0"
33
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tractor_beam
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Gizotti
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-12 00:00:00.000000000 Z
11
+ date: 2018-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -38,6 +38,48 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.52.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.52.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop-rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.22.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.22.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.12.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.12.0
41
83
  description: |
42
84
  Tractor Beam is a base Rails project with all the modern javascript goodness
43
85
  described by https://evilmartians.com/chronicles/evil-front-part-1.
@@ -52,12 +94,15 @@ extra_rdoc_files: []
52
94
  files:
53
95
  - ".gitignore"
54
96
  - ".rspec"
97
+ - ".rubocop.yml"
55
98
  - ".ruby-version"
56
99
  - ".travis.yml"
100
+ - CHANGELOG.md
57
101
  - Gemfile
58
102
  - LICENSE.txt
59
103
  - README.md
60
104
  - Rakefile
105
+ - USAGE
61
106
  - bin/console
62
107
  - bin/setup
63
108
  - bin/tractor_beam
@@ -65,18 +110,21 @@ files:
65
110
  - lib/tractor_beam/app_builder.rb
66
111
  - lib/tractor_beam/generators/app_generator.rb
67
112
  - lib/tractor_beam/version.rb
113
+ - spec/features/cli_help_spec.rb
114
+ - spec/features/new_project_spec.rb
68
115
  - spec/spec_helper.rb
69
- - spec/tractor_beam_spec.rb
116
+ - spec/support/tractor_beam.rb
70
117
  - templates/Gemfile.erb
71
118
  - templates/Procfile
72
119
  - templates/Procfile.dev
73
120
  - templates/Readme.md.erb
74
121
  - templates/bin_setup
75
122
  - templates/browserlistrc
123
+ - templates/cable_js
76
124
  - templates/component_generator
77
125
  - templates/eslintrc
78
126
  - templates/frontend/init/index.css
79
- - templates/frontend/init/index.js
127
+ - templates/frontend/init/index.js.erb
80
128
  - templates/frontend/packs/application.js
81
129
  - templates/stylelintrc
82
130
  - templates/tractor_beam_gitignore
@@ -99,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
147
  requirements:
100
148
  - - ">="
101
149
  - !ruby/object:Gem::Version
102
- version: 2.7.4
150
+ version: 2.7.3
103
151
  requirements: []
104
152
  rubyforge_project:
105
153
  rubygems_version: 2.7.4
@@ -107,5 +155,7 @@ signing_key:
107
155
  specification_version: 4
108
156
  summary: Generate a Rails app using modern javascript tooling.
109
157
  test_files:
158
+ - spec/features/cli_help_spec.rb
159
+ - spec/features/new_project_spec.rb
110
160
  - spec/spec_helper.rb
111
- - spec/tractor_beam_spec.rb
161
+ - spec/support/tractor_beam.rb
@@ -1,9 +0,0 @@
1
- RSpec.describe TractorBeam do
2
- it "has a version number" do
3
- expect(TractorBeam::VERSION).not_to be nil
4
- end
5
-
6
- it "does something useful" do
7
- expect(false).to eq(true)
8
- end
9
- end
@@ -1 +0,0 @@
1
- // Insert any global javascript needed on initialization here