Module: EngineCart

Defined in:
lib/generators/engine_cart/install_generator.rb,
lib/engine_cart.rb,
lib/engine_cart/engine.rb,
lib/engine_cart/version.rb,
lib/engine_cart/rake_task.rb,
lib/engine_cart/configuration.rb,
lib/engine_cart/gemfile_stanza.rb

Overview

EngineCartGenerator sets up an engine to use engine_cart-generated test apps

Defined Under Namespace

Modules: RakeTask Classes: Configuration, Engine, InstallGenerator

Constant Summary collapse

VERSION =
'2.2.1'

Class Method Summary collapse

Class Method Details

.check_for_gemfile_stanzaObject



87
88
89
90
91
92
93
94
# File 'lib/engine_cart.rb', line 87

def self.check_for_gemfile_stanza
  return unless File.exist? 'Gemfile'

  unless File.readlines('Gemfile').grep(/#{EngineCart.gemfile_stanza_check_line}/).any?
    Bundler.ui.warn "[EngineCart] For better results, consider updating the EngineCart stanza in your Gemfile with:\n\n"
    Bundler.ui.warn EngineCart.gemfile_stanza_text
  end
end

.configuration(options = {}) ⇒ Object



75
76
77
# File 'lib/engine_cart.rb', line 75

def self.configuration(options = {})
  @configuration ||= EngineCart::Configuration.new(options)
end

.env_fingerprintObject



71
72
73
# File 'lib/engine_cart.rb', line 71

def self.env_fingerprint
  { 'RUBY_DESCRIPTION' => RUBY_DESCRIPTION, 'BUNDLE_GEMFILE' => Bundler.default_gemfile.to_s }.reject { |k, v| v.nil? || v.empty? }.to_s
end

.extra_fingerprinted_filesObject



67
68
69
# File 'lib/engine_cart.rb', line 67

def self.extra_fingerprinted_files
  @extra_fingerprinted_files || []
end

.extra_fingerprinted_files=(extra_fingerprinted_files) ⇒ Object



63
64
65
# File 'lib/engine_cart.rb', line 63

def self.extra_fingerprinted_files=(extra_fingerprinted_files)
  @extra_fingerprinted_files = extra_fingerprinted_files
end

.fingerprintObject



46
47
48
49
50
51
52
# File 'lib/engine_cart.rb', line 46

def self.fingerprint
  { env: env_fingerprint }.merge(files:
    fingerprinted_files.map do |file|
      { file: file, fingerprint: Digest::MD5.file(file).to_s }
    end
  )
end

.fingerprint_current?Boolean

Returns:

  • (Boolean)


27
28
29
30
31
32
33
34
# File 'lib/engine_cart.rb', line 27

def self.fingerprint_current?
  return false unless File.exist? stored_fingerprint_file
  content = File.read(stored_fingerprint_file)
  data = JSON.parse(content, symbolize_names: true)
  data == fingerprint
rescue
  false
end

.fingerprint_expired?Boolean

Returns:

  • (Boolean)


23
24
25
# File 'lib/engine_cart.rb', line 23

def self.fingerprint_expired?
  !fingerprint_current?
end

.fingerprinted_filesObject



54
55
56
57
58
59
60
61
# File 'lib/engine_cart.rb', line 54

def self.fingerprinted_files
  Dir.glob("./*.gemspec").select { |f| File.file? f } +
    [Bundler.default_gemfile.to_s, Bundler.default_lockfile.to_s] +
    Dir.glob("./db/migrate/*").select { |f| File.file? f } +
    Dir.glob("./lib/generators/**/**").select { |f| File.file? f } +
    Dir.glob("./spec/test_app_templates/**/**").select { |f| File.file? f } +
    configuration.extra_fingerprinted_files
end

.gemfile_stanza_check_lineObject



2
3
4
# File 'lib/engine_cart/gemfile_stanza.rb', line 2

def self.gemfile_stanza_check_line
  "engine_cart stanza: 0.10.0"
end

.gemfile_stanza_textObject



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/engine_cart/gemfile_stanza.rb', line 6

def self.gemfile_stanza_text
  <<-EOF.gsub(/^    /, '')
  # BEGIN ENGINE_CART BLOCK
  # engine_cart: #{EngineCart::VERSION}
  # #{EngineCart.gemfile_stanza_check_line}
  # the below comes from engine_cart, a gem used to test this Rails engine gem in the context of a Rails app.
  file = File.expand_path('Gemfile', ENV['ENGINE_CART_DESTINATION'] || ENV['RAILS_ROOT'] || File.expand_path('#{EngineCart.destination}', File.dirname(__FILE__)))
  if File.exist?(file)
    begin
      eval_gemfile file
    rescue Bundler::GemfileError => e
      Bundler.ui.warn '[EngineCart] Skipping Rails application dependencies:'
      Bundler.ui.warn e.message
    end
  else
    Bundler.ui.warn "[EngineCart] Unable to find test application dependencies in \#{file}, using placeholder dependencies"

    if ENV['RAILS_VERSION']
      if ENV['RAILS_VERSION'] == 'edge'
        gem 'rails', github: 'rails/rails'
        ENV['ENGINE_CART_RAILS_OPTIONS'] = '--edge --skip-turbolinks'
      else
        gem 'rails', ENV['RAILS_VERSION']
      end
    end

    case ENV['RAILS_VERSION']
    when /^4\.2/
      gem 'responders', '~> 2.0'
      gem 'sass-rails', '>= 5.0'
      gem 'coffee-rails', '~> 4.1.0'
    when /^4\.[01]/
      gem 'sass-rails', '< 5.0'
    end
  end
  # END ENGINE_CART BLOCK
  EOF
end

.load_application!(path = nil) ⇒ Object



11
12
13
# File 'lib/engine_cart.rb', line 11

def self.load_application! path = nil
  require File.expand_path("config/environment", path || EngineCart.destination)
end

.stored_fingerprint_fileObject



42
43
44
# File 'lib/engine_cart.rb', line 42

def self.stored_fingerprint_file
  File.expand_path('.generated_engine_cart', EngineCart.destination)
end

.within_test_appObject



15
16
17
18
19
20
21
# File 'lib/engine_cart.rb', line 15

def self.within_test_app
  Dir.chdir(EngineCart.destination) do
    Bundler.with_clean_env do
      yield
    end
  end
end

.write_fingerprintObject



36
37
38
39
40
# File 'lib/engine_cart.rb', line 36

def self.write_fingerprint
  File.open(stored_fingerprint_file, 'w') do |f|
    f.write(EngineCart.fingerprint.to_json)
  end
end