bread 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -4
  3. data/Rakefile +15 -19
  4. data/lib/bread/controller.rb +26 -0
  5. data/lib/bread/manager/actions.rb +1 -21
  6. data/lib/bread/manager/crumbs.rb +1 -16
  7. data/lib/bread/reloader.rb +30 -0
  8. data/lib/bread/version.rb +1 -1
  9. data/lib/bread.rb +12 -1
  10. data/lib/generators/bread/install_generator.rb +17 -2
  11. data/{test/dummy/app/lib → lib/generators/bread/templates}/bread/actions.rb +18 -18
  12. data/lib/generators/bread/templates/bread/crumbs.rb +20 -0
  13. data/lib/generators/bread/templates/view.html.erb +9 -0
  14. data/spec/controllers/photos_controller_spec.rb +94 -0
  15. data/spec/controllers/products_controller_spec.rb +94 -0
  16. data/{test → spec}/dummy/README.rdoc +0 -0
  17. data/{test → spec}/dummy/Rakefile +0 -0
  18. data/{test → spec}/dummy/app/assets/javascripts/application.js +0 -0
  19. data/{test → spec}/dummy/app/assets/stylesheets/application.css +0 -0
  20. data/{test → spec}/dummy/app/controllers/application_controller.rb +0 -0
  21. data/spec/dummy/app/controllers/photos_controller.rb +96 -0
  22. data/spec/dummy/app/controllers/products_controller.rb +98 -0
  23. data/{test → spec}/dummy/app/helpers/application_helper.rb +0 -0
  24. data/spec/dummy/app/lib/bread/actions.rb +18 -0
  25. data/{test → spec}/dummy/app/lib/bread/crumbs.rb +26 -25
  26. data/spec/dummy/app/models/category.rb +7 -0
  27. data/spec/dummy/app/models/photo.rb +11 -0
  28. data/spec/dummy/app/models/product.rb +12 -0
  29. data/spec/dummy/app/views/layouts/application.html.erb +23 -0
  30. data/spec/dummy/app/views/photos/_form.html.erb +21 -0
  31. data/spec/dummy/app/views/photos/edit.html.erb +6 -0
  32. data/spec/dummy/app/views/photos/index.html.erb +25 -0
  33. data/spec/dummy/app/views/photos/new.html.erb +5 -0
  34. data/spec/dummy/app/views/photos/show.html.erb +9 -0
  35. data/{test → spec}/dummy/app/views/products/_form.html.erb +4 -4
  36. data/{test → spec}/dummy/app/views/products/edit.html.erb +0 -0
  37. data/{test → spec}/dummy/app/views/products/index.html.erb +1 -3
  38. data/{test → spec}/dummy/app/views/products/new.html.erb +0 -0
  39. data/{test → spec}/dummy/app/views/products/show.html.erb +0 -0
  40. data/{test → spec}/dummy/bin/bundle +0 -0
  41. data/{test → spec}/dummy/bin/rails +0 -0
  42. data/{test → spec}/dummy/bin/rake +0 -0
  43. data/{test → spec}/dummy/config/application.rb +8 -0
  44. data/{test → spec}/dummy/config/boot.rb +0 -0
  45. data/{test → spec}/dummy/config/database.yml +1 -3
  46. data/{test → spec}/dummy/config/environment.rb +0 -0
  47. data/{test → spec}/dummy/config/environments/development.rb +0 -0
  48. data/{test → spec}/dummy/config/environments/production.rb +0 -0
  49. data/{test → spec}/dummy/config/environments/test.rb +0 -1
  50. data/{test → spec}/dummy/config/initializers/backtrace_silencers.rb +0 -0
  51. data/{test → spec}/dummy/config/initializers/filter_parameter_logging.rb +0 -0
  52. data/{test → spec}/dummy/config/initializers/inflections.rb +0 -0
  53. data/{test → spec}/dummy/config/initializers/mime_types.rb +0 -0
  54. data/{test → spec}/dummy/config/initializers/secret_token.rb +1 -1
  55. data/{test → spec}/dummy/config/initializers/session_store.rb +0 -0
  56. data/{test → spec}/dummy/config/initializers/wrap_parameters.rb +0 -0
  57. data/{test → spec}/dummy/config/locales/en.yml +0 -0
  58. data/{test → spec}/dummy/config/routes.rb +1 -3
  59. data/{test → spec}/dummy/config.ru +0 -0
  60. data/{test → spec}/dummy/db/development.sqlite3 +0 -0
  61. data/spec/dummy/db/migrate/20140912040816_create_foos.rb +9 -0
  62. data/spec/dummy/db/migrate/20140912042735_create_admin_foos.rb +9 -0
  63. data/{test/dummy/db/migrate/20140203163238_create_products.rb → spec/dummy/db/migrate/20150312182743_create_products.rb} +1 -1
  64. data/spec/dummy/db/migrate/20150312182826_create_categories.rb +9 -0
  65. data/spec/dummy/db/migrate/20150312183119_create_photos.rb +10 -0
  66. data/{test/dummy/app/controllers/concerns/.keep → spec/dummy/db/production.sqlite3} +0 -0
  67. data/{test → spec}/dummy/db/schema.rb +22 -21
  68. data/{test → spec}/dummy/db/test.sqlite3 +0 -0
  69. data/spec/dummy/lib/templates/rails/scaffold_controller/controller.rb +101 -0
  70. data/spec/dummy/log/development.log +167 -0
  71. data/spec/dummy/log/production.log +66 -0
  72. data/spec/dummy/log/test.log +21931 -0
  73. data/{test → spec}/dummy/public/404.html +0 -0
  74. data/{test → spec}/dummy/public/422.html +0 -0
  75. data/{test → spec}/dummy/public/500.html +0 -0
  76. data/{test → spec}/dummy/public/favicon.ico +0 -0
  77. data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  78. data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  79. data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  80. data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  81. data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  82. data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  83. data/spec/rails_helper.rb +78 -0
  84. data/spec/requests/photos_spec.rb +12 -0
  85. data/spec/requests/products_spec.rb +11 -0
  86. data/spec/spec_helper.rb +85 -0
  87. data/spec/support/bread_spec_controller_methods.rb +11 -0
  88. data/spec/support/controllers/bread_spec_controller_methods.rb +12 -0
  89. metadata +254 -193
  90. data/.gitignore +0 -22
  91. data/Gemfile +0 -26
  92. data/LICENSE.txt +0 -22
  93. data/bread.gemspec +0 -24
  94. data/lib/bread/helper.rb +0 -16
  95. data/lib/generators/bread/templates/skeleton.rb +0 -12
  96. data/test/dummy/app/assets/javascripts/product_photos.js +0 -2
  97. data/test/dummy/app/assets/javascripts/products.js +0 -2
  98. data/test/dummy/app/assets/stylesheets/product_photos.css +0 -4
  99. data/test/dummy/app/assets/stylesheets/products.css +0 -4
  100. data/test/dummy/app/assets/stylesheets/scaffold.css +0 -56
  101. data/test/dummy/app/controllers/product_photos_controller.rb +0 -63
  102. data/test/dummy/app/controllers/products_controller.rb +0 -72
  103. data/test/dummy/app/helpers/product_photos_helper.rb +0 -2
  104. data/test/dummy/app/helpers/products_helper.rb +0 -2
  105. data/test/dummy/app/lib/bread/actions_next.rb +0 -43
  106. data/test/dummy/app/lib/bread/crumbs_next.rb +0 -77
  107. data/test/dummy/app/mailers/.keep +0 -0
  108. data/test/dummy/app/models/.keep +0 -0
  109. data/test/dummy/app/models/concerns/.keep +0 -0
  110. data/test/dummy/app/models/product.rb +0 -10
  111. data/test/dummy/app/models/product_photo.rb +0 -10
  112. data/test/dummy/app/models/user.rb +0 -6
  113. data/test/dummy/app/views/layouts/application.html.erb +0 -34
  114. data/test/dummy/app/views/product_photos/_form.html.erb +0 -25
  115. data/test/dummy/app/views/product_photos/edit.html.erb +0 -6
  116. data/test/dummy/app/views/product_photos/index.html.erb +0 -31
  117. data/test/dummy/app/views/product_photos/new.html.erb +0 -5
  118. data/test/dummy/app/views/product_photos/show.html.erb +0 -19
  119. data/test/dummy/config/breadcrumbs.rb +0 -18
  120. data/test/dummy/config/initializers/devise.rb +0 -254
  121. data/test/dummy/config/locales/devise.en.yml +0 -59
  122. data/test/dummy/db/migrate/20140306111733_devise_create_users.rb +0 -42
  123. data/test/dummy/db/migrate/20140306114935_create_product_photos.rb +0 -11
  124. data/test/dummy/lib/assets/.keep +0 -0
  125. data/test/dummy/lib/templates/rails/scaffold_controller/controller.rb +0 -146
  126. data/test/dummy/log/.keep +0 -0
  127. data/test/dummy/test/bread_test.rb +0 -7
  128. data/test/dummy/test/controllers/product_photos_controller_test.rb +0 -98
  129. data/test/dummy/test/controllers/products_controller_test.rb +0 -114
  130. data/test/dummy/test/fixtures/product_photos.yml +0 -11
  131. data/test/dummy/test/fixtures/products.yml +0 -9
  132. data/test/dummy/test/fixtures/users.yml +0 -11
  133. data/test/dummy/test/helpers/product_photos_helper_test.rb +0 -4
  134. data/test/dummy/test/helpers/products_helper_test.rb +0 -4
  135. data/test/dummy/test/integration/devise_test.rb +0 -166
  136. data/test/dummy/test/integration/navigation_test.rb +0 -10
  137. data/test/dummy/test/models/product_photo_test.rb +0 -7
  138. data/test/dummy/test/models/product_test.rb +0 -7
  139. data/test/dummy/test/models/user_test.rb +0 -7
  140. data/test/dummy/test/support/asserts.rb +0 -38
  141. data/test/dummy/test/support/others.rb +0 -20
  142. data/test/test_helper.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 927a2721b385aea54644eac1fd2c7299690779b7
