cloudrider 0.3.0 → 0.3.20

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 (227) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -1
  3. data/cloudrider.gemspec +1 -0
  4. data/generica/.gitignore +18 -0
  5. data/generica/Gemfile +8 -1
  6. data/generica/Gemfile.lock +3 -0
  7. data/generica/app/assets/javascripts/apiv1.js.ls +6 -1
  8. data/generica/app/assets/javascripts/components/offers-summary.js.em +2 -0
  9. data/generica/app/assets/javascripts/components/picture-chunk.js.em +17 -0
  10. data/generica/app/assets/javascripts/components/pictures-group.js.em +21 -0
  11. data/generica/app/assets/javascripts/components/search-and-filter.js.em +4 -0
  12. data/generica/app/assets/javascripts/components/site-nav.js.em +5 -1
  13. data/generica/app/assets/javascripts/components/taggable-field.js.em +28 -0
  14. data/generica/app/assets/javascripts/components/tree/taxon-li.js.em +6 -2
  15. data/generica/app/assets/javascripts/controllers/index_controller.js.em +19 -2
  16. data/generica/app/assets/javascripts/controllers/modals/login_controller.js.em +23 -9
  17. data/generica/app/assets/javascripts/controllers/modals/register_controller.js.em +24 -0
  18. data/generica/app/assets/javascripts/controllers/products/index_controller.js.em +23 -13
  19. data/generica/app/assets/javascripts/controllers/products/product/offers/new_controller.js.em +17 -0
  20. data/generica/app/assets/javascripts/controllers/users/offers/index_controller.js.em +10 -0
  21. data/generica/app/assets/javascripts/controllers/users/product/edit_controller.js.em +31 -0
  22. data/generica/app/assets/javascripts/controllers/users/products/index_controller.js.em +8 -0
  23. data/generica/app/assets/javascripts/controllers/users/products/new_controller.js.em +22 -0
  24. data/generica/app/assets/javascripts/controllers/users/products/slice_controller.js.em +4 -0
  25. data/generica/app/assets/javascripts/helpers/filte_previewer.js.ls +21 -0
  26. data/generica/app/assets/javascripts/helpers/listing_picture.js.em +17 -0
  27. data/generica/app/assets/javascripts/models/offer.js.em +9 -8
  28. data/generica/app/assets/javascripts/models/user.js.em +12 -0
  29. data/generica/app/assets/javascripts/models/users/product.js.em +12 -0
  30. data/generica/app/assets/javascripts/routes/application_route.js.em +10 -2
  31. data/generica/app/assets/javascripts/routes/products/index_route.js.em +23 -2
  32. data/generica/app/assets/javascripts/routes/products/product/offers/new_route.js.em +18 -0
  33. data/generica/app/assets/javascripts/routes/users/offers/index_route.js.em +1 -0
  34. data/generica/app/assets/javascripts/routes/users/product_route.js.em +3 -0
  35. data/generica/app/assets/javascripts/routes/users/products/index_route.js.em +3 -0
  36. data/generica/app/assets/javascripts/routes/users/products/new_route.js.em +3 -0
  37. data/generica/app/assets/javascripts/templates/admin/product/edit.emblem +2 -0
  38. data/generica/app/assets/javascripts/templates/admin/products/_form-core.emblem +44 -0
  39. data/generica/app/assets/javascripts/templates/admin/products/new.emblem +4 -42
  40. data/generica/app/assets/javascripts/templates/components/offers-summary.emblem +9 -0
  41. data/generica/app/assets/javascripts/templates/components/picture-chunk.emblem +9 -0
  42. data/generica/app/assets/javascripts/templates/components/pictures-group.emblem +6 -0
  43. data/generica/app/assets/javascripts/templates/components/search-and-filter.emblem +5 -1
  44. data/generica/app/assets/javascripts/templates/components/taggable-field.emblem +1 -0
  45. data/generica/app/assets/javascripts/templates/modals/register.emblem +57 -0
  46. data/generica/app/assets/javascripts/templates/products/product/offers/_anonymous-form.emblem +11 -0
  47. data/generica/app/assets/javascripts/templates/products/product/offers/_offer-form.emblem +55 -0
  48. data/generica/app/assets/javascripts/templates/products/product/offers/new.emblem +37 -0
  49. data/generica/app/assets/javascripts/templates/products/product/show.emblem +26 -1
  50. data/generica/app/assets/javascripts/templates/users.emblem +24 -0
  51. data/generica/app/assets/javascripts/templates/users/index.emblem +3 -0
  52. data/generica/app/assets/javascripts/templates/users/offers/index.emblem +25 -0
  53. data/generica/app/assets/javascripts/templates/users/offers/slice.emblem +31 -0
  54. data/generica/app/assets/javascripts/templates/users/product/edit.emblem +82 -0
  55. data/generica/app/assets/javascripts/templates/users/products/index.emblem +22 -0
  56. data/generica/app/assets/javascripts/templates/users/products/new.emblem +28 -0
  57. data/generica/app/assets/javascripts/templates/users/products/slice.emblem +27 -0
  58. data/generica/app/assets/stylesheets/apiv1/_application.css.scss +4 -0
  59. data/generica/app/assets/stylesheets/apiv1/components/_offers-summary.css.scss +20 -0
  60. data/generica/app/assets/stylesheets/apiv1/components/_pictures-group.css.scss +32 -0
  61. data/generica/app/assets/stylesheets/apiv1/components/_taggable-field.css.scss +32 -0
  62. data/generica/app/assets/stylesheets/apiv1/products/product/offers/_new.css.scss +8 -0
  63. data/generica/app/controllers/admin/base_controller.rb +1 -1
  64. data/generica/app/controllers/admin/sessions/destroy_controller.rb +16 -0
  65. data/generica/app/controllers/apiv1/offers/create_controller.rb +30 -0
  66. data/generica/app/controllers/apiv1/offers/index_controller.rb +22 -0
  67. data/generica/app/controllers/apiv1/offers/show_controller.rb +12 -0
  68. data/generica/app/controllers/apiv1/products/destroy_controller.rb +6 -0
  69. data/generica/app/controllers/apiv1/products/index_controller.rb +8 -2
  70. data/generica/app/controllers/apiv1/products/show_controller.rb +7 -3
  71. data/generica/app/controllers/apiv1/taxons/index_controller.rb +5 -1
  72. data/generica/app/controllers/apiv1/users/create_controller.rb +17 -0
  73. data/generica/app/controllers/apiv1/users/show_controller.rb +12 -0
  74. data/generica/app/controllers/apiv1/users_controller.rb +9 -0
  75. data/generica/app/controllers/application_controller.rb +3 -0
  76. data/generica/app/controllers/users/offers/create_controller.rb +26 -0
  77. data/generica/app/controllers/users/products/create_controller.rb +26 -0
  78. data/generica/app/controllers/users/products/update_controller.rb +35 -0
  79. data/generica/app/mailers/apiv1/aggregate_mailer.rb +13 -0
  80. data/generica/app/mailers/apiv1/aggregate_mailer/summary_context.rb +121 -0
  81. data/generica/app/mailers/apiv1/notifications_mailer.rb +19 -0
  82. data/generica/app/mailers/apiv1/notifications_mailer/new_offer_context.rb +53 -0
  83. data/generica/app/models/admin/user.rb +43 -2
  84. data/generica/app/models/apiv1/attachment.rb +2 -0
  85. data/generica/app/models/apiv1/email_object.rb +35 -0
  86. data/generica/app/models/apiv1/email_request.rb +107 -0
  87. data/generica/app/models/apiv1/offer_message.rb +53 -0
  88. data/generica/app/models/apiv1/offer_postboy.rb +33 -0
  89. data/generica/app/models/apiv1/picture.rb +2 -0
  90. data/generica/app/models/apiv1/product.rb +28 -6
  91. data/generica/app/models/apiv1/products/offer_message_factory.rb +13 -0
  92. data/generica/app/models/apiv1/products_machine.rb +8 -2
  93. data/generica/app/models/apiv1/taxon.rb +1 -1
  94. data/generica/app/models/apiv1/users/product_factory.rb +22 -0
  95. data/generica/app/models/apiv1/users/product_relationship.rb +19 -0
  96. data/generica/app/models/users/products/offer_factory.rb +40 -0
  97. data/generica/app/varissets/javascripts/templates/application.emblem.erb +2 -2
  98. data/generica/app/varissets/javascripts/templates/components/offers-overview.emblem.erb +1 -0
  99. data/generica/app/varissets/javascripts/templates/components/search-and-filter.emblem.erb +33 -0
  100. data/generica/app/varissets/javascripts/templates/components/site-nav.emblem.erb +8 -0
  101. data/generica/app/varissets/javascripts/templates/components/taggable-field.emblem.erb +11 -0
  102. data/generica/app/varissets/javascripts/templates/modals/login.emblem.erb +36 -0
  103. data/generica/app/varissets/javascripts/templates/products.emblem.erb +4 -0
  104. data/generica/app/varissets/javascripts/templates/products/index.emblem.erb +17 -0
  105. data/generica/app/varissets/javascripts/templates/products/product/offers/_anonymous-form.emblem.erb +11 -0
  106. data/generica/app/varissets/javascripts/templates/products/product/offers/_offer-form.emblem.erb +55 -0
  107. data/generica/app/varissets/javascripts/templates/products/product/offers/new.emblem.erb +37 -0
  108. data/generica/app/varissets/javascripts/templates/products/product/show.emblem.erb +108 -0
  109. data/generica/app/varissets/stylesheets/apiv1/components/_offers-overview.css.scss.erb +3 -0
  110. data/generica/app/varissets/stylesheets/apiv1/components/_offers_overview.css.scss.erb +3 -0
  111. data/generica/app/varissets/stylesheets/apiv1/components/_search-and-filter.css.scss.erb +15 -0
  112. data/generica/app/varissets/stylesheets/apiv1/components/_site-footer.css.scss.erb +23 -0
  113. data/generica/app/varissets/stylesheets/apiv1/components/_taggable-field.css.scss.erb +32 -0
  114. data/generica/app/views/apiv1/home/index.html.haml +3 -1
  115. data/generica/app/views/apiv1/layouts/application.html.haml +37 -2
  116. data/generica/config/{database.yml.erb → database.yml.str} +3 -3
  117. data/generica/config/email.yml +11 -0
  118. data/generica/config/email_slave.god +9 -0
  119. data/generica/config/initializers/premailer.rb +1 -0
  120. data/generica/config/initializers/squash.rb.erb +3 -0
  121. data/generica/config/nginx.conf.erb +4 -4
  122. data/generica/config/routes.rb +14 -0
  123. data/generica/db/migrate/20141114213427_add_user_rank_to_admin_users.rb +9 -0
  124. data/generica/db/migrate/20141114225019_create_apiv1_users_products.rb +9 -0
  125. data/generica/db/migrate/20141116053522_create_apiv1_offer_messages.rb +16 -0
  126. data/generica/db/migrate/20141116235011_add_deleted_at_to_apiv1_products.rb +5 -0
  127. data/generica/db/migrate/20141116235209_add_deleted_at_to_apiv1_offer_messages.rb +5 -0
  128. data/generica/db/migrate/20141116235651_add_deleted_at_to_apiv1_pictures.rb +5 -0
  129. data/generica/db/migrate/20141116235808_add_deleted_at_to_apiv1_attachments.rb +5 -0
  130. data/generica/db/migrate/20141127230304_create_apiv1_email_requests.rb +16 -0
  131. data/generica/db/migrate/20141127230455_create_apiv1_email_objects.rb +11 -0
  132. data/generica/lib/generica/assets_unretardifier.rb +32 -0
  133. data/generica/lib/generica/email_slave.rb +92 -0
  134. data/generica/lib/tasks/email_slave.rake +11 -0
  135. data/generica/lib/tasks/production.rake +1 -1
  136. data/generica/public/tests/bermese.jpg +0 -0
  137. data/generica/public/tests/chow.jpg +0 -0
  138. data/generica/public/tests/malamute.jpg +0 -0
  139. data/generica/public/tests/malamute2.JPG +0 -0
  140. data/generica/spec/controllers/apiv1/users/create_controller_spec.rb +17 -0
  141. data/generica/spec/controllers/users/products/create_controller_spec.rb +31 -0
  142. data/generica/spec/mailers/apiv1/aggregate_mailer_spec.rb +29 -0
  143. data/generica/spec/models/apiv1/email_request_spec.rb +4 -0
  144. data/generica/spec/models/apiv1/offer_postboy_spec.rb +22 -0
  145. data/generica/spec/models/apiv1/product_spec.rb +1 -0
  146. data/generica/spec/models/apiv1/products/offer_message_factory_spec.rb +37 -0
  147. data/generica/spec/models/apiv1/products_machine_spec.rb +77 -0
  148. data/generica/spec/models/apiv1/users/product_factory_spec.rb +47 -0
  149. data/generica/spec/models/users/products/offer_factory_spec.rb +38 -0
  150. data/generica/test/mailers/.keep +0 -0
  151. data/generica/test/mailers/previews/apiv1/aggregate_preview.rb +6 -0
  152. data/generica/test/mailers/previews/apiv1/notifications_preview.rb +5 -0
  153. data/lib/cloudrider.rb +1 -1
  154. data/lib/cloudrider/apiv1/base.rb +2 -2
  155. data/lib/cloudrider/apiv1/login_modal_emblem.rb +25 -0
  156. data/lib/cloudrider/apiv1/offers_anonymous_form_partial_emblem.rb +12 -0
  157. data/lib/cloudrider/apiv1/offers_new_emblem.rb +15 -0
  158. data/lib/cloudrider/apiv1/offers_overview_component.rb +8 -0
  159. data/lib/cloudrider/apiv1/offers_overview_sass.rb +8 -0
  160. data/lib/cloudrider/apiv1/product_show_emblem.rb +31 -0
  161. data/lib/cloudrider/apiv1/products_emblem.rb +11 -0
  162. data/lib/cloudrider/apiv1/products_index_emblem.rb +14 -0
  163. data/lib/cloudrider/apiv1/search_and_filter_component.rb +11 -0
  164. data/lib/cloudrider/apiv1/search_and_filter_sass.rb +11 -0
  165. data/lib/cloudrider/apiv1/site_footer_component.rb +7 -7
  166. data/lib/cloudrider/apiv1/site_footer_sass.rb +9 -0
  167. data/lib/cloudrider/application_commander.rb +46 -34
  168. data/lib/cloudrider/backend_commander.rb +15 -9
  169. data/lib/cloudrider/protofile.rb +18 -2
  170. data/lib/cloudrider/protosite.example.json +26 -0
  171. data/lib/cloudrider/protosite.rb +66 -0
  172. data/lib/cloudrider/serverside/base.rb +2 -2
  173. data/lib/cloudrider/serverside/database_yaml.rb +9 -4
  174. data/lib/cloudrider/serverside/nginx_conf.rb +7 -2
  175. data/lib/cloudrider/serverside/squash_ruby.rb +14 -0
  176. data/lib/cloudrider/serverside/unicorn_conf_ruby.rb +2 -1
  177. data/lib/cloudrider/version.rb +1 -1
  178. data/lib/cloudrider/web_firm.rb +16 -0
  179. data/lib/cloudrider/web_firm/component_architect.rb +23 -0
  180. data/lib/cloudrider/web_firm/page_designer.rb +13 -0
  181. data/lib/cloudrider/web_firm/project_lead.rb +30 -0
  182. data/lib/cloudrider/web_firm/scumbag_engineer.rb +40 -0
  183. data/lib/cloudrider/web_firm/support_intern.rb +113 -0
  184. data/lib/generators/cloudrider/server/server_generator.rb +4 -8
  185. data/lib/generators/cloudrider/website/website_generator.rb +25 -0
  186. data/spec/cloudrider/protosite_spec.rb +63 -0
  187. data/vanilla/.bowerrc +4 -0
  188. data/vanilla/.editorconfig +33 -0
  189. data/vanilla/.ember-cli +9 -0
  190. data/vanilla/.gitignore +17 -0
  191. data/vanilla/.jshintrc +32 -0
  192. data/vanilla/.travis.yml +16 -0
  193. data/vanilla/Brocfile.js +20 -0
  194. data/vanilla/README.md +51 -0
  195. data/vanilla/app/app.js +16 -0
  196. data/vanilla/app/components/.gitkeep +0 -0
  197. data/vanilla/app/controllers/.gitkeep +0 -0
  198. data/vanilla/app/controllers/admin.coffee +5 -0
  199. data/vanilla/app/helpers/.gitkeep +0 -0
  200. data/vanilla/app/index.html +21 -0
  201. data/vanilla/app/models/.gitkeep +0 -0
  202. data/vanilla/app/router.js +11 -0
  203. data/vanilla/app/routes/.gitkeep +0 -0
  204. data/vanilla/app/styles/.gitkeep +0 -0
  205. data/vanilla/app/styles/app.css +3 -0
  206. data/vanilla/app/templates/.gitkeep +0 -0
  207. data/vanilla/app/templates/application.hbs +3 -0
  208. data/vanilla/app/templates/components/.gitkeep +0 -0
  209. data/vanilla/app/views/.gitkeep +0 -0
  210. data/vanilla/bower.json +17 -0
  211. data/vanilla/config/environment.js +47 -0
  212. data/vanilla/package.json +39 -0
  213. data/vanilla/public/.gitkeep +0 -0
  214. data/vanilla/public/crossdomain.xml +15 -0
  215. data/vanilla/public/robots.txt +3 -0
  216. data/vanilla/testem.json +11 -0
  217. data/vanilla/tests/.jshintrc +74 -0
  218. data/vanilla/tests/helpers/resolver.js +11 -0
  219. data/vanilla/tests/helpers/start-app.js +25 -0
  220. data/vanilla/tests/index.html +45 -0
  221. data/vanilla/tests/test-helper.js +12 -0
  222. data/vanilla/tests/unit/.gitkeep +0 -0
  223. data/vanilla/tests/unit/controllers/admin-test.coffee +12 -0
  224. data/vanilla/vendor/.gitkeep +0 -0
  225. metadata +189 -5
  226. data/generica/app/views/layouts/application.html.erb +0 -14
  227. data/lib/cloudrider/master_context.rb +0 -105
