rang 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.rspec +3 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +195 -0
- data/Rakefile +1 -0
- data/TODO.md +43 -0
- data/app/controllers/rang/application_controller.rb +4 -0
- data/app/controllers/rang/root_controller.rb +7 -0
- data/config/routes.rb +3 -0
- data/lib/rails/generators/rang/add_root/add_root_generator.rb +12 -0
- data/lib/rails/generators/rang/api/configure/configure_generator.rb +70 -0
- data/lib/rails/generators/rang/api/configure/templates/active_model_serializer.rb +5 -0
- data/lib/rails/generators/rang/assets/init/init_generator.rb +52 -0
- data/lib/rails/generators/rang/assets/init/templates/_base.scss +11 -0
- data/lib/rails/generators/rang/assets/init/templates/application.js +14 -0
- data/lib/rails/generators/rang/assets/init/templates/application.scss +3 -0
- data/lib/rails/generators/rang/assets/init/templates/components.js +2 -0
- data/lib/rails/generators/rang/bower/add/add_generator.rb +48 -0
- data/lib/rails/generators/rang/bower/bower_generator.rb +28 -0
- data/lib/rails/generators/rang/bower/init/init_generator.rb +35 -0
- data/lib/rails/generators/rang/example/example_generator.rb +17 -0
- data/lib/rails/generators/rang/example/templates/frontend/application.js.tt +21 -0
- data/lib/rails/generators/rang/example/templates/frontend/application.scss +6 -0
- data/lib/rails/generators/rang/example/templates/frontend/components/components.js +2 -0
- data/lib/rails/generators/rang/example/templates/frontend/components/simple_format/simple_format.directive.js +12 -0
- data/lib/rails/generators/rang/example/templates/frontend/components/simple_format/simple_format.module.js +4 -0
- data/lib/rails/generators/rang/example/templates/frontend/posts/index.ctrl.js.tt +6 -0
- data/lib/rails/generators/rang/example/templates/frontend/posts/index.ctrl.spec.js.tt +12 -0
- data/lib/rails/generators/rang/example/templates/frontend/posts/index.slim.tt +14 -0
- data/lib/rails/generators/rang/example/templates/frontend/posts/posts.module.js.tt +12 -0
- data/lib/rails/generators/rang/example/templates/frontend/posts/posts.scss +3 -0
- data/lib/rails/generators/rang/example/templates/frontend/posts/posts.service.js.tt +44 -0
- data/lib/rails/generators/rang/example/templates/frontend/style/_base.scss +11 -0
- data/lib/rails/generators/rang/example/templates/frontend/style/_layout.scss +3 -0
- data/lib/rails/generators/rang/install/install_generator.rb +66 -0
- data/lib/rails/generators/rang/install/templates/rang.rb +25 -0
- data/lib/rails/generators/rang/teaspoon/install/install_generator.rb +75 -0
- data/lib/rang.rb +18 -0
- data/lib/rang/config.rb +12 -0
- data/lib/rang/engine/railtie.rb +5 -0
- data/lib/rang/helpers.rb +35 -0
- data/lib/rang/patcher.rb +50 -0
- data/lib/rang/util.rb +11 -0
- data/lib/rang/version.rb +3 -0
- data/rang.gemspec +29 -0
- data/spec/controllers/root_controller_spec.rb +12 -0
- data/spec/generators/add_root_spec.rb +21 -0
- data/spec/generators/api_configure_spec.rb +44 -0
- data/spec/generators/assets_init_spec.rb +91 -0
- data/spec/generators/bower_add_spec.rb +61 -0
- data/spec/generators/bower_init_spec.rb +57 -0
- data/spec/generators/install_spec.rb +40 -0
- data/spec/generators/teaspoon_install_spec.rb +123 -0
- data/spec/helpers_spec.rb +64 -0
- data/spec/patcher_spec.rb +103 -0
- data/spec/rails_app/.gitignore +16 -0
- data/spec/rails_app/Gemfile +41 -0
- data/spec/rails_app/README.rdoc +28 -0
- data/spec/rails_app/Rakefile +6 -0
- data/spec/rails_app/app/assets/images/.keep +0 -0
- data/spec/rails_app/app/assets/javascripts/application.js +16 -0
- data/spec/rails_app/app/assets/stylesheets/application.css +15 -0
- data/spec/rails_app/app/controllers/application_controller.rb +5 -0
- data/spec/rails_app/app/controllers/concerns/.keep +0 -0
- data/spec/rails_app/app/helpers/application_helper.rb +2 -0
- data/spec/rails_app/app/mailers/.keep +0 -0
- data/spec/rails_app/app/models/.keep +0 -0
- data/spec/rails_app/app/models/concerns/.keep +0 -0
- data/spec/rails_app/app/views/layouts/application.html.erb +14 -0
- data/spec/rails_app/bin/bundle +3 -0
- data/spec/rails_app/bin/rails +8 -0
- data/spec/rails_app/bin/rake +8 -0
- data/spec/rails_app/bin/spring +18 -0
- data/spec/rails_app/config.ru +4 -0
- data/spec/rails_app/config/application.rb +23 -0
- data/spec/rails_app/config/boot.rb +4 -0
- data/spec/rails_app/config/database.yml +25 -0
- data/spec/rails_app/config/environment.rb +5 -0
- data/spec/rails_app/config/environments/development.rb +37 -0
- data/spec/rails_app/config/environments/production.rb +82 -0
- data/spec/rails_app/config/environments/test.rb +39 -0
- data/spec/rails_app/config/initializers/assets.rb +8 -0
- data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails_app/config/initializers/cookies_serializer.rb +3 -0
- data/spec/rails_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/rails_app/config/initializers/inflections.rb +16 -0
- data/spec/rails_app/config/initializers/mime_types.rb +4 -0
- data/spec/rails_app/config/initializers/session_store.rb +3 -0
- data/spec/rails_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/rails_app/config/locales/en.yml +23 -0
- data/spec/rails_app/config/routes.rb +56 -0
- data/spec/rails_app/config/secrets.yml +22 -0
- data/spec/rails_app/db/seeds.rb +7 -0
- data/spec/rails_app/lib/assets/.keep +0 -0
- data/spec/rails_app/lib/tasks/.keep +0 -0
- data/spec/rails_app/log/.keep +0 -0
- data/spec/rails_app/public/404.html +67 -0
- data/spec/rails_app/public/422.html +67 -0
- data/spec/rails_app/public/500.html +66 -0
- data/spec/rails_app/public/favicon.ico +0 -0
- data/spec/rails_app/public/robots.txt +5 -0
- data/spec/rails_app/test/controllers/.keep +0 -0
- data/spec/rails_app/test/fixtures/.keep +0 -0
- data/spec/rails_app/test/helpers/.keep +0 -0
- data/spec/rails_app/test/integration/.keep +0 -0
- data/spec/rails_app/test/mailers/.keep +0 -0
- data/spec/rails_app/test/models/.keep +0 -0
- data/spec/rails_app/test/test_helper.rb +10 -0
- data/spec/rails_app/vendor/assets/javascripts/.keep +0 -0
- data/spec/rails_app/vendor/assets/stylesheets/.keep +0 -0
- data/spec/spec_helper.rb +79 -0
- data/spec/util_spec.rb +27 -0
- data/spec/version_spec.rb +9 -0
- data/vendor/assets/javascripts/angular-templates.js.erb +14 -0
- metadata +327 -0
data/lib/rang.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "rang/version"
|
2
|
+
require "rang/util"
|
3
|
+
require "rang/helpers"
|
4
|
+
require "rang/config"
|
5
|
+
require "rang/patcher"
|
6
|
+
|
7
|
+
if defined? Rails
|
8
|
+
require "rang/engine/railtie"
|
9
|
+
require "ngannotate/rails"
|
10
|
+
require "angular_rails_csrf"
|
11
|
+
end
|
12
|
+
|
13
|
+
module Rang
|
14
|
+
def self.configure
|
15
|
+
yield Config
|
16
|
+
Patcher.patch!
|
17
|
+
end
|
18
|
+
end
|
data/lib/rang/config.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module Rang
|
2
|
+
module Config
|
3
|
+
class << self
|
4
|
+
|
5
|
+
attr_accessor :patch_sprockets_to_use_html_extension
|
6
|
+
attr_accessor :disable_html_precompilation
|
7
|
+
attr_accessor :frontend_assets_directory
|
8
|
+
attr_accessor :remove_angular_delims_from_slim
|
9
|
+
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/rang/helpers.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Rang
|
2
|
+
module Helpers
|
3
|
+
class << self
|
4
|
+
include ActionView::Helpers::JavaScriptHelper
|
5
|
+
|
6
|
+
# Using `context` here is very un-ruby, but it is the cleanest way of accessing
|
7
|
+
# the peculiar scope that assets are compiled in.
|
8
|
+
def templates(context)
|
9
|
+
template_paths(context).each do |path|
|
10
|
+
transformed_path = path.sub(/\..*$/, ".html")
|
11
|
+
context.depend_on_asset(transformed_path)
|
12
|
+
asset = context.environment.find_asset(transformed_path.sub(/\..*$/, ".html"))
|
13
|
+
yield transformed_path.sub(/\..*$/, ".html"), escape_javascript(asset.to_s)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def template_paths(context)
|
20
|
+
# @todo: this #include? should be made more robust
|
21
|
+
logical_paths(context).select {|path| path.include? '.htm' }
|
22
|
+
end
|
23
|
+
|
24
|
+
def logical_paths(context)
|
25
|
+
if defined? context.assets.logical_paths
|
26
|
+
context.assets.logical_paths
|
27
|
+
else
|
28
|
+
paths = []
|
29
|
+
context.assets.each_logical_path {|path| paths << path }
|
30
|
+
paths
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/rang/patcher.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
module Rang
|
2
|
+
module Patcher
|
3
|
+
def self.patch!
|
4
|
+
patch_sprockets_to_use_html_extension! if Config.patch_sprockets_to_use_html_extension
|
5
|
+
disable_html_precompilation! if Config.disable_html_precompilation
|
6
|
+
add_frontend_assets_directory!(Config.frontend_assets_directory) if Config.frontend_assets_directory
|
7
|
+
register_slim_as_assets_engine! if Util.gem_present? 'slim'
|
8
|
+
remove_angular_delims_from_slim! if Util.gem_present?('slim') && Config.remove_angular_delims_from_slim
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def self.patch_sprockets_to_use_html_extension!
|
14
|
+
Rails.application.assets.send(:trail).alias_extension('.slim', '.html')
|
15
|
+
|
16
|
+
Kernel::silence_warnings do
|
17
|
+
Rails.application.assets.instance_eval do
|
18
|
+
if {}.respond_to?(:key)
|
19
|
+
def extension_for_mime_type(type)
|
20
|
+
@mime_types.key(type) || mime_types.key(type)
|
21
|
+
end
|
22
|
+
else
|
23
|
+
def extension_for_mime_type(type)
|
24
|
+
@mime_types.index(type) || mime_types.index(type)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Rails.application.assets.register_mime_type 'text/html', '.html'
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.disable_html_precompilation!
|
34
|
+
# Ammend precompile selector to exclude html files
|
35
|
+
Rails.application.config.assets.precompile = [ Proc.new { |path, fn| fn =~ /app\/assets/ && !%w(.js .css .htm .html).include?(File.extname(path)) }, /application.(css|js)$/ ]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.add_frontend_assets_directory!(directory)
|
39
|
+
Rails.application.config.assets.paths << "#{Rails.root}/app/assets/#{directory}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.register_slim_as_assets_engine!
|
43
|
+
Rails.application.assets.register_engine '.slim', ::Slim::Template
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.remove_angular_delims_from_slim!
|
47
|
+
Slim::Engine.set_default_options({attr_delims: {'(' => ')', '[' => ']'}})
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/rang/util.rb
ADDED
data/lib/rang/version.rb
ADDED
data/rang.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rang/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rang"
|
8
|
+
spec.version = Rang::VERSION
|
9
|
+
spec.authors = ["Caden Lovelace"]
|
10
|
+
spec.email = ["caden@herostrat.us"]
|
11
|
+
spec.summary = %q{Helpful adjustments to make Rails and Angular play nice together.}
|
12
|
+
spec.description = %q{Provides a suite of generators and adjustments that make Rails
|
13
|
+
a seamless AngularJS development environment to rival Grunt and Gulp.}
|
14
|
+
spec.homepage = "http://github.com/cultivatehq/rang"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0")
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
25
|
+
spec.add_development_dependency "slim", "~> 2.0"
|
26
|
+
spec.add_dependency "rails", "~> 4.0"
|
27
|
+
spec.add_dependency "ngannotate-rails", "~> 0.9"
|
28
|
+
spec.add_dependency "angular_rails_csrf", "~> 1.0"
|
29
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rang::RootController do
|
4
|
+
let(:controller) { Rang::RootController.new }
|
5
|
+
|
6
|
+
describe '#display' do
|
7
|
+
it 'returns an ng-view element' do
|
8
|
+
expect(controller).to receive(:render).with({text: '<div ng-view></div>', layout: 'application'})
|
9
|
+
controller.display
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rails/generators'
|
3
|
+
require_relative '../../lib/rails/generators/rang/add_root/add_root_generator.rb'
|
4
|
+
|
5
|
+
describe Rang::Generators::AddRootGenerator do
|
6
|
+
let(:klass) { Rang::Generators::AddRootGenerator }
|
7
|
+
let(:generator) { klass.new }
|
8
|
+
|
9
|
+
it "has a description" do
|
10
|
+
expect(klass.desc.empty?).to be_falsey
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#add_root" do
|
14
|
+
it 'adds a root route' do
|
15
|
+
expect(generator).to receive(:route).with("mount Rang::Engine => \"/\"\n")
|
16
|
+
generator.add_route
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rails/generators'
|
3
|
+
require_relative '../../lib/rails/generators/rang/api/configure/configure_generator.rb'
|
4
|
+
|
5
|
+
describe Rang::Api::Generators::ConfigureGenerator do
|
6
|
+
let(:klass) { Rang::Api::Generators::ConfigureGenerator }
|
7
|
+
let(:generator) { klass.new }
|
8
|
+
|
9
|
+
it "has a description" do
|
10
|
+
expect(klass.desc.empty?).to be_falsey
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#add_to_application_js" do
|
14
|
+
before do
|
15
|
+
allow(Rails.application.assets).to receive_message_chain(:find_asset, :pathname).and_return 'app.js'
|
16
|
+
allow(generator).to receive(:inject_into_file)
|
17
|
+
allow(generator).to receive(:no?).and_return false
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should insert require into application.js" do
|
21
|
+
expect(generator).to receive(:inject_into_file) do |path, matcher, &block|
|
22
|
+
expect(path).to eq 'app.js'
|
23
|
+
expect(block.call).to eq "\n//= require angular-restmod/angular-restmod-bundle"
|
24
|
+
end
|
25
|
+
generator.add_to_application_js
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should insert require after angular" do
|
29
|
+
expect(generator).to receive(:inject_into_file) do |path, matcher, &block|
|
30
|
+
expect("\n//= require angular" =~ matcher[:after]).to be_truthy
|
31
|
+
end
|
32
|
+
generator.add_to_application_js
|
33
|
+
end
|
34
|
+
|
35
|
+
it "shouldn't insert require after similar requires" do
|
36
|
+
expect(generator).to receive(:inject_into_file) do |path, matcher, &block|
|
37
|
+
expect("\n//= require angular-route" =~ matcher[:after]).to be_falsey
|
38
|
+
end
|
39
|
+
generator.add_to_application_js
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rails/generators'
|
3
|
+
require_relative '../../lib/rails/generators/rang/assets/init/init_generator.rb'
|
4
|
+
|
5
|
+
describe Rang::Assets::Generators::InitGenerator do
|
6
|
+
let(:klass) { Rang::Assets::Generators::InitGenerator }
|
7
|
+
let(:generator) { klass.new }
|
8
|
+
|
9
|
+
before { allow(generator).to receive(:say_status) }
|
10
|
+
|
11
|
+
it "has a description" do
|
12
|
+
expect(klass.desc.empty?).to be_falsey
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#deprecate_old_assets!" do
|
16
|
+
before do
|
17
|
+
allow(File).to receive(:exist?).and_return(true)
|
18
|
+
allow(generator).to receive(:empty_directory)
|
19
|
+
allow(generator).to receive(:run)
|
20
|
+
allow(generator).to receive(:remove_dir)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'copies assets to holding dirs' do
|
24
|
+
expect(generator).to receive(:run).with("mv app/assets/javascripts app/assets.removed/javascripts", anything)
|
25
|
+
expect(generator).to receive(:run).with("mv app/assets/stylesheets app/assets.removed/stylesheets", anything)
|
26
|
+
generator.deprecate_old_assets!
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'removes asset dirs' do
|
30
|
+
expect(generator).to receive(:remove_dir).with("app/assets/javascripts")
|
31
|
+
expect(generator).to receive(:remove_dir).with("app/assets/stylesheets")
|
32
|
+
generator.deprecate_old_assets!
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#add_html_attributes" do
|
37
|
+
before do
|
38
|
+
allow(Rang::Util).to receive(:application_name).and_return 'dogs'
|
39
|
+
allow(generator).to receive(:gsub_file)
|
40
|
+
allow(generator).to receive(:no?).and_return false
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when layout is an ERB file" do
|
44
|
+
before do
|
45
|
+
allow(generator).to receive(:layout_file).and_return "fake.html.erb"
|
46
|
+
allow(generator).to receive(:layout_handler).and_return "ActionView::Template::Handlers::ERB"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "inserts ng-app" do
|
50
|
+
expect(generator).to receive(:gsub_file).with("fake.html.erb", "<html>", "<html ng-app='dogs'>")
|
51
|
+
generator.add_html_attribute
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "when layout is a Slim file" do
|
56
|
+
before do
|
57
|
+
allow(generator).to receive(:layout_file).and_return "fake.slim"
|
58
|
+
allow(generator).to receive(:layout_handler).and_return "Slim::RailsTemplate"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "inserts ng-app" do
|
62
|
+
expect(generator).to receive(:gsub_file).with("fake.slim", /^html$/, "html ng-app='dogs'")
|
63
|
+
generator.add_html_attribute
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "hasn't been broken by ActionController changes" do
|
68
|
+
expect(ApplicationController.new.send(:_layout).identifier).to be_a String
|
69
|
+
expect(ApplicationController.new.send(:_layout).handler).to respond_to :call
|
70
|
+
expect(generator.send(:layout_file)).to eq ApplicationController.new.send(:_layout).identifier
|
71
|
+
expect(generator.send(:layout_handler)).to eq ApplicationController.new.send(:_layout).handler.class.to_s
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#create_assets!" do
|
76
|
+
before do
|
77
|
+
allow(generator).to receive(:template)
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'creates all assets' do
|
81
|
+
expect(generator).to receive(:template).with('application.js', 'app/assets/frontend/application.js')
|
82
|
+
expect(generator).to receive(:template).with('application.scss', 'app/assets/frontend/application.scss')
|
83
|
+
expect(generator).to receive(:template).with('_base.scss', 'app/assets/frontend/style/_base.scss')
|
84
|
+
expect(generator).to receive(:template).with('components.js', 'app/assets/frontend/components/components.js')
|
85
|
+
generator.create_assets!
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rails/generators'
|
3
|
+
require_relative '../../lib/rails/generators/rang/bower/add/add_generator.rb'
|
4
|
+
|
5
|
+
describe Rang::Bower::Generators::AddGenerator do
|
6
|
+
|
7
|
+
let(:klass) { Rang::Bower::Generators::AddGenerator }
|
8
|
+
let(:generator) { klass.new(['angular', '~> 2.0']) }
|
9
|
+
|
10
|
+
it "has a description" do
|
11
|
+
expect(klass.desc.empty?).to be_falsey
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#run_init' do
|
15
|
+
context 'when a Gemfile.bower is absent' do
|
16
|
+
it 'runs the init task' do
|
17
|
+
expect(generator).to receive(:generate).with("rang:bower:init")
|
18
|
+
generator.run_init
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when a Gemfile.bower exists' do
|
23
|
+
before do
|
24
|
+
allow(File).to receive(:exist?).and_return(true)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'doesn’t run the init task' do
|
28
|
+
expect(generator).to_not receive(:generate)
|
29
|
+
generator.run_init
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#add_gem_to_bower_gemfile' do
|
35
|
+
# Silence messages
|
36
|
+
before { allow(generator).to receive(:append_file) }
|
37
|
+
|
38
|
+
it 'adds the gem to Gemfile.bower' do
|
39
|
+
expect(generator).to receive(:append_file).with("Gemfile.bower",
|
40
|
+
"gem 'rails-assets-angular', '~> 2.0'\n")
|
41
|
+
generator.add_gem_to_bower_gemfile
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'if dependency_name doesn’t end with a @' do
|
45
|
+
it 'doesn’t run bundler' do
|
46
|
+
expect(generator).to_not receive(:run).with('bundle install')
|
47
|
+
generator.add_gem_to_bower_gemfile
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'if dependency_name ends with a @' do
|
52
|
+
let(:generator) { klass.new(['angular@', '~> 2.0']) }
|
53
|
+
|
54
|
+
it 'runs bundler' do
|
55
|
+
expect(generator).to receive(:run).with('bundle install')
|
56
|
+
generator.add_gem_to_bower_gemfile
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rails/generators'
|
3
|
+
require_relative '../../lib/rails/generators/rang/bower/init/init_generator.rb'
|
4
|
+
|
5
|
+
describe Rang::Bower::Generators::InitGenerator do
|
6
|
+
|
7
|
+
let(:klass) { Rang::Bower::Generators::InitGenerator }
|
8
|
+
let(:generator) { klass.new }
|
9
|
+
|
10
|
+
it "has a description" do
|
11
|
+
expect(klass.desc.empty?).to be_falsey
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#create_bower_gemfile" do
|
15
|
+
it 'creates Gemfile.bower' do
|
16
|
+
expect(generator).to receive(:create_file).with("Gemfile.bower", "source 'https://rails-assets.org'\n")
|
17
|
+
generator.create_bower_gemfile
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#include_bower_gemfile_into_gemfile" do
|
22
|
+
it 'includes Gemfile.bower into Gemfile' do
|
23
|
+
expect(generator).to receive(:inject_into_file) do |filename, regex, &block|
|
24
|
+
expect(filename).to eq "Gemfile"
|
25
|
+
expect(block.call).to include "\neval(IO.read('Gemfile.bower'), binding) if File.exist? 'Gemfile.bower'"
|
26
|
+
end
|
27
|
+
generator.include_bower_gemfile_into_gemfile
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'includes Gemfile.bower into Gemfile at the right point' do
|
31
|
+
expect(generator).to receive(:inject_into_file) do |filename, regex, &block|
|
32
|
+
regex = regex[:after]
|
33
|
+
expect("source 'https://rubygems.org'\n" =~ regex).to be_truthy
|
34
|
+
end
|
35
|
+
generator.include_bower_gemfile_into_gemfile
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#add_angular_gems" do
|
40
|
+
before do
|
41
|
+
allow(generator).to receive(:generate)
|
42
|
+
allow(generator).to receive(:run)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'adds essential angular gems' do
|
46
|
+
expect(generator).to receive(:generate).with("rang:bower:add", "angular '~> 1.2.0' quiet")
|
47
|
+
expect(generator).to receive(:generate).with("rang:bower:add", "angular-route '~> 1.2.0' quiet")
|
48
|
+
generator.add_angular_gems
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'runs bundler' do
|
52
|
+
expect(generator).to receive(:run).with("bundle install")
|
53
|
+
generator.add_angular_gems
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|