bread 0.0.11 → 0.0.12

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 (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
+