spreeference 0.1.0

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 (83) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +26 -0
  3. data/README.md +233 -0
  4. data/Rakefile +26 -0
  5. data/app/models/spreeference/app_configuration.rb +9 -0
  6. data/app/models/spreeference/application_record.rb +16 -0
  7. data/app/models/spreeference/preference.rb +6 -0
  8. data/config/routes.rb +2 -0
  9. data/db/migrate/20170217094656_create_spreeference_preferences.rb +10 -0
  10. data/lib/generators/spreeference/install_generator.rb +17 -0
  11. data/lib/generators/templates/app_configuration.rb +6 -0
  12. data/lib/generators/templates/spreeference.rb +12 -0
  13. data/lib/spreeference.rb +16 -0
  14. data/lib/spreeference/configuration.rb +48 -0
  15. data/lib/spreeference/engine.rb +28 -0
  16. data/lib/spreeference/environment.rb +12 -0
  17. data/lib/spreeference/environment_extension.rb +23 -0
  18. data/lib/spreeference/preferable.rb +103 -0
  19. data/lib/spreeference/preferable_methods.rb +52 -0
  20. data/lib/spreeference/scoped_store.rb +34 -0
  21. data/lib/spreeference/store.rb +93 -0
  22. data/lib/spreeference/version.rb +3 -0
  23. data/lib/tasks/spreeference_tasks.rake +4 -0
  24. data/spec/dummy/Rakefile +6 -0
  25. data/spec/dummy/app/assets/config/manifest.js +3 -0
  26. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  27. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  28. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  29. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  30. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  31. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  32. data/spec/dummy/app/jobs/application_job.rb +2 -0
  33. data/spec/dummy/app/models/app_configuration.rb +6 -0
  34. data/spec/dummy/app/models/application_record.rb +3 -0
  35. data/spec/dummy/app/views/layouts/application.html.erb +13 -0
  36. data/spec/dummy/bin/bundle +3 -0
  37. data/spec/dummy/bin/rails +4 -0
  38. data/spec/dummy/bin/rake +4 -0
  39. data/spec/dummy/bin/setup +34 -0
  40. data/spec/dummy/bin/update +29 -0
  41. data/spec/dummy/config.ru +5 -0
  42. data/spec/dummy/config/application.rb +23 -0
  43. data/spec/dummy/config/boot.rb +5 -0
  44. data/spec/dummy/config/cable.yml +9 -0
  45. data/spec/dummy/config/database.yml +25 -0
  46. data/spec/dummy/config/environment.rb +5 -0
  47. data/spec/dummy/config/environments/development.rb +42 -0
  48. data/spec/dummy/config/environments/production.rb +73 -0
  49. data/spec/dummy/config/environments/test.rb +36 -0
  50. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  51. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  52. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  53. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  54. data/spec/dummy/config/initializers/inflections.rb +16 -0
  55. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  56. data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
  57. data/spec/dummy/config/initializers/session_store.rb +3 -0
  58. data/spec/dummy/config/initializers/spreeference.rb +13 -0
  59. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  60. data/spec/dummy/config/locales/en.yml +23 -0
  61. data/spec/dummy/config/puma.rb +47 -0
  62. data/spec/dummy/config/routes.rb +3 -0
  63. data/spec/dummy/config/secrets.yml +22 -0
  64. data/spec/dummy/config/spring.rb +6 -0
  65. data/spec/dummy/db/development.sqlite3 +0 -0
  66. data/spec/dummy/db/schema.rb +23 -0
  67. data/spec/dummy/db/test.sqlite3 +0 -0
  68. data/spec/dummy/log/development.log +69 -0
  69. data/spec/dummy/log/test.log +1995 -0
  70. data/spec/dummy/public/404.html +67 -0
  71. data/spec/dummy/public/422.html +67 -0
  72. data/spec/dummy/public/500.html +66 -0
  73. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  74. data/spec/dummy/public/apple-touch-icon.png +0 -0
  75. data/spec/dummy/public/favicon.ico +0 -0
  76. data/spec/lib/spreeference/configuration_spec.rb +27 -0
  77. data/spec/lib/spreeference/preferable_spec.rb +344 -0
  78. data/spec/lib/spreeference/scoped_store_spec.rb +58 -0
  79. data/spec/lib/spreeference/store_spec.rb +46 -0
  80. data/spec/models/spreeference/preference_spec.rb +80 -0
  81. data/spec/rails_helper.rb +31 -0
  82. data/spec/spec_helper.rb +19 -0
  83. metadata +227 -0
