thermos 0.0.2

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 (64) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +39 -0
  4. data/lib/tasks/thermos_tasks.rake +4 -0
  5. data/lib/thermos/beverage.rb +32 -0
  6. data/lib/thermos/dependency.rb +11 -0
  7. data/lib/thermos/notifier.rb +14 -0
  8. data/lib/thermos/refill_job.rb +6 -0
  9. data/lib/thermos/version.rb +3 -0
  10. data/lib/thermos.rb +52 -0
  11. data/test/dummy/README.rdoc +28 -0
  12. data/test/dummy/Rakefile +6 -0
  13. data/test/dummy/app/assets/javascripts/application.js +13 -0
  14. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  15. data/test/dummy/app/controllers/application_controller.rb +5 -0
  16. data/test/dummy/app/helpers/application_helper.rb +2 -0
  17. data/test/dummy/app/models/category.rb +18 -0
  18. data/test/dummy/app/models/category_item.rb +4 -0
  19. data/test/dummy/app/models/product.rb +4 -0
  20. data/test/dummy/app/models/store.rb +3 -0
  21. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  22. data/test/dummy/bin/bundle +3 -0
  23. data/test/dummy/bin/rails +4 -0
  24. data/test/dummy/bin/rake +4 -0
  25. data/test/dummy/bin/setup +29 -0
  26. data/test/dummy/config/application.rb +26 -0
  27. data/test/dummy/config/boot.rb +5 -0
  28. data/test/dummy/config/database.yml +25 -0
  29. data/test/dummy/config/environment.rb +5 -0
  30. data/test/dummy/config/environments/development.rb +41 -0
  31. data/test/dummy/config/environments/production.rb +79 -0
  32. data/test/dummy/config/environments/test.rb +42 -0
  33. data/test/dummy/config/initializers/assets.rb +11 -0
  34. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  35. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  36. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  37. data/test/dummy/config/initializers/inflections.rb +16 -0
  38. data/test/dummy/config/initializers/mime_types.rb +4 -0
  39. data/test/dummy/config/initializers/session_store.rb +3 -0
  40. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  41. data/test/dummy/config/locales/en.yml +23 -0
  42. data/test/dummy/config/routes.rb +56 -0
  43. data/test/dummy/config/secrets.yml +22 -0
  44. data/test/dummy/config.ru +4 -0
  45. data/test/dummy/db/development.sqlite3 +0 -0
  46. data/test/dummy/db/migrate/20160325214744_create_categories.rb +10 -0
  47. data/test/dummy/db/migrate/20160325214849_create_products.rb +9 -0
  48. data/test/dummy/db/migrate/20160325220006_create_category_items.rb +11 -0
  49. data/test/dummy/db/migrate/20160326174530_create_stores.rb +9 -0
  50. data/test/dummy/db/schema.rb +43 -0
  51. data/test/dummy/db/test.sqlite3 +0 -0
  52. data/test/dummy/log/development.log +49 -0
  53. data/test/dummy/log/test.log +7518 -0
  54. data/test/dummy/public/404.html +67 -0
  55. data/test/dummy/public/422.html +67 -0
  56. data/test/dummy/public/500.html +66 -0
  57. data/test/dummy/public/favicon.ico +0 -0
  58. data/test/fixtures/categories.yml +3 -0
  59. data/test/fixtures/category_items.yml +4 -0
  60. data/test/fixtures/products.yml +3 -0
  61. data/test/fixtures/stores.yml +2 -0
  62. data/test/test_helper.rb +21 -0
  63. data/test/thermos_test.rb +179 -0
  64. metadata +188 -0
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/404.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The page you were looking for doesn't exist.</h1>
62
+ <p>You may have mistyped the address or the page may have moved.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/422.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The change you wanted was rejected.</h1>
62
+ <p>Maybe you tried to change something you didn't have access to.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
@@ -0,0 +1,3 @@
1
+ baseball:
2
+ name: baseball
3
+ store: sports
@@ -0,0 +1,4 @@
1
+ baseball_glove:
2
+ name: baseball glove
3
+ category: baseball
4
+ product: glove
@@ -0,0 +1,3 @@
1
+ glove:
2
+ name: glove
3
+
@@ -0,0 +1,2 @@
1
+ sports:
2
+ name: sports store
@@ -0,0 +1,21 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
5
+ ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
6
+ require "rails/test_help"
7
+
8
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
9
+ # to be shown.
10
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
11
+ require 'minitest/mock'
12
+
13
+ # Load support files
14
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
15
+
16
+ # Load fixtures from the engine
17
+ if ActiveSupport::TestCase.respond_to?(:fixture_path=)
18
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
19
+ ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
20
+ ActiveSupport::TestCase.fixtures :all
21
+ end
@@ -0,0 +1,179 @@
1
+ require 'test_helper'
2
+
3
+ class ThermosTest < ActiveSupport::TestCase
4
+ ActiveSupport.test_order = :random
5
+ self.use_transactional_fixtures = true
6
+
7
+ def teardown
8
+ Thermos.empty
9
+ Rails.cache.clear
10
+ end
11
+
12
+ test "keeps the cache warm using fill / drink" do
13
+ mock = Minitest::Mock.new
14
+
15
+ Thermos.fill(key: "key", model: Category) do |id|
16
+ mock.call(id)
17
+ end
18
+
19
+ mock.expect(:call, 1, [1])
20
+ assert_equal 1, Thermos.drink(key: "key", id: 1)
21
+ mock.verify
22
+
23
+ mock.expect(:call, 2, [1])
24
+ assert_equal 1, Thermos.drink(key: "key", id: 1)
25
+ assert_raises(MockExpectationError) { mock.verify }
26
+ end
27
+
28
+ test "keeps the cache warm using keep_warm" do
29
+ mock = Minitest::Mock.new
30
+
31
+ mock.expect(:call, 1, [1])
32
+ response = Thermos.keep_warm(key: "key", model: Category, id: 1) do |id|
33
+ mock.call(id)
34
+ end
35
+ assert_equal 1, response
36
+ mock.verify
37
+
38
+ mock.expect(:call, 2, [1])
39
+ response = Thermos.keep_warm(key: "key", model: Category, id: 1) do |id|
40
+ mock.call(id)
41
+ end
42
+ assert_equal 1, response
43
+ assert_raises(MockExpectationError) { mock.verify }
44
+ end
45
+
46
+ test "rebuilds the cache on primary model change" do
47
+ mock = Minitest::Mock.new
48
+ category = categories(:baseball)
49
+
50
+ Thermos.fill(key: "key", model: Category) do |id|
51
+ mock.call(id)
52
+ end
53
+
54
+ mock.expect(:call, 1, [category.id])
55
+ assert_equal 1, Thermos.drink(key: "key", id: category.id)
56
+ mock.verify
57
+
58
+ mock.expect(:call, 2, [category.id])
59
+ category.update!(name: "foo")
60
+ mock.verify
61
+
62
+ mock.expect(:call, 3, [category.id])
63
+ assert_equal 2, Thermos.drink(key: "key", id: category.id)
64
+ assert_raises(MockExpectationError) { mock.verify }
65
+ end
66
+
67
+ test "rebuilds the cache on has_many model change" do
68
+ mock = Minitest::Mock.new
69
+ category = categories(:baseball)
70
+ category_item = category_items(:baseball_glove)
71
+
72
+ Thermos.fill(key: "key", model: Category, deps: [:category_items]) do |id|
73
+ mock.call(id)
74
+ end
75
+
76
+ mock.expect(:call, 1, [category.id])
77
+ assert_equal 1, Thermos.drink(key: "key", id: category.id)
78
+ mock.verify
79
+
80
+ mock.expect(:call, 2, [category.id])
81
+ category_item.update!(name: "foo")
82
+ mock.verify
83
+
84
+ mock.expect(:call, 3, [category.id])
85
+ assert_equal 2, Thermos.drink(key: "key", id: category.id)
86
+ assert_raises(MockExpectationError) { mock.verify }
87
+ end
88
+
89
+ test "rebuilds the cache on belongs_to model change" do
90
+ mock = Minitest::Mock.new
91
+ category = categories(:baseball)
92
+ store = stores(:sports)
93
+
94
+ Thermos.fill(key: "key", model: Category, deps: [:store]) do |id|
95
+ mock.call(id)
96
+ end
97
+
98
+ mock.expect(:call, 1, [category.id])
99
+ assert_equal 1, Thermos.drink(key: "key", id: category.id)
100
+ mock.verify
101
+
102
+ mock.expect(:call, 2, [category.id])
103
+ store.update!(name: "foo")
104
+ mock.verify
105
+
106
+ mock.expect(:call, 3, [category.id])
107
+ assert_equal 2, Thermos.drink(key: "key", id: category.id)
108
+ assert_raises(MockExpectationError) { mock.verify }
109
+ end
110
+
111
+ test "rebuilds the cache on has_many through model change" do
112
+ mock = Minitest::Mock.new
113
+ category = categories(:baseball)
114
+ product = products(:glove)
115
+
116
+ Thermos.fill(key: "key", model: Category, deps: [:products]) do |id|
117
+ mock.call(id)
118
+ end
119
+
120
+ mock.expect(:call, 1, [category.id])
121
+ assert_equal 1, Thermos.drink(key: "key", id: category.id)
122
+ mock.verify
123
+
124
+ mock.expect(:call, 2, [category.id])
125
+ product.update!(name: "foo")
126
+ mock.verify
127
+
128
+ mock.expect(:call, 3, [category.id])
129
+ assert_equal 2, Thermos.drink(key: "key", id: category.id)
130
+ assert_raises(MockExpectationError) { mock.verify }
131
+ end
132
+
133
+ test "only rebuilds cache for stated dependencies, even if another cache has an associated model of the primary" do
134
+ category_mock = Minitest::Mock.new
135
+ product_mock = Minitest::Mock.new
136
+ category = categories(:baseball)
137
+ product = products(:glove)
138
+
139
+ Thermos.fill(key: "category_key", model: Category) do |id|
140
+ category_mock.call(id)
141
+ end
142
+
143
+ Thermos.fill(key: "product_key", model: Product) do |id|
144
+ product_mock.call(id)
145
+ end
146
+
147
+ category_mock.expect(:call, 2, [category.id])
148
+ product_mock.expect(:call, 2, [product.id])
149
+ product.update!(name: "foo")
150
+ assert_raises(MockExpectationError) { category_mock.verify }
151
+ product_mock.verify
152
+ end
153
+
154
+ test "accepts and can rebuild off of an id other than the 'id'" do
155
+ mock = Minitest::Mock.new
156
+ category = categories(:baseball)
157
+ product = products(:glove)
158
+
159
+ Thermos.fill(key: "key", model: Category, deps: [:products], lookup_key: :name) do |id|
160
+ mock.call(id)
161
+ end
162
+
163
+ mock.expect(:call, 1, [category.name])
164
+ assert_equal 1, Thermos.drink(key: "key", id: category.name)
165
+ mock.verify
166
+
167
+ mock.expect(:call, 2, ["foo"])
168
+ category.update!(name: "foo")
169
+ mock.verify
170
+
171
+ mock.expect(:call, 3, [category.name])
172
+ product.update!(name: "foo")
173
+ mock.verify
174
+
175
+ mock.expect(:call, 4, [category.name])
176
+ assert_equal 3, Thermos.drink(key: "key", id: category.name)
177
+ assert_raises(MockExpectationError) { mock.verify }
178
+ end
179
+ end
metadata ADDED
@@ -0,0 +1,188 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: thermos
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Thal
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Thermos is a library for caching in rails that re-warms caches in the
42
+ background based on model changes.
43
+ email:
44
+ - hi@athal7.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - MIT-LICENSE
50
+ - Rakefile
51
+ - lib/tasks/thermos_tasks.rake
52
+ - lib/thermos.rb
53
+ - lib/thermos/beverage.rb
54
+ - lib/thermos/dependency.rb
55
+ - lib/thermos/notifier.rb
56
+ - lib/thermos/refill_job.rb
57
+ - lib/thermos/version.rb
58
+ - test/dummy/README.rdoc
59
+ - test/dummy/Rakefile
60
+ - test/dummy/app/assets/javascripts/application.js
61
+ - test/dummy/app/assets/stylesheets/application.css
62
+ - test/dummy/app/controllers/application_controller.rb
63
+ - test/dummy/app/helpers/application_helper.rb
64
+ - test/dummy/app/models/category.rb
65
+ - test/dummy/app/models/category_item.rb
66
+ - test/dummy/app/models/product.rb
67
+ - test/dummy/app/models/store.rb
68
+ - test/dummy/app/views/layouts/application.html.erb
69
+ - test/dummy/bin/bundle
70
+ - test/dummy/bin/rails
71
+ - test/dummy/bin/rake
72
+ - test/dummy/bin/setup
73
+ - test/dummy/config.ru
74
+ - test/dummy/config/application.rb
75
+ - test/dummy/config/boot.rb
76
+ - test/dummy/config/database.yml
77
+ - test/dummy/config/environment.rb
78
+ - test/dummy/config/environments/development.rb
79
+ - test/dummy/config/environments/production.rb
80
+ - test/dummy/config/environments/test.rb
81
+ - test/dummy/config/initializers/assets.rb
82
+ - test/dummy/config/initializers/backtrace_silencers.rb
83
+ - test/dummy/config/initializers/cookies_serializer.rb
84
+ - test/dummy/config/initializers/filter_parameter_logging.rb
85
+ - test/dummy/config/initializers/inflections.rb
86
+ - test/dummy/config/initializers/mime_types.rb
87
+ - test/dummy/config/initializers/session_store.rb
88
+ - test/dummy/config/initializers/wrap_parameters.rb
89
+ - test/dummy/config/locales/en.yml
90
+ - test/dummy/config/routes.rb
91
+ - test/dummy/config/secrets.yml
92
+ - test/dummy/db/development.sqlite3
93
+ - test/dummy/db/migrate/20160325214744_create_categories.rb
94
+ - test/dummy/db/migrate/20160325214849_create_products.rb
95
+ - test/dummy/db/migrate/20160325220006_create_category_items.rb
96
+ - test/dummy/db/migrate/20160326174530_create_stores.rb
97
+ - test/dummy/db/schema.rb
98
+ - test/dummy/db/test.sqlite3
99
+ - test/dummy/log/development.log
100
+ - test/dummy/log/test.log
101
+ - test/dummy/public/404.html
102
+ - test/dummy/public/422.html
103
+ - test/dummy/public/500.html
104
+ - test/dummy/public/favicon.ico
105
+ - test/fixtures/categories.yml
106
+ - test/fixtures/category_items.yml
107
+ - test/fixtures/products.yml
108
+ - test/fixtures/stores.yml
109
+ - test/test_helper.rb
110
+ - test/thermos_test.rb
111
+ homepage:
112
+ licenses:
113
+ - MIT
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 2.4.5.1
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: Always-warm, auto-rebuilding rails caching without timers or touching.
135
+ test_files:
136
+ - test/dummy/app/assets/javascripts/application.js
137
+ - test/dummy/app/assets/stylesheets/application.css
138
+ - test/dummy/app/controllers/application_controller.rb
139
+ - test/dummy/app/helpers/application_helper.rb
140
+ - test/dummy/app/models/category.rb
141
+ - test/dummy/app/models/category_item.rb
142
+ - test/dummy/app/models/product.rb
143
+ - test/dummy/app/models/store.rb
144
+ - test/dummy/app/views/layouts/application.html.erb
145
+ - test/dummy/bin/bundle
146
+ - test/dummy/bin/rails
147
+ - test/dummy/bin/rake
148
+ - test/dummy/bin/setup
149
+ - test/dummy/config/application.rb
150
+ - test/dummy/config/boot.rb
151
+ - test/dummy/config/database.yml
152
+ - test/dummy/config/environment.rb
153
+ - test/dummy/config/environments/development.rb
154
+ - test/dummy/config/environments/production.rb
155
+ - test/dummy/config/environments/test.rb
156
+ - test/dummy/config/initializers/assets.rb
157
+ - test/dummy/config/initializers/backtrace_silencers.rb
158
+ - test/dummy/config/initializers/cookies_serializer.rb
159
+ - test/dummy/config/initializers/filter_parameter_logging.rb
160
+ - test/dummy/config/initializers/inflections.rb
161
+ - test/dummy/config/initializers/mime_types.rb
162
+ - test/dummy/config/initializers/session_store.rb
163
+ - test/dummy/config/initializers/wrap_parameters.rb
164
+ - test/dummy/config/locales/en.yml
165
+ - test/dummy/config/routes.rb
166
+ - test/dummy/config/secrets.yml
167
+ - test/dummy/config.ru
168
+ - test/dummy/db/development.sqlite3
169
+ - test/dummy/db/migrate/20160325214744_create_categories.rb
170
+ - test/dummy/db/migrate/20160325214849_create_products.rb
171
+ - test/dummy/db/migrate/20160325220006_create_category_items.rb
172
+ - test/dummy/db/migrate/20160326174530_create_stores.rb
173
+ - test/dummy/db/schema.rb
174
+ - test/dummy/db/test.sqlite3
175
+ - test/dummy/log/development.log
176
+ - test/dummy/log/test.log
177
+ - test/dummy/public/404.html
178
+ - test/dummy/public/422.html
179
+ - test/dummy/public/500.html
180
+ - test/dummy/public/favicon.ico
181
+ - test/dummy/Rakefile
182
+ - test/dummy/README.rdoc
183
+ - test/fixtures/categories.yml
184
+ - test/fixtures/category_items.yml
185
+ - test/fixtures/products.yml
186
+ - test/fixtures/stores.yml
187
+ - test/test_helper.rb
188
+ - test/thermos_test.rb