@@ -0,0 +1,11 @@
1
+ namespace :email_slave do
2
+ desc "checks the email job queue for emails that require sending, batches them together, and sends them off"
3
+ task work_the_queue: :environment do
4
+ require "generica/email_slave"
5
+ puts "begin dispatching emails..."
6
+ Generica::EmailSlave.new.dispatch_emails!
7
+ puts "finished"
8
+ sleep 1
9
+ end
10
+
11
+ end
@@ -8,8 +8,8 @@ namespace :production do
8
8
  desc "These tasks should be run everytime you restart the server"
9
9
  task on_restart: :environment do
10
10
  Rake::Task["production:image_preload"].invoke
11
- Rake::Task["assets:clobber"].invoke
12
11
  Rake::Task["assets:precompile"].invoke
12
+ Rake::Task["assets:clean"].invoke
13
13
  Rake::Task["assets:unretardify"].invoke
14
14
  Rake::Task["elasticsearch:simple_import"].invoke
15
15
  end
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,17 @@
1
+ require 'rails_helper'
2
+
3
+ describe Apiv1::Users::CreateController do
4
+ let(:create) { post :create, user: @user_params }
5
+ before do
6
+ @user_params = {
7
+ email: 'dogs_are_furry@huskies.com',
8
+ password: 'asdf123',
9
+ company_name: 'Doggy Company'
10
+ }
11
+ end
12
+ context 'change' do
13
+ subject { -> { create } }
14
+ specify { should change(Admin::User, :count).by 1 }
15
+ specify { should change(controller, :current_user).from(nil) }
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ require 'rails_helper'
2
+
3
+ describe Users::Products::CreateController do
4
+ let(:user) { Admin::UserFactory.mock }
5
+ let(:create) { post :create, users_product: @product_params }
6
+ before { controller.auto_login user }
7
+ context 'creating' do
8
+ let(:taxon) { Apiv1::TaxonFactory.material }
9
+ let(:picture) { Apiv1::PictureFactory.rack_file }
10
+ let(:attachment) { Apiv1::PictureFactory.rack_file }
11
+ before do
12
+ @taxon_params = { "0" => taxon.id }
13
+ @picture_params = { "0" => picture }
14
+ @attachment_params = { "0" => attachment }
15
+ @product_params = Apiv1::ProductFactory.attributes.merge taxons: @taxon_params,
16
+ pictures: @picture_params,
17
+ attachments: @attachment_params
18
+ end
19
+ context 'enviroment' do
20
+ subject { controller.current_user }
21
+ specify { should be_a Admin::User }
22
+ specify { should be_persisted }
23
+ end
24
+ context 'changes' do
25
+ subject { -> { create } }
26
+ specify { should change(Apiv1::Product, :count).by 1 }
27
+ specify { should change(Apiv1::Users::ProductRelationship, :count).by 1 }
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Apiv1::AggregateMailer, type: :mailer do
4
+ describe "summary" do
5
+ let(:user) { Admin::UserFactory.mock }
6
+ let(:owner) { Admin::UserFactory.mock }
7
+ let(:product) { Apiv1::ProductFactory.new.create }
8
+ before do
9
+ product.update user: owner
10
+ @offer_params = {
11
+ product_id: product.id,
12
+ price_terms: "Are you feeling lucky, punk?",
13
+ notes: "Nothing to say here"
14
+ }
15
+ end
16
+ let(:offer) { Users::Products::OfferFactory.new(user, @offer_params).tap(&:satisfy_specifications?).tap(&:save!).offer }
17
+ let(:new_offer) { Apiv1::NotificationsMailer.new_offer offer }
18
+ let(:emails) { [new_offer, new_offer, new_offer] }
19
+ let(:mail) { Apiv1::AggregateMailer.summary emails }
20
+ context 'subject' do
21
+ subject { mail.subject }
22
+ specify { should eq "Update: 3 new offers" }
23
+ end
24
+ context 'to' do
25
+ subject { mail.to }
26
+ specify { should eq new_offer.to }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,4 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Apiv1::EmailRequest do
4
+ end
@@ -0,0 +1,22 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.describe Apiv1::OfferPostboy do
4
+ let(:user) { Admin::UserFactory.mock }
5
+ let(:owner) { Admin::UserFactory.mock }
6
+ let(:product) { Apiv1::ProductFactory.new.create }
7
+ before do
8
+ product.update user: owner
9
+ @offer_params = {
10
+ product_id: product.id,
11
+ price_terms: "Are you feeling lucky, punk?",
12
+ notes: "Nothing to say here"
13
+ }
14
+ end
15
+ let(:offer) { Users::Products::OfferFactory.new(user, @offer_params).tap(&:satisfy_specifications?).tap(&:save!).offer }
16
+ let(:postboy) { described_class.new offer }
17
+ context '#request_work!' do
18
+ subject { -> { postboy.request_work! } }
19
+ specify { should change(Apiv1::EmailRequest, :count).by 1 }
20
+ specify { should change(Apiv1::EmailObject, :count).by 1 }
21
+ end
22
+ end
@@ -14,6 +14,7 @@
14
14
  # created_at :datetime