4
- data.tar.gz: 04be098c521909102f1b25f78c148d99cfcdcf43
3
+ metadata.gz: 22fc8ab013401209b7266f7394f4c05b669006b9
4
+ data.tar.gz: f308152160d62da729751655ebee6799b31ded8f
5
5
  SHA512:
6
- metadata.gz: d647602a5b17ec4833a5913f30f0aa42bee03612b3696356f1f20137b722324047e179b86d4364be660ccb0ab0ab35c98fca68a11d664dad5133e98583b3e39e
7
- data.tar.gz: 04192dffbd38d89396410dd4476942ad47d7e7f5e9a76eff9a2a9a619887325232fcbe0e2b7df9aab997bfc13de4aecc38c1f2e69d398cf76b32ee73666cbdce
6
+ metadata.gz: 660bb67452220e69c74580688d9de62afd8a9865415571cde22d6185814623c101f3b9d7b555d708aa49cc44f7670fc534b861c786c739fae34845bc9c4bb35b
7
+ data.tar.gz: 7a87b8476e81eedfd0178c21a9b052ebd4299bcac1d96e15fc863ab628d9dd3496c9408289b3872619f1235d92817b1a76eeaf78270c18c347ae4dff222c4d6b
data/README.md CHANGED
@@ -8,13 +8,10 @@ __This gem is under development and is not considered production-ready__
8
8
  ## Status
