rang 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +195 -0
  7. data/Rakefile +1 -0
  8. data/TODO.md +43 -0
  9. data/app/controllers/rang/application_controller.rb +4 -0
  10. data/app/controllers/rang/root_controller.rb +7 -0
  11. data/config/routes.rb +3 -0
  12. data/lib/rails/generators/rang/add_root/add_root_generator.rb +12 -0
  13. data/lib/rails/generators/rang/api/configure/configure_generator.rb +70 -0
  14. data/lib/rails/generators/rang/api/configure/templates/active_model_serializer.rb +5 -0
  15. data/lib/rails/generators/rang/assets/init/init_generator.rb +52 -0
  16. data/lib/rails/generators/rang/assets/init/templates/_base.scss +11 -0
  17. data/lib/rails/generators/rang/assets/init/templates/application.js +14 -0
  18. data/lib/rails/generators/rang/assets/init/templates/application.scss +3 -0
  19. data/lib/rails/generators/rang/assets/init/templates/components.js +2 -0
  20. data/lib/rails/generators/rang/bower/add/add_generator.rb +48 -0
  21. data/lib/rails/generators/rang/bower/bower_generator.rb +28 -0
  22. data/lib/rails/generators/rang/bower/init/init_generator.rb +35 -0
  23. data/lib/rails/generators/rang/example/example_generator.rb +17 -0
  24. data/lib/rails/generators/rang/example/templates/frontend/application.js.tt +21 -0
  25. data/lib/rails/generators/rang/example/templates/frontend/application.scss +6 -0
  26. data/lib/rails/generators/rang/example/templates/frontend/components/components.js +2 -0
  27. data/lib/rails/generators/rang/example/templates/frontend/components/simple_format/simple_format.directive.js +12 -0
  28. data/lib/rails/generators/rang/example/templates/frontend/components/simple_format/simple_format.module.js +4 -0
  29. data/lib/rails/generators/rang/example/templates/frontend/posts/index.ctrl.js.tt +6 -0
  30. data/lib/rails/generators/rang/example/templates/frontend/posts/index.ctrl.spec.js.tt +12 -0
  31. data/lib/rails/generators/rang/example/templates/frontend/posts/index.slim.tt +14 -0
  32. data/lib/rails/generators/rang/example/templates/frontend/posts/posts.module.js.tt +12 -0
  33. data/lib/rails/generators/rang/example/templates/frontend/posts/posts.scss +3 -0
  34. data/lib/rails/generators/rang/example/templates/frontend/posts/posts.service.js.tt +44 -0
  35. data/lib/rails/generators/rang/example/templates/frontend/style/_base.scss +11 -0
  36. data/lib/rails/generators/rang/example/templates/frontend/style/_layout.scss +3 -0
  37. data/lib/rails/generators/rang/install/install_generator.rb +66 -0
  38. data/lib/rails/generators/rang/install/templates/rang.rb +25 -0
  39. data/lib/rails/generators/rang/teaspoon/install/install_generator.rb +75 -0
  40. data/lib/rang.rb +18 -0
  41. data/lib/rang/config.rb +12 -0
  42. data/lib/rang/engine/railtie.rb +5 -0
  43. data/lib/rang/helpers.rb +35 -0
  44. data/lib/rang/patcher.rb +50 -0
  45. data/lib/rang/util.rb +11 -0
  46. data/lib/rang/version.rb +3 -0
  47. data/rang.gemspec +29 -0
  48. data/spec/controllers/root_controller_spec.rb +12 -0
  49. data/spec/generators/add_root_spec.rb +21 -0
  50. data/spec/generators/api_configure_spec.rb +44 -0
  51. data/spec/generators/assets_init_spec.rb +91 -0
  52. data/spec/generators/bower_add_spec.rb +61 -0
  53. data/spec/generators/bower_init_spec.rb +57 -0
  54. data/spec/generators/install_spec.rb +40 -0
  55. data/spec/generators/teaspoon_install_spec.rb +123 -0
  56. data/spec/helpers_spec.rb +64 -0
  57. data/spec/patcher_spec.rb +103 -0
  58. data/spec/rails_app/.gitignore +16 -0
  59. data/spec/rails_app/Gemfile +41 -0
  60. data/spec/rails_app/README.rdoc +28 -0
  61. data/spec/rails_app/Rakefile +6 -0
  62. data/spec/rails_app/app/assets/images/.keep +0 -0
  63. data/spec/rails_app/app/assets/javascripts/application.js +16 -0
  64. data/spec/rails_app/app/assets/stylesheets/application.css +15 -0
  65. data/spec/rails_app/app/controllers/application_controller.rb +5 -0
  66. data/spec/rails_app/app/controllers/concerns/.keep +0 -0
  67. data/spec/rails_app/app/helpers/application_helper.rb +2 -0
  68. data/spec/rails_app/app/mailers/.keep +0 -0
  69. data/spec/rails_app/app/models/.keep +0 -0
  70. data/spec/rails_app/app/models/concerns/.keep +0 -0
  71. data/spec/rails_app/app/views/layouts/application.html.erb +14 -0
  72. data/spec/rails_app/bin/bundle +3 -0
  73. data/spec/rails_app/bin/rails +8 -0
  74. data/spec/rails_app/bin/rake +8 -0
  75. data/spec/rails_app/bin/spring +18 -0
  76. data/spec/rails_app/config.ru +4 -0
  77. data/spec/rails_app/config/application.rb +23 -0
  78. data/spec/rails_app/config/boot.rb +4 -0
  79. data/spec/rails_app/config/database.yml +25 -0
  80. data/spec/rails_app/config/environment.rb +5 -0
  81. data/spec/rails_app/config/environments/development.rb +37 -0
  82. data/spec/rails_app/config/environments/production.rb +82 -0
  83. data/spec/rails_app/config/environments/test.rb +39 -0
  84. data/spec/rails_app/config/initializers/assets.rb +8 -0
  85. data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  86. data/spec/rails_app/config/initializers/cookies_serializer.rb +3 -0
  87. data/spec/rails_app/config/initializers/filter_parameter_logging.rb +4 -0
  88. data/spec/rails_app/config/initializers/inflections.rb +16 -0
  89. data/spec/rails_app/config/initializers/mime_types.rb +4 -0
  90. data/spec/rails_app/config/initializers/session_store.rb +3 -0
  91. data/spec/rails_app/config/initializers/wrap_parameters.rb +14 -0
  92. data/spec/rails_app/config/locales/en.yml +23 -0
  93. data/spec/rails_app/config/routes.rb +56 -0
  94. data/spec/rails_app/config/secrets.yml +22 -0
  95. data/spec/rails_app/db/seeds.rb +7 -0
  96. data/spec/rails_app/lib/assets/.keep +0 -0
  97. data/spec/rails_app/lib/tasks/.keep +0 -0
  98. data/spec/rails_app/log/.keep +0 -0
  99. data/spec/rails_app/public/404.html +67 -0
  100. data/spec/rails_app/public/422.html +67 -0
  101. data/spec/rails_app/public/500.html +66 -0
  102. data/spec/rails_app/public/favicon.ico +0 -0
  103. data/spec/rails_app/public/robots.txt +5 -0
  104. data/spec/rails_app/test/controllers/.keep +0 -0
  105. data/spec/rails_app/test/fixtures/.keep +0 -0
  106. data/spec/rails_app/test/helpers/.keep +0 -0
  107. data/spec/rails_app/test/integration/.keep +0 -0
  108. data/spec/rails_app/test/mailers/.keep +0 -0
  109. data/spec/rails_app/test/models/.keep +0 -0
  110. data/spec/rails_app/test/test_helper.rb +10 -0
  111. data/spec/rails_app/vendor/assets/javascripts/.keep +0 -0
  112. data/spec/rails_app/vendor/assets/stylesheets/.keep +0 -0
  113. data/spec/spec_helper.rb +79 -0
  114. data/spec/util_spec.rb +27 -0
  115. data/spec/version_spec.rb +9 -0
  116. data/vendor/assets/javascripts/angular-templates.js.erb +14 -0
  117. metadata +327 -0
@@ -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
@@ -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
@@ -0,0 +1,5 @@
1
+ module Rang
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Rang
4
+ end
5
+ end
@@ -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
@@ -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
@@ -0,0 +1,11 @@
1
+ module Rang
2
+ module Util
3
+ def self.gem_present?(name)
4
+ Gem::Specification::find_all_by_name(name).any?
5
+ end
6
+
7
+ def self.application_name
8
+ Rails.application.class.parent_name
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Rang
2
+ VERSION = "0.1.1"
3
+ end
@@ -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