rang 0.1.1

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.
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