9
9
 
10
10
  [![Gem Version](https://badge.fury.io/rb/bread.svg)](http://badge.fury.io/rb/bread)
11
-
12
11
  [![Build Status](https://travis-ci.org/bread-gem/bread.svg?branch=master)](https://travis-ci.org/bread-gem/bread)
13
-
14
12
  [![Code Climate](https://codeclimate.com/github/bread-gem/bread.png)](https://codeclimate.com/github/bread-gem/bread)
15
-
13
+ [![Code Climate](https://codeclimate.com/github/bread-gem/bread/coverage.png)](https://codeclimate.com/github/bread-gem/bread)
16
14
  [![Dependency Status](https://gemnasium.com/bread-gem/bread.svg)](https://gemnasium.com/bread-gem/bread)
17
-
18
15
  [![Inline docs](http://inch-ci.org/github/bread-gem/bread.png?branch=master)](http://inch-ci.org/github/bread-gem/bread)
19
16
 
20
17
 
data/Rakefile CHANGED
@@ -1,34 +1,30 @@
1
+ #!/usr/bin/env rake
2
+
1
3
  begin
2
4
  require 'bundler/setup'
3
5
  rescue LoadError
4
6
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
7
  end
6
8
 
7
- require 'rdoc/task'
9
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
10
+ load 'rails/tasks/engine.rake'
8
11
 
9
- RDoc::Task.new(:rdoc) do |rdoc|
10
- rdoc.rdoc_dir = 'rdoc'
11
- rdoc.title = 'Permissions'
12
- rdoc.options << '--line-numbers'
13
- rdoc.rdoc_files.include('README.rdoc')
14
- rdoc.rdoc_files.include('lib/**/*.rb')
15
- end
12
+ Bundler::GemHelper.install_tasks
16
13
 
17
- APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
- load 'rails/tasks/engine.rake'
19
14
 
20
15
 
21
16
 
22
- Bundler::GemHelper.install_tasks
23
17
 
24
- require 'rake/testtask'
18
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
25
19
 
26
- Rake::TestTask.new(:test) do |t|
27
- t.libs << 'lib'
28
- t.libs << 'test'
29
- t.pattern = 'test/**/*_test.rb'
30
- t.verbose = false
31
- end
20
+ require 'rspec/core'
21
+ require 'rspec/core/rake_task'
22
+ require 'rspec/rails'
23
+
24
+
25
+ desc "Run all specs in spec directory (excluding plugin specs)"
26
+ RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
27
+
28
+ task :default => :spec
32
29
 
33
30
 
34
- task default: :test
@@ -0,0 +1,26 @@
1
+ module Bread
2
+ module Controller
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper_method :bread
7
+ end
8
+
9
+ def bread
10
+ controller = if respond_to?(:controller)
11
+ controller
12
+ else
13
+ self
14
+ end
15
+ crumbset = Bread.actions.get_crumbset(controller_path, action_name)
16
+ Bread.crumbs.crumbs_for(controller, crumbset)
17
+ end
18
+
19
+ end
20
+ end
21
+
22
+ if defined? ActionController::Base
23
+ ActionController::Base.class_eval do
24
+ include Bread::Controller
25
+ end
26
+ end
@@ -8,30 +8,10 @@ module Bread
8
8
  end
9
9
 
10
10
  def get_crumbset(controller_path, action_name)
11
- reload
11
+ Bread.reload!
12
12
  @top_scope.get_controller_scope(controller_path).get_crumbset(action_name)
13
13
  end
14
14
 
15
-
16
-
17
-
18
-
19
-
20
-
21
- private
22
-
23
- def reload
24
- config_file = Rails.root.join "app/lib/bread/actions.rb"
25
- unless File.exists? config_file
26
- #`rails g bread:install`
27
- raise "should have config actions file"
28
- end
29
-
30
- load(config_file)
31
- self
32
- end
33
-
34
-
35
15
  end
36
16
  end
37
17
  end
@@ -2,15 +2,13 @@ module Bread
2
2
  class Manager
3
3
  class Crumbs
4
4
 
5
-
6
-
7
5
  def config(&block)
8
6
  @top_scope = TopScope.new
9
7
  @top_scope.instance_eval(&block)
10
8
  end
11
9
 
12
10
  def crumbs_for(controller, crumbset)
13
- reload
11
+ Bread.reload!
14
12
  crumb_scope = CrumbScope.new(controller)
15
13
  crumb_blocks_for(crumbset).each do |bl|
16
14
  crumb_scope.instance_eval(&bl)
@@ -34,19 +32,6 @@ module Bread
34
32
  crumbs
35
33
  end
36
34
 
37
- def reload
38
- config_file = Rails.root.join "app/lib/bread/crumbs.rb"
39
- unless File.exists? config_file
40
- #`rails g bread:install`
41
- raise "should have config crumbs file"
42
- end
43
-
44
- load(config_file)
45
- self
46
- end
47
-
48
-
49
-
50
35
  end
51
36
  end
52
37
  end
@@ -0,0 +1,30 @@
1
+ module Bread
2
+ class Reloader
3
+ include Singleton
4
+
5
+ def initialize
6
+ @files = Dir["#{Rails.root}/app/lib/bread/*"]
7
+ @checker = ActiveSupport::FileUpdateChecker.new(@files) do
8
+ @files.each { |f| load f }
9
+ puts " Bread has reloaded!".light_blue
10
+ end
11
+ end
12
+
13
+ def reload!
14
+ @checker.execute if updated?
15
+ end
16
+
17
+ private
18
+
19
+ def updated?
20
+ if not @started
21
+ @started = true
22
+ elsif not Rails.env.development?
23
+ @checker.updated?
24
+ else
25
+ false
26
+ end
27
+ end
28
+
29
+ end
30
+ end
data/lib/bread/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Bread
2
- VERSION = "0.0.11"
2
+ VERSION = "0.0.12"
3
3
  end
data/lib/bread.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "bread/version"
2
2
 
3
- require "bread/helper"
3
+ require "bread/reloader"
4
+ require "bread/controller"
4
5
  require "bread/data/crumb"
5
6
  require "bread/manager/manager"
6
7
  require "bread/manager/actions"
@@ -12,6 +13,11 @@ require "bread/manager/crumbs/top_scope"
12
13
  require "bread/manager/crumbs/crumb_scope"
13
14
 
14
15
 
16
+ require 'colorize'
17
+
18
+
19
+
20
+
15
21
  module Bread
16
22
  def self.actions
17
23
  Manager.instance.actions
@@ -20,4 +26,9 @@ module Bread
20
26
  def self.crumbs
21
27
  Manager.instance.crumbs
22
28
  end
29
+
30
+ def self.reload!
31
+ Reloader.instance.reload!
32
+ end
23
33
  end
34
+
@@ -3,9 +3,24 @@ module Bread
3
3
  class InstallGenerator < Rails::Generators::Base
4
4
  source_root File.expand_path('../templates', __FILE__)
5
5
 
6
- def generate_install
7
- template "skeleton.rb", "config/breadcrumbs.rb"
6
+ def main_config_files
7
+ directory "bread", "app/lib/bread"
8
8
  end
9
+
10
+ def inject_html
11
+ destination_path = 'app/views/layouts/application.html.erb'
12
+ template_path = File.join(File.expand_path('../templates', __FILE__), "view.html.erb")
13
+ html = open(template_path).read
14
+ after_regex = /<body(.*)>/i
15
+
16
+ inject_into_file destination_path, html, after: after_regex
17
+
18
+ rescue Errno::ENOENT
19
+ puts "\tGENERATOR HAS FAILED"
20
+ puts "\tINSERT THIS BLOCK ON #{destination_path}".red
21
+ puts html.green
22
+ end
23
+
9
24
  end
10
25
  end
11
26
  end
@@ -1,18 +1,18 @@
1
- Bread.actions.config do
2
-
3
- controller :products, parent_crumbs: [:@root] do
4
- actions(:index) { crumbs :@products }
5
- actions(:new) { crumbs :@products, :@new_product }
6
- actions(:by_category) { crumbs :@products, :@products_by_category }
7
- actions(:show) { crumbs :@products, :@product }
8
- actions(:edit) { crumbs :@products, :@product, :@edit_product }
9
- end
10
-
11
- controller :product_photos, parent_crumbs: [:@root, :@products, :@product] do
12
- actions(:index) { crumbs :@photos }
13
- actions(:new) { crumbs :@photos, :@new_photo }
14
- actions(:show) { crumbs :@photos, :@photo }
15
- actions(:edit) { crumbs :@photos, :@photo, :@edit_photo }
16
- end
17
-
18
- end
1
+ Bread.actions.config do
2
+
3
+ controller :products, parent_crumbs: [:@root] do
4
+ actions(:index) { crumbs :@products }
5
+ actions(:new) { crumbs :@products, :@new_product }
6
+ actions(:by_category) { crumbs :@products, :@products_by_category }
7
+ actions(:show) { crumbs :@products, :@product }
8
+ actions(:edit) { crumbs :@products, :@product, :@edit_product }
9
+ end
10
+
11
+ controller :photos, parent_crumbs: [:@root, :@products, :@product] do
12
+ actions(:index) { crumbs :@photos }
13
+ actions(:new) { crumbs :@photos, :@new_photo }
14
+ actions(:show) { crumbs :@photos, :@photo }
15
+ actions(:edit) { crumbs :@photos, :@photo, :@edit_photo }
16
+ end
17
+
18
+ end
@@ -0,0 +1,20 @@
1
+ Bread.crumbs.config do
2
+
3
+ crumb(:@root) { to "Home", :root, icon: 'home' }
4
+
5
+ # products
6
+ crumb(:@products) { to "Products", h.products_path }
7
+ crumb(:@new_product) { to "New", h.new_product_path }
8
+ crumb(:@edit_product) { to "Edit", h.edit_product_path }
9
+ crumb(:@product) { to @product.unchanged_name, h.product_path(@product) }
10
+
11
+ # photos
12
+ crumb(:@photos) { to "Photos", h.product_photos_path }
13
+ crumb(:@new_photo) { to "New", h.new_product_photo_path }
14
+ crumb(:@edit_photo) { to "Edit", h.edit_product_photo_path }
15
+ crumb(:@photo) { to @photo.unchanged_name, h.product_photo_path }
16
+
17
+
18
+
19
+
20
+ end
@@ -0,0 +1,9 @@
1
+
2
+
3
+ <ul id="breadcrumbs">
4
+ <% bread.each do |crumb| %>
5
+ <li class="<%= 'active' if crumb.current? %>">
6
+ <%= link_to crumb.title, crumb.path, class: "icon icon-#{crumb[:icon]}" %>
7
+ </li>
8
+ <% end %>
9
+ </ul>
@@ -0,0 +1,94 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe PhotosController, type: :controller do
4
+
5
+ let(:product) { Product.create!(name: "Fake") }
6
+ let(:product_id) { product.id }
7
+ let(:photo) { photo = product.photos.create!(name: "Smile") }
8
+ let(:valid_session) { {} }
9
+ let(:invalid_attributes) { {name: "0"} }
10
+
11
+ before { photo } # touch
12
+
13
+
14
+
15
+
16
+ describe "GET #index" do
17
+ context "assigns all photos as @photos" do
18
+ it "Has Correct Breadcrumbs" do
19
+ get :index, {:product_id => product_id}, valid_session
20
+ expect(assigns(:photos)).to eq([photo])
21
+ expect(bread_titles).to eq ["Home", "Products", "Fake", "Photos"]
22
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/photos"]
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "GET #show" do
28
+ context "assigns the requested photo as @photo" do
29
+ it "Has Correct Breadcrumbs" do
30
+ get :show, {:product_id => product_id, :id => photo.to_param}, valid_session
31
+ expect(assigns(:photo)).to eq(photo)
32
+ expect(bread_titles).to eq ["Home", "Products", "Fake", "Photos", "Smile"]
33
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/photos", "/products/1/photos/1"]
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "GET #new" do
39
+ context "assigns a new photo as @photo" do
40
+ it "Has Correct Breadcrumbs" do
41
+ get :new, {:product_id => product_id}, valid_session
42
+ expect(assigns(:photo)).to be_a_new(Photo)
43
+ expect(bread_titles).to eq ["Home", "Products", "Fake", "Photos", "New"]
44
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/photos", "/products/1/photos/new"]
45
+ end
46
+ end
47
+ end
48
+
49
+ describe "GET #edit" do
50
+ context "assigns the requested photo as @photo" do
51
+ it "Has Correct Breadcrumbs" do
52
+ get :edit, {:product_id => product_id, :id => photo.to_param}, valid_session
53
+ expect(assigns(:photo)).to eq(photo)
54
+ expect(bread_titles).to eq ["Home", "Products", "Fake", "Photos", "Smile", "Edit"]
55
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/photos", "/products/1/photos/1", "/products/1/photos/1/edit"]
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "POST #create with invalid params" do
61
+ context "assigns a newly created but unsaved photo as @photo" do
62
+ it "Has Correct Breadcrumbs" do
63
+ post :create, {:product_id => product_id, :photo => invalid_attributes}, valid_session
64
+ expect(assigns(:photo)).to be_a_new(Photo)
65
+ expect(bread_titles).to eq ["Home", "Products", "Fake", "Photos", "New"]
66
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/photos", "/products/1/photos/new"]
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "PUT #update with invalid params" do
72
+ context "assigns the photo as @photo" do
73
+ it "Has Correct Breadcrumbs" do
74
+ put :update, {:product_id => product_id, :id => photo.to_param, :photo => invalid_attributes}, valid_session
75
+ expect(assigns(:photo)).to eq(photo)
76
+ expect(bread_titles).to eq ["Home", "Products", "Fake", "Photos", "0", "Edit"]
77
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/photos", "/products/1/photos/1", "/products/1/photos/1/edit"]
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "DELETE #destroy" do
83
+ context "cannot destroys the requested photo" do
84
+ it "Has Correct Breadcrumbs" do
85
+ expect {
86
+ delete :destroy, {:product_id => product_id, :id => photo.to_param}, valid_session
87
+ }.not_to change(Photo, :count).from(1)
88
+ expect(bread_titles).to eq ["Home", "Products", "Fake", "Photos", "Smile", "Edit"]
89
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/photos", "/products/1/photos/1", "/products/1/photos/1/edit"]
90
+ end
91
+ end
92
+ end
93
+
94
+ end
@@ -0,0 +1,94 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ProductsController, type: :controller do
4
+
5
+ let(:invalid_attributes) { {name: "0"} }
6
+ let(:product) { Product.create! name: "Fake" }
7
+ let(:valid_session) { {} }
8
+
9
+ before { product } # touch
10
+
11
+
12
+
13
+ describe "GET #index" do
14
+ context "assigns all products as @products" do
15
+ render_views
16
+
17
+ it "Has Correct Breadcrumbs On Controller And View" do
18
+ get :index, {}, valid_session
19
+ expect(assigns(:products)).to eq([product])
20
+ expect(bread_titles).to eq ["Home", "Products"]
21
+ expect(bread_paths).to eq [:root, "/products"]
22
+ expect(response.body).to match /<ul id="breadcrumbs">/
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "GET #show" do
28
+ context "assigns the requested product as @product" do
29
+ it "Has Correct Breadcrumbs" do
30
+ get :show, {:id => product.to_param}, valid_session
31
+ expect(assigns(:product)).to eq(product)
32
+ expect(bread_titles).to eq ["Home", "Products", "Fake"]
33
+ expect(bread_paths).to eq [:root, "/products", "/products/1"]
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "GET #new" do
39
+ context "assigns a new product as @product" do
40
+ it "Has Correct Breadcrumbs" do
41
+ get :new, {}, valid_session
42
+ expect(assigns(:product)).to be_a_new(Product)
43
+ expect(bread_titles).to eq ["Home", "Products", "New"]
44
+ expect(bread_paths).to eq [:root, "/products", "/products/new"]
45
+ end
46
+ end
47
+ end
48
+
49
+ describe "GET #edit" do
50
+ context "assigns the requested product as @product" do
51
+ it "Has Correct Breadcrumbs" do
52
+ get :edit, {:id => product.to_param}, valid_session
53
+ expect(assigns(:product)).to eq(product)
54
+ expect(bread_titles).to eq ["Home", "Products", "Fake", "Edit"]
55
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/edit"]
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "POST #create with invalid params" do
61
+ context "assigns a newly created but unsaved product as @product" do
62
+ it "Has Correct Breadcrumbs" do
63
+ post :create, {:product => invalid_attributes}, valid_session
64
+ expect(assigns(:product)).to be_a_new(Product)
65
+ expect(bread_titles).to eq ["Home", "Products", "New"]
66
+ expect(bread_paths).to eq [:root, "/products", "/products/new"]
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "PUT #update with invalid params" do
72
+ context "assigns the product as @product" do
73
+ it "Has Correct Breadcrumbs" do
74
+ put :update, {:id => product.to_param, :product => invalid_attributes}, valid_session
75
+ expect(assigns(:product)).to eq(product)
76
+ expect(bread_titles).to eq ["Home", "Products", "0", "Edit"]
77
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/edit"]
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "DELETE #destroy" do
83
+ context "cannot destroys the requested product" do
84
+ it "Has Correct Breadcrumbs" do
85
+ expect {
86
+ delete :destroy, {:id => product.to_param}, valid_session
87
+ }.not_to change(Product, :count).from(1)
88
+ expect(bread_titles).to eq ["Home", "Products", "Fake", "Edit"]
89
+ expect(bread_paths).to eq [:root, "/products", "/products/1", "/products/1/edit"]
90
+ end
91
+ end
92
+ end
93
+
94
+ end
File without changes
File without changes
@@ -0,0 +1,96 @@
1
+
2
+
3
+ class PhotosController < ApplicationController
4
+
5
+ # Use callbacks to share common setup or constraints between actions.
6
+ before_actions do
7
+ all { @product = Product.find(params[:product_id]) }
8
+ only(:index) { @photos = @product.photos }
9
+ only(:new) { @photo = @product.photos.build }
10
+ only(:create) { @photo = @product.photos.build(photo_params) }
11
+ only(:show, :edit, :update, :destroy) { @photo = @product.photos.find(params[:id]) }
12
+ end
13
+
14
+ # GET /photos
15
+ # GET /photos.json
16
+ def index
17
+ respond_to do |format|
18
+ format.html # index.html.erb
19
+ format.json { render json: @photos }
20
+ end
21
+ end
22
+
23
+
24
+
25
+
26
+ # GET /photos/new
27
+ def new
28
+ end
29
+
30
+ # POST /photos
31
+ # POST /photos.json
32
+ def create
33
+ respond_to do |format|
34
+ if @photo.save
35
+ format.html { redirect_to [@product, @photo], notice: 'Photo was successfully created.' }
36
+ format.json { render json: @photo, status: :created }
37
+ else
38
+ format.html { render action: 'new' }
39
+ format.json { render json: @photo.errors, status: :unprocessable_entity }
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+
46
+
47
+
48
+ # GET /photos/1
49
+ # GET /photos/1.json
50
+ def show
51
+ respond_to do |format|
52
+ format.html # show.html.erb
53
+ format.json { render json: @photo }
54
+ end
55
+ end
56
+
57
+ # GET /photos/1/edit
58
+ def edit
59
+ end
60
+
61
+ # PATCH/PUT /photos/1
62
+ # PATCH/PUT /photos/1.json
63
+ def update
64
+ respond_to do |format|
65
+ if @photo.update(photo_params)
66
+ format.html { redirect_to [@product, @photo], notice: 'Photo was successfully updated.' }
67
+ format.json { head :no_content }
68
+ else
69
+ format.html { render action: 'edit' }
70
+ format.json { render json: @photo.errors, status: :unprocessable_entity }
71
+ end
72
+ end
73
+ end
74
+
75
+ # DELETE /photos/1
76
+ # DELETE /photos/1
77
+ def destroy
78
+ respond_to do |format|
79
+ if @photo.destroy
80
+ format.html { redirect_to product_photos_url, notice: 'Photo was successfully destroyed.' }
81
+ format.json { head :no_content }
82
+ else
83
+ format.html { render action: 'edit' }
84
+ format.json { render json: @photo.errors, status: :unprocessable_entity }
85
+ end
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ # Only allow a trusted parameter "white list" through.
92
+ def photo_params
93
+ params.require(:photo).permit(:name)
94
+ end
95
+ end
96
+