15
15
  # updated_at :datetime
16
16
  # showcase_order :integer
17
+ # deleted_at :datetime
17
18
  #
18
19
 
19
20
  require 'rails_helper'
@@ -0,0 +1,37 @@
1
+ require 'rails_helper'
2
+
3
+ describe Apiv1::Products::OfferMessageFactory do
4
+ let(:factory) { described_class.new @params }
5
+ let(:product) { Apiv1::ProductFactory.new.create }
6
+ before do
7
+ @params = {
8
+ product_id: product.id,
9
+ from_company: "Buyer Co.",
10
+ sender_email: "thing@amythas.co",
11
+ price_terms: "Elsa Greer Knew her way about",
12
+ phone_number: "5555555",
13
+ contact_person: "Crail's Wife",
14
+ company_address: "Jealous as hell",
15
+ message: "I mention all this"
16
+ }
17
+ end
18
+ context 'satisfy_specifications?' do
19
+ subject { factory }
20
+ specify { should be_satisfy_specification }
21
+ end
22
+ context 'error hash' do
23
+ before { factory.satisfy_specifications? }
24
+ subject { factory.error_hash }
25
+ specify { should be_blank }
26
+ end
27
+ context 'creation' do
28
+ before { factory.satisfy_specifications? }
29
+ subject { -> { factory.save! } }
30
+ specify { should change(Apiv1::OfferMessage, :count).by 1 }
31
+ end
32
+ context 'relationship' do
33
+ before { factory.satisfy_specifications?; factory.save! }
34
+ subject { factory.send("_offer").product }
35
+ specify { should eq product }
36
+ end
37
+ end
@@ -0,0 +1,77 @@
1
+ require 'rails_helper'
2
+
3
+ describe Apiv1::ProductsMachine do
4
+ let(:material_taxon) { Apiv1::TaxonFactory.material }
5
+ let(:location_taxon) { Apiv1::TaxonFactory.location }
6
+ let(:quality_taxon) { Apiv1::TaxonFactory.quality }
7
+ let(:form_taxon) { Apiv1::TaxonFactory.form }
8
+ let(:machine) { described_class.new @params }
9
+
10
+ let(:hdpe) { Apiv1::Product.new @hdpe_params }
11
+ let(:ldpe) { Apiv1::Product.new @ldpe_params }
12
+ let(:pet) { Apiv1::Product.new @pet_params }
13
+
14
+ before do
15
+ @hdpe_params = {
16
+ sku: Faker::Name.first_name,
17
+ material: "HDPE crap",
18
+ price: "33.1 USD / pound FAS Los Angeles",
19
+ amount: "434 pounds",
20
+ place: "Los Angeles Port",
21
+ others: "some stuff",
22
+ taxons: [material_taxon, location_taxon, quality_taxon]
23
+ }
24
+ @ldpe_params = {
25
+ sku: Faker::Name.first_name,
26
+ material: "LDPE junk",
27
+ price: "33.1 USD / pound FAS Los Angeles",
28
+ amount: "434 pounds",
29
+ place: "Los Angeles Port",
30
+ others: "some stuff",
31
+ taxons: [material_taxon]
32
+ }
33
+ @pet_params = {
34
+ sku: Faker::Name.first_name,
35
+ material: "PET bottle",
36
+ price: "33.1 USD / pound FAS Los Angeles",
37
+ amount: "434 pounds",
38
+ place: "Los Angeles Port",
39
+ others: "some stuff"
40
+ }
41
+ @taxons = [material_taxon, location_taxon, quality_taxon, form_taxon]
42
+ @products = [hdpe, ldpe, pet]
43
+ @products.map do |product|
44
+ product.pictures.new pic: Apiv1::PictureFactory.rack_file
45
+ end
46
+ @products.map(&:save!)
47
+ end
48
+ context '#taxon intersection' do
49
+ before do
50
+ @params = { taxons: [material_taxon.id, location_taxon.id] }
51
+ end
52
+ subject { machine.products }
53
+ specify { should eq [hdpe] }
54
+ end
55
+ context 'one taxon' do
56
+ before do
57
+ @params = { taxons: [material_taxon.id] }
58
+ end
59
+ context 'count' do
60
+ subject { machine.products.count }
61
+ specify { should eq 2 }
62
+ end
63
+ context 'products' do
64
+ subject { machine.products }
65
+ specify { should include hdpe }
66
+ specify { should include ldpe }
67
+ specify { should_not include pet }
68
+ end
69
+ end
70
+ context 'no params' do
71
+ before do
72
+ @params = {}
73
+ end
74
+ subject { machine.products.sort }
75
+ specify { should eq @products.sort }
76
+ end
77
+ end
@@ -0,0 +1,47 @@
1
+ require 'rails_helper'
2
+
3
+ describe Apiv1::Users::ProductFactory do
4
+ let(:user) { Admin::UserFactory.mock }
5
+ let(:taxon) { Apiv1::TaxonFactory.material }
6
+ let(:picture) { Apiv1::PictureFactory.rack_file }
7
+ let(:attachment) { Apiv1::PictureFactory.rack_file }
8
+ let(:factory) { Apiv1::Users::ProductFactory.new user, @product_params }
9
+ before do
10
+ @taxon_params = { "0" => taxon.id }
11
+ @picture_params = { "0" => picture }
12
+ @attachment_params = { "0" => attachment }
13
+ @product_params = Apiv1::ProductFactory.attributes.merge taxons: @taxon_params,
14
+ pictures: @picture_params,
15
+ attachments: @attachment_params
16
+ end
17
+ context 'user' do
18
+ subject { user }
19
+ specify { should be_persisted }
20
+ end
21
+ context '_product' do
22
+ before { factory.satisfy_specifications? }
23
+ subject { factory.send '_product' }
24
+ specify { should be_a Apiv1::Product }
25
+ end
26
+ context 'user.products' do
27
+ before { factory.satisfy_specifications? && factory.save! }
28
+ let(:product) { factory.send "_product" }
29
+ subject { Admin::User.find(user.id).products }
30
+ specify { should include product }
31
+ end
32
+ context 'creations' do
33
+ before { factory.satisfy_specifications? }
34
+ subject { -> { factory.save! } }
35
+ specify { should change(Apiv1::Product, :count).by 1 }
36
+ specify { should change(Apiv1::Users::ProductRelationship, :count).by 1 }
37
+ end
38
+
39
+ context 'post-save' do
40
+ before do
41
+ factory.satisfy_specifications?
42
+ factory.save!
43
+ end
44
+ subject { Admin::User.find(user.id).products }
45
+ specify { should be_present }
46
+ end
47
+ end
@@ -0,0 +1,38 @@
1
+ require 'rails_helper'
2
+
3
+ describe Users::Products::OfferFactory do
4
+ let(:user) { Admin::UserFactory.mock }
5
+ let(:factory) { described_class.new user, @params }
6
+ let(:product) { Apiv1::ProductFactory.new.create }
7
+ before do
8
+ @params = {
9
+ product_id: product.id,
10
+ from_company: "Buyer Co.",
11
+ sender_email: "thing@amythas.co",
12
+ price_terms: "Elsa Greer Knew her way about",
13
+ phone_number: "5555555",
14
+ contact_person: "Crail's Wife",
15
+ company_address: "Jealous as hell",
16
+ message: "I mention all this"
17
+ }
18
+ end
19
+ context 'satisfy_specifications' do
20
+ subject { factory }
21
+ specify { should be_satisfy_specification }
22
+ end
23
+ context 'error hash' do
24
+ before { factory.satisfy_specifications? }
25
+ subject { factory.error_hash }
26
+ specify { should be_blank }
27
+ end
28
+ context 'creation' do
29
+ before { factory.satisfy_specifications? }
30
+ subject { -> { factory.save! } }
31
+ specify { should change(Apiv1::OfferMessage, :count).by 1 }
32
+ end
33
+ context 'relationship' do
34
+ before { factory.satisfy_specifications?; factory.save! }
35
+ subject { factory.send("_offer").product }
36
+ specify { should eq product }
37
+ end
38
+ end
File without changes
@@ -0,0 +1,6 @@
1
+ class Apiv1::AggregatePreview < ActionMailer::Preview
2
+ def summary
3
+ email = Apiv1::NotificationsMailer.new_offer Apiv1::OfferMessage.first
4
+ Apiv1::AggregateMailer.summary [email, email, email]
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class Apiv1::NotificationsPreview < ActionMailer::Preview
2
+ def new_offer
3
+ Apiv1::NotificationsMailer.new_offer Apiv1::OfferMessage.first
4
+ end
5
+ end
data/lib/cloudrider.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require "cloudrider/version"
2
2
  module Cloudrider
