cloudrider 0.3.0 → 0.3.20

Sign up to get free protection for your applications and to get access to all the features.
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