@@ -0,0 +1,58 @@
1
+ module Spreeference
2
+ describe Spreeference::ScopedStore, type: :model do
3
+ let(:scoped_store){ described_class.new(prefix, suffix) }
4
+ subject{ scoped_store }
5
+ let(:prefix){ nil }
6
+ let(:suffix){ nil }
7
+
8
+ describe '#store' do
9
+ subject{ scoped_store.store }
10
+ it{ is_expected.to be Spreeference::Store.instance }
11
+ end
12
+
13
+ context 'stubbed store' do
14
+ let(:store){ double(:store) }
15
+ before do
16
+ allow(scoped_store).to receive(:store).and_return(store)
17
+ end
18
+
19
+ context "with a prefix" do
20
+ let(:prefix){ 'my_class' }
21
+
22
+ it "can fetch" do
23
+ expect(store).to receive(:fetch).with('my_class/attr')
24
+ scoped_store.fetch('attr'){ 'default' }
25
+ end
26
+
27
+ it "can assign" do
28
+ expect(store).to receive(:[]=).with('my_class/attr', 'val')
29
+ scoped_store['attr'] = 'val'
30
+ end
31
+
32
+ it "can delete" do
33
+ expect(store).to receive(:delete).with('my_class/attr')
34
+ scoped_store.delete('attr')
35
+ end
36
+
37
+ context "and suffix" do
38
+ let(:suffix){ 123 }
39
+
40
+ it "can fetch" do
41
+ expect(store).to receive(:fetch).with('my_class/attr/123')
42
+ scoped_store.fetch('attr'){ 'default' }
43
+ end
44
+
45
+ it "can assign" do
46
+ expect(store).to receive(:[]=).with('my_class/attr/123', 'val')
47
+ scoped_store['attr'] = 'val'
48
+ end
49
+
50
+ it "can delete" do
51
+ expect(store).to receive(:delete).with('my_class/attr/123')
52
+ scoped_store.delete('attr')
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,46 @@
1
+ module Spreeference
2
+ describe Spreeference::Store, type: :model do
3
+ before :each do
4
+ @store = Spreeference::StoreInstance.new
5
+ end
6
+
7
+ it "sets and gets a key" do
8
+ @store.set :test, 1
9
+ expect(@store.exist?(:test)).to be true
10
+ expect(@store.get(:test)).to eq 1
11
+ end
12
+
13
+ it "can set and get false values when cache return nil" do
14
+ @store.set :test, false
15
+ expect(@store.get(:test)).to be false
16
+ end
17
+
18
+ it "will return db value when cache is emtpy and cache the db value" do
19
+ preference = Spreeference::Preference.where(key: 'test').first_or_initialize
20
+ preference.value = '123'
21
+ preference.save
22
+
23
+ Rails.cache.clear
24
+ expect(@store.get(:test)).to eq '123'
25
+ expect(Rails.cache.read(:test)).to eq '123'
26
+ end
27
+
28
+ it "should return and cache fallback value when supplied" do
29
+ Rails.cache.clear
30
+ expect(@store.get(:test){ false }).to be false
31
+ expect(Rails.cache.read(:test)).to be false
32
+ end
33
+
34
+ it "should return but not cache fallback value when persistence is disabled" do
35
+ Rails.cache.clear
36
+ allow(@store).to receive_messages(should_persist?: false)
37
+ expect(@store.get(:test){ true }).to be true
38
+ expect(Rails.cache.exist?(:test)).to be false
39
+ end
40
+
41
+ it "should return nil when key can't be found and fallback value is not supplied" do
42
+ expect(@store.get(:random_key){ nil }).to be_nil
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,80 @@
1
+ module Spreeference
2
+ describe Spreeference::Preference, type: :model do
3
+
4
+ it "should require a key" do
5
+ @preference = Spreeference::Preference.new
6
+ @preference.key = :test
7
+ @preference.value = true
8
+ expect(@preference).to be_valid
9
+ end
10
+
11
+ describe "type coversion for values" do
12
+ def round_trip_preference(key, value)
13
+ p = Spreeference::Preference.new
14
+ p.value = value
15
+ p.key = key
16
+ p.save
17
+
18
+ Spreeference::Preference.find_by_key(key)
19
+ end
20
+
21
+ it ":boolean" do
22
+ value = true
23
+ key = "boolean_key"
24
+ pref = round_trip_preference(key, value)
25
+ expect(pref.value).to eq value
26
+ end
27
+
28
+ it "false :boolean" do
29
+ value = false
30
+ key = "boolean_key"
31
+ pref = round_trip_preference(key, value)
32
+ expect(pref.value).to eq value
33
+ end
34
+
35
+ it ":integer" do
36
+ value = 10
37
+ key = "integer_key"
38
+ pref = round_trip_preference(key, value)
39
+ expect(pref.value).to eq value
40
+ end
41
+
42
+ it ":decimal" do
43
+ value = 1.5
44
+ key = "decimal_key"
45
+ pref = round_trip_preference(key, value)
46
+ expect(pref.value).to eq value
47
+ end
48
+
49
+ it ":string" do
50
+ value = "This is a string"
51
+ key = "string_key"
52
+ pref = round_trip_preference(key, value)
53
+ expect(pref.value).to eq value
54
+ end
55
+
56
+ it ":text" do
57
+ value = "This is a string stored as text"
58
+ key = "text_key"
59
+ pref = round_trip_preference(key, value)
60
+ expect(pref.value).to eq value
61
+ end
62
+
63
+ it ":password" do
64
+ value = "This is a password"
65
+ key = "password_key"
66
+ pref = round_trip_preference(key, value)
67
+ expect(pref.value).to eq value
68
+ end
69
+
70
+ it ":any" do
71
+ value = [1, 2]
72
+ key = "any_key"
73
+ pref = round_trip_preference(key, value)
74
+ expect(pref.value).to eq value
75
+ end
76
+
77
+ end
78
+ end
79
+
80
+ end
@@ -0,0 +1,31 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV['RAILS_ENV'] ||= 'test'
3
+ require File.expand_path('../dummy/config/environment', __FILE__)
4
+ # Prevent database truncation if the environment is production
5
+ abort("The Rails environment is running in production mode!") if Rails.env.production?
6
+ require 'spec_helper'
7
+ require 'rspec/rails'
8
+ require 'factory_girl_rails'
9
+ require 'capybara/rspec'
10
+ require 'rspec/active_model/mocks'
11
+
12
+
13
+ ENGINE_RAILS_ROOT = File.join(File.dirname(__FILE__), '../')
14
+
15
+ Dir[File.join(ENGINE_RAILS_ROOT, "spec/factories/**/*.rb")].each {|f| require f }
16
+ Dir[File.join(ENGINE_RAILS_ROOT, "spec/support/**/*.rb")].each {|f| require f }
17
+ Dir[File.join(ENGINE_RAILS_ROOT, "spec/concerns/**/*.rb")].each {|f| require f }
18
+
19
+
20
+ ActiveRecord::Migration.maintain_test_schema!
21
+
22
+ RSpec.configure do |config|
23
+ config.include FactoryGirl::Syntax::Methods
24
+ config.mock_with :rspec
25
+ config.use_transactional_fixtures = true
26
+ config.infer_spec_type_from_file_location!
27
+ config.filter_rails_from_backtrace!
28
+ config.before :each do
29
+ Rails.cache.clear
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+
4
+ SimpleCov.start do
5
+ minimum_coverage(75.0)
6
+ end
7
+
8
+ Coveralls.wear!
9
+
10
+ RSpec.configure do |config|
11
+ config.expect_with :rspec do |expectations|
12
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
13
+ end
14
+
15
+ config.mock_with :rspec do |mocks|
16
+ mocks.verify_partial_doubles = true
17
+ end
18
+ config.shared_context_metadata_behavior = :apply_to_host_groups
19
+ end
metadata ADDED
@@ -0,0 +1,227 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spreeference
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - hugomarquez
8
+ - Spree Commerce
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2017-02-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 5.0.1
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 5.0.1
28
+ - !ruby/object:Gem::Dependency
29
+ name: sqlite3
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: thin
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ description: application-wide and per model cached and persisted preferences
57
+ email:
58
+ - hugomarquez.dev@gmail.com
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - LICENSE.md
64
+ - README.md
65
+ - Rakefile
66
+ - app/models/spreeference/app_configuration.rb
67
+ - app/models/spreeference/application_record.rb
68
+ - app/models/spreeference/preference.rb
69
+ - config/routes.rb
70
+ - db/migrate/20170217094656_create_spreeference_preferences.rb
71
+ - lib/generators/spreeference/install_generator.rb
72
+ - lib/generators/templates/app_configuration.rb
73
+ - lib/generators/templates/spreeference.rb
74
+ - lib/spreeference.rb
75
+ - lib/spreeference/configuration.rb
76
+ - lib/spreeference/engine.rb
77
+ - lib/spreeference/environment.rb
78
+ - lib/spreeference/environment_extension.rb
79
+ - lib/spreeference/preferable.rb
80
+ - lib/spreeference/preferable_methods.rb
81
+ - lib/spreeference/scoped_store.rb
82
+ - lib/spreeference/store.rb
83
+ - lib/spreeference/version.rb
84
+ - lib/tasks/spreeference_tasks.rake
85
+ - spec/dummy/Rakefile
86
+ - spec/dummy/app/assets/config/manifest.js
87
+ - spec/dummy/app/assets/javascripts/application.js
88
+ - spec/dummy/app/assets/stylesheets/application.css
89
+ - spec/dummy/app/channels/application_cable/channel.rb
90
+ - spec/dummy/app/channels/application_cable/connection.rb
91
+ - spec/dummy/app/controllers/application_controller.rb
92
+ - spec/dummy/app/helpers/application_helper.rb
93
+ - spec/dummy/app/jobs/application_job.rb
94
+ - spec/dummy/app/models/app_configuration.rb
95
+ - spec/dummy/app/models/application_record.rb
96
+ - spec/dummy/app/views/layouts/application.html.erb
97
+ - spec/dummy/bin/bundle
98
+ - spec/dummy/bin/rails
99
+ - spec/dummy/bin/rake
100
+ - spec/dummy/bin/setup
101
+ - spec/dummy/bin/update
102
+ - spec/dummy/config.ru
103
+ - spec/dummy/config/application.rb
104
+ - spec/dummy/config/boot.rb
105
+ - spec/dummy/config/cable.yml
106
+ - spec/dummy/config/database.yml
107
+ - spec/dummy/config/environment.rb
108
+ - spec/dummy/config/environments/development.rb
109
+ - spec/dummy/config/environments/production.rb
110
+ - spec/dummy/config/environments/test.rb
111
+ - spec/dummy/config/initializers/application_controller_renderer.rb
112
+ - spec/dummy/config/initializers/backtrace_silencers.rb
113
+ - spec/dummy/config/initializers/cookies_serializer.rb
114
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
115
+ - spec/dummy/config/initializers/inflections.rb
116
+ - spec/dummy/config/initializers/mime_types.rb
117
+ - spec/dummy/config/initializers/new_framework_defaults.rb
118
+ - spec/dummy/config/initializers/session_store.rb
119
+ - spec/dummy/config/initializers/spreeference.rb
120
+ - spec/dummy/config/initializers/wrap_parameters.rb
121
+ - spec/dummy/config/locales/en.yml
122
+ - spec/dummy/config/puma.rb
123
+ - spec/dummy/config/routes.rb
124
+ - spec/dummy/config/secrets.yml
125
+ - spec/dummy/config/spring.rb
126
+ - spec/dummy/db/development.sqlite3
127
+ - spec/dummy/db/schema.rb
128
+ - spec/dummy/db/test.sqlite3
129
+ - spec/dummy/log/development.log
130
+ - spec/dummy/log/test.log
131
+ - spec/dummy/public/404.html
132
+ - spec/dummy/public/422.html
133
+ - spec/dummy/public/500.html
134
+ - spec/dummy/public/apple-touch-icon-precomposed.png
135
+ - spec/dummy/public/apple-touch-icon.png
136
+ - spec/dummy/public/favicon.ico
137
+ - spec/lib/spreeference/configuration_spec.rb
138
+ - spec/lib/spreeference/preferable_spec.rb
139
+ - spec/lib/spreeference/scoped_store_spec.rb
140
+ - spec/lib/spreeference/store_spec.rb
141
+ - spec/models/spreeference/preference_spec.rb
142
+ - spec/rails_helper.rb
143
+ - spec/spec_helper.rb
144
+ homepage: https://github.com/hugomarquez/spreeference
145
+ licenses:
146
+ - MIT
147
+ metadata: {}
148
+ post_install_message:
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubyforge_project:
164
+ rubygems_version: 2.5.1
165
+ signing_key:
166
+ specification_version: 4
167
+ summary: application-wide and per model cached and persisted preferences
168
+ test_files:
169
+ - spec/dummy/app/assets/config/manifest.js
170
+ - spec/dummy/app/assets/javascripts/application.js
171
+ - spec/dummy/app/assets/stylesheets/application.css
172
+ - spec/dummy/app/channels/application_cable/channel.rb
173
+ - spec/dummy/app/channels/application_cable/connection.rb
174
+ - spec/dummy/app/controllers/application_controller.rb
175
+ - spec/dummy/app/helpers/application_helper.rb
176
+ - spec/dummy/app/jobs/application_job.rb
177
+ - spec/dummy/app/models/app_configuration.rb
178
+ - spec/dummy/app/models/application_record.rb
179
+ - spec/dummy/app/views/layouts/application.html.erb
180
+ - spec/dummy/bin/bundle
181
+ - spec/dummy/bin/rails
182
+ - spec/dummy/bin/rake
183
+ - spec/dummy/bin/setup
184
+ - spec/dummy/bin/update
185
+ - spec/dummy/config/application.rb
186
+ - spec/dummy/config/boot.rb
187
+ - spec/dummy/config/cable.yml
188
+ - spec/dummy/config/database.yml
189
+ - spec/dummy/config/environment.rb
190
+ - spec/dummy/config/environments/development.rb
191
+ - spec/dummy/config/environments/production.rb
192
+ - spec/dummy/config/environments/test.rb
193
+ - spec/dummy/config/initializers/application_controller_renderer.rb
194
+ - spec/dummy/config/initializers/backtrace_silencers.rb
195
+ - spec/dummy/config/initializers/cookies_serializer.rb
196
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
197
+ - spec/dummy/config/initializers/inflections.rb
198
+ - spec/dummy/config/initializers/mime_types.rb
199
+ - spec/dummy/config/initializers/new_framework_defaults.rb
200
+ - spec/dummy/config/initializers/session_store.rb
201
+ - spec/dummy/config/initializers/spreeference.rb
202
+ - spec/dummy/config/initializers/wrap_parameters.rb
203
+ - spec/dummy/config/locales/en.yml
204
+ - spec/dummy/config/puma.rb
205
+ - spec/dummy/config/routes.rb
206
+ - spec/dummy/config/secrets.yml
207
+ - spec/dummy/config/spring.rb
208
+ - spec/dummy/config.ru
209
+ - spec/dummy/db/development.sqlite3
210
+ - spec/dummy/db/schema.rb
211
+ - spec/dummy/db/test.sqlite3
212
+ - spec/dummy/log/development.log
213
+ - spec/dummy/log/test.log
214
+ - spec/dummy/public/404.html
215
+ - spec/dummy/public/422.html
216
+ - spec/dummy/public/500.html
217
+ - spec/dummy/public/apple-touch-icon-precomposed.png
218
+ - spec/dummy/public/apple-touch-icon.png
219
+ - spec/dummy/public/favicon.ico
220
+ - spec/dummy/Rakefile
221
+ - spec/lib/spreeference/configuration_spec.rb
222
+ - spec/lib/spreeference/preferable_spec.rb
223
+ - spec/lib/spreeference/scoped_store_spec.rb
224
+ - spec/lib/spreeference/store_spec.rb
225
+ - spec/models/spreeference/preference_spec.rb
226
+ - spec/rails_helper.rb
227
+ - spec/spec_helper.rb