3
- require "cloudrider/application_commander"
3
+ Dir[File.join(__dir__, "cloudrider", "*.rb")].each { |f| require f }
4
4
  def self.root
5
5
  File.expand_path "../..", __FILE__
6
6
  end
@@ -1,8 +1,8 @@
1
1
  class Cloudrider::Apiv1::Base
2
2
  class UnknownFileExtension < StandardError; end
3
3
  class UnknownFamilyResidence < StandardError; end
4
- def initialize(style=nil)
5
- @style = style
4
+ def initialize(style: style, protosite: protosite)
5
+ @style, @protosite = style, protosite
6
6
  end
7
7
  def protofile
8
8
  Cloudrider::Protofile.new.tap do |p|
@@ -0,0 +1,25 @@
1
+ class Cloudrider::Apiv1::LoginModalEmblem < Cloudrider::Apiv1::Base
2
+ class Context
3
+ attr_accessor :login_style
4
+ def registerable?
5
+ case login_style.to_s
6
+ when "ecommerce", "registerable"
7
+ true
8
+ else
9
+ false
10
+ end
11
+ end
12
+ end
13
+ private
14
+ def _file_name
15
+ "login.emblem"
16
+ end
17
+ def _source_folder
18
+ "app/varissets/javascripts/templates/modals"
19
+ end
20
+ def _context
21
+ Context.new.tap do |c|
22
+ c.login_style = @style
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ class Cloudrider::Apiv1::OffersAnonymousFormPartialEmblem < Cloudrider::Apiv1::Base
2
+ class Context
3
+ end
4
+
5
+ private
6
+ def _file_name
7
+ "products/product/offers/_anonymous-form.emblem"
8
+ end
9
+ def _context
10
+ Context.new
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ class Cloudrider::Apiv1::OffersNewEmblem < Cloudrider::Apiv1::Base
2
+ class Context
3
+ def message_style
4
+ :top
5
+ end
6
+ end
7
+
8
+ private
9
+ def _file_name
10
+ "products/product/offers/new.emblem"
11
+ end
12
+ def _context
13
+ Context.new
14
+ end
15
+ end