nimbleshop_core 0.0.1.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (359) hide show
  1. data/README.md +13 -0
  2. data/Rakefile +15 -0
  3. data/app/assets/images/engines/nimbleshop_authorizedotnet/american_express.png +0 -0
  4. data/app/assets/images/engines/nimbleshop_authorizedotnet/authorize_net_big.png +0 -0
  5. data/app/assets/images/engines/nimbleshop_authorizedotnet/authorizedotnet_big.png +0 -0
  6. data/app/assets/images/engines/nimbleshop_authorizedotnet/discover.png +0 -0
  7. data/app/assets/images/engines/nimbleshop_authorizedotnet/mastercard.png +0 -0
  8. data/app/assets/images/engines/nimbleshop_authorizedotnet/visa.png +0 -0
  9. data/app/assets/images/engines/nimbleshop_cod/cod_small.png +0 -0
  10. data/app/assets/images/engines/nimbleshop_paypalwp/paypal_big.png +0 -0
  11. data/app/assets/images/engines/nimbleshop_paypalwp/paypal_small.png +0 -0
  12. data/app/assets/images/engines/nimbleshop_splitable/splitable.png +0 -0
  13. data/app/assets/images/engines/nimbleshop_splitable/splitable_big.png +0 -0
  14. data/app/assets/images/engines/nimbleshop_splitable/splitable_small.png +0 -0
  15. data/app/assets/javascripts/admin/products/edit.js.coffee +19 -0
  16. data/app/assets/javascripts/admin/shipping_methods/edit.js.coffee +6 -0
  17. data/app/assets/javascripts/admin.js +25 -0
  18. data/app/assets/javascripts/fadeout_success.js.coffee +2 -0
  19. data/app/assets/javascripts/payment_method.js.coffee +19 -0
  20. data/app/assets/javascripts/product-group-condition.js.coffee +33 -0
  21. data/app/assets/javascripts/remove_deletion_of_product_pictures.js.coffee +5 -0
  22. data/app/assets/javascripts/shipit.js.coffee +10 -0
  23. data/app/assets/javascripts/twitter_bootstrap.js.coffee +4 -0
  24. data/app/assets/stylesheets/admin.css +9 -0
  25. data/app/assets/stylesheets/admin_bootstrap_and_overrides.css.less +38 -0
  26. data/app/assets/stylesheets/admin_custom.css +104 -0
  27. data/app/assets/twitter/bootstrap/glyphicons-halflings-white.png +0 -0
  28. data/app/assets/twitter/bootstrap/glyphicons-halflings.png +0 -0
  29. data/app/controllers/admin/custom_fields_controller.rb +56 -0
  30. data/app/controllers/admin/link_groups_controller.rb +76 -0
  31. data/app/controllers/admin/main_controller.rb +9 -0
  32. data/app/controllers/admin/navigations_controller.rb +49 -0
  33. data/app/controllers/admin/orders_controller.rb +47 -0
  34. data/app/controllers/admin/payment_methods_controller.rb +26 -0
  35. data/app/controllers/admin/product_groups_controller.rb +70 -0
  36. data/app/controllers/admin/products_controller.rb +71 -0
  37. data/app/controllers/admin/shipments_controller.rb +19 -0
  38. data/app/controllers/admin/shipping_methods_controller.rb +93 -0
  39. data/app/controllers/admin/shipping_zones_controller.rb +62 -0
  40. data/app/controllers/admin/shops_controller.rb +33 -0
  41. data/app/controllers/admin_controller.rb +38 -0
  42. data/app/helpers/admin_helper.rb +83 -0
  43. data/app/helpers/nimbleshop_helper.rb +43 -0
  44. data/app/helpers/payment_method_helper.rb +52 -0
  45. data/app/mailers/admin_mailer.rb +22 -0
  46. data/app/mailers/mailer.rb +31 -0
  47. data/app/models/address.rb +69 -0
  48. data/app/models/country_shipping_zone.rb +36 -0
  49. data/app/models/creditcard.rb +95 -0
  50. data/app/models/custom_field.rb +8 -0
  51. data/app/models/custom_field_answer/field.rb +101 -0
  52. data/app/models/custom_field_answer.rb +17 -0
  53. data/app/models/line_item.rb +48 -0
  54. data/app/models/link.rb +3 -0
  55. data/app/models/link_group.rb +8 -0
  56. data/app/models/navigation.rb +7 -0
  57. data/app/models/order.rb +158 -0
  58. data/app/models/payment_method.rb +20 -0
  59. data/app/models/payment_transaction.rb +11 -0
  60. data/app/models/picture.rb +30 -0
  61. data/app/models/product.rb +76 -0
  62. data/app/models/product_group.rb +65 -0
  63. data/app/models/product_group_condition.rb +8 -0
  64. data/app/models/regional_shipping_zone.rb +25 -0
  65. data/app/models/shipment.rb +19 -0
  66. data/app/models/shipment_carrier.rb +3 -0
  67. data/app/models/shipping_cost_calculator.rb +9 -0
  68. data/app/models/shipping_method.rb +103 -0
  69. data/app/models/shipping_zone.rb +9 -0
  70. data/app/models/shop.rb +26 -0
  71. data/app/models/tax_calculator.rb +18 -0
  72. data/app/observers/order_observer.rb +53 -0
  73. data/app/uploaders/picture_uploader.rb +65 -0
  74. data/app/views/admin/custom_fields/_form.html.erb +45 -0
  75. data/app/views/admin/custom_fields/edit.html.erb +7 -0
  76. data/app/views/admin/custom_fields/index.html.erb +31 -0
  77. data/app/views/admin/custom_fields/new.html.erb +7 -0
  78. data/app/views/admin/link_groups/_form.html.erb +31 -0
  79. data/app/views/admin/link_groups/_link_group.html.erb +50 -0
  80. data/app/views/admin/link_groups/_link_group_title.html.erb +5 -0
  81. data/app/views/admin/link_groups/edit.html.erb +8 -0
  82. data/app/views/admin/link_groups/index.html.erb +29 -0
  83. data/app/views/admin/link_groups/new.html.erb +9 -0
  84. data/app/views/admin/mailer/new_order_notification.text.erb +31 -0
  85. data/app/views/admin/main/index.html.erb +5 -0
  86. data/app/views/admin/navigations/new.html.erb +29 -0
  87. data/app/views/admin/orders/_line_item.html.erb +11 -0
  88. data/app/views/admin/orders/_line_items.html.erb +39 -0
  89. data/app/views/admin/orders/_payment_info.html.erb +20 -0
  90. data/app/views/admin/orders/_shipping_info.html.erb +40 -0
  91. data/app/views/admin/orders/index.html.erb +33 -0
  92. data/app/views/admin/orders/show.html.erb +40 -0
  93. data/app/views/admin/payment_methods/index.html.erb +6 -0
  94. data/app/views/admin/product_groups/_condition.html.mustache +20 -0
  95. data/app/views/admin/product_groups/_form.html.erb +72 -0
  96. data/app/views/admin/product_groups/edit.html.erb +7 -0
  97. data/app/views/admin/product_groups/index.html.erb +30 -0
  98. data/app/views/admin/product_groups/new.html.erb +7 -0
  99. data/app/views/admin/product_groups/show.html.erb +9 -0
  100. data/app/views/admin/products/_custom_field_answer.html.erb +9 -0
  101. data/app/views/admin/products/_form.html.erb +69 -0
  102. data/app/views/admin/products/_handle_pictures.html.erb +32 -0
  103. data/app/views/admin/products/_pictures.html.erb +33 -0
  104. data/app/views/admin/products/edit.html.erb +26 -0
  105. data/app/views/admin/products/index.html.erb +34 -0
  106. data/app/views/admin/products/new.html.erb +9 -0
  107. data/app/views/admin/shipping_methods/_form.html.erb +58 -0
  108. data/app/views/admin/shipping_methods/_shipping_method.html.erb +31 -0
  109. data/app/views/admin/shipping_methods/edit.html.erb +18 -0
  110. data/app/views/admin/shipping_methods/new.html.erb +7 -0
  111. data/app/views/admin/shipping_zones/_form.html.erb +31 -0
  112. data/app/views/admin/shipping_zones/_shipping_method.html.erb +13 -0
  113. data/app/views/admin/shipping_zones/_shipping_zone.html.erb +47 -0
  114. data/app/views/admin/shipping_zones/edit.html.erb +8 -0
  115. data/app/views/admin/shipping_zones/index.html.erb +16 -0
  116. data/app/views/admin/shipping_zones/new.html.erb +8 -0
  117. data/app/views/admin/shops/edit.html.erb +119 -0
  118. data/app/views/layouts/_admin_footer.html.erb +23 -0
  119. data/app/views/layouts/_admin_sidebar.html.erb +0 -0
  120. data/app/views/layouts/_container.html.erb +33 -0
  121. data/app/views/layouts/_top_nav_bar.html.erb +30 -0
  122. data/app/views/layouts/admin.html.erb +35 -0
  123. data/app/views/layouts/payment_method.html.erb +12 -0
  124. data/app/views/mailer/order_notification_to_buyer.text.erb +31 -0
  125. data/app/views/mailer/shipment_notification_to_buyer.text.erb +34 -0
  126. data/config/initializers/001_settings_application.rb +10 -0
  127. data/config/initializers/002_load_core_extensions.rb +8 -0
  128. data/config/initializers/field_with_error.rb +2 -0
  129. data/config/initializers/strip_and_nullify.rb +13 -0
  130. data/config/initializers/time_formats.rb +1 -0
  131. data/config/locales/en.yml +61 -0
  132. data/config/routes.rb +56 -0
  133. data/db/development.sqlite3 +0 -0
  134. data/db/migrate/20111022144421_create_product_groups.rb +12 -0
  135. data/db/migrate/20111022144426_create_products.rb +16 -0
  136. data/db/migrate/20111022144653_create_orders.rb +21 -0
  137. data/db/migrate/20111022144725_create_line_items.rb +15 -0
  138. data/db/migrate/20111022234951_create_shops.rb +20 -0
  139. data/db/migrate/20111026193227_create_link_groups.rb +12 -0
  140. data/db/migrate/20111026193435_create_navigations.rb +10 -0
  141. data/db/migrate/20111031135810_create_links.rb +10 -0
  142. data/db/migrate/20111106193938_create_custom_fields.rb +10 -0
  143. data/db/migrate/20111106195112_create_custom_field_answers.rb +14 -0
  144. data/db/migrate/20111106201548_create_product_group_conditions.rb +12 -0
  145. data/db/migrate/20111107035350_create_creditcard_transactions.rb +15 -0
  146. data/db/migrate/20111109190754_create_addresses.rb +24 -0
  147. data/db/migrate/20111125173344_create_pictures.rb +16 -0
  148. data/db/migrate/20111201024408_create_shipping_methods.rb +16 -0
  149. data/db/migrate/20111202143154_create_shipping_zones.rb +17 -0
  150. data/db/migrate/20111203034020_create_payment_methods.rb +14 -0
  151. data/db/migrate/20111221190000_create_preferences.rb +14 -0
  152. data/db/migrate/20120105234047_create_shipments.rb +11 -0
  153. data/db/migrate/20120105234553_create_shipment_carriers.rb +11 -0
  154. data/db/migrate/20120606165355_create_delayed_jobs.rb +22 -0
  155. data/db/production.sqlite3 +0 -0
  156. data/db/schema.rb +265 -0
  157. data/db/seeds.rb +1 -0
  158. data/db/test.sqlite3 +0 -0
  159. data/lib/assets/javascripts/loading_state_for_buttons.js.coffee +3 -0
  160. data/lib/assets/javascripts/show_help_on_hover.js.coffee +2 -0
  161. data/lib/assets/javascripts/utils/autoresize.js.coffee +3 -0
  162. data/lib/assets/javascripts/utils/focus.js.coffee +3 -0
  163. data/lib/assets/javascripts/utils/formatNumber.js.coffee +25 -0
  164. data/lib/assets/javascripts/utils/formatPrice.js.coffee +24 -0
  165. data/lib/generators/nimbleshop/app/app_generator.rb +84 -0
  166. data/lib/generators/nimbleshop/app/templates/config/application.yml +61 -0
  167. data/lib/generators/nimbleshop/app/templates/config/initializers/airbrake.rb +3 -0
  168. data/lib/generators/nimbleshop/app/templates/config/initializers/cache_images.rb +4 -0
  169. data/lib/generators/nimbleshop/app/templates/config/initializers/carrierwave.rb +36 -0
  170. data/lib/generators/nimbleshop/app/templates/config/initializers/delayed_job.rb +15 -0
  171. data/lib/generators/nimbleshop/app/templates/config/initializers/setup_email.rb +24 -0
  172. data/lib/nimbleshop/core_ext/activerecord_base.rb +18 -0
  173. data/lib/nimbleshop/core_ext/filelessio.rb +4 -0
  174. data/lib/nimbleshop/core_ext/force_ssl.rb +26 -0
  175. data/lib/nimbleshop/core_ext/mustache_templater_handler.rb +10 -0
  176. data/lib/nimbleshop/engine.rb +23 -0
  177. data/lib/nimbleshop/permalink/builder.rb +46 -0
  178. data/lib/nimbleshop/processor/base.rb +51 -0
  179. data/lib/nimbleshop/processor.rb +3 -0
  180. data/lib/nimbleshop/product_group_search/base_field.rb +19 -0
  181. data/lib/nimbleshop/product_group_search/core_field_strategy.rb +31 -0
  182. data/lib/nimbleshop/product_group_search/custom_field_strategy.rb +39 -0
  183. data/lib/nimbleshop/product_group_search/date_field.rb +16 -0
  184. data/lib/nimbleshop/product_group_search/extension.rb +46 -0
  185. data/lib/nimbleshop/product_group_search/number_field.rb +17 -0
  186. data/lib/nimbleshop/product_group_search/text_field.rb +33 -0
  187. data/lib/nimbleshop/product_group_search.rb +74 -0
  188. data/lib/nimbleshop/sampledata/data.rb +246 -0
  189. data/lib/nimbleshop/sampledata/pictures/product1/pic1.jpg +0 -0
  190. data/lib/nimbleshop/sampledata/pictures/product2/pic1.jpg +0 -0
  191. data/lib/nimbleshop/sampledata/pictures/product2/pic2.jpg +0 -0
  192. data/lib/nimbleshop/sampledata/pictures/product3/pic1.jpg +0 -0
  193. data/lib/nimbleshop/sampledata/pictures/product3/pic2.jpg +0 -0
  194. data/lib/nimbleshop/sampledata/pictures/product3/pic3.jpg +0 -0
  195. data/lib/nimbleshop/sampledata/pictures/product3/pic4.jpg +0 -0
  196. data/lib/nimbleshop/sampledata/pictures/product3/pic5.jpg +0 -0
  197. data/lib/nimbleshop/sampledata/pictures/product4/pic1.jpg +0 -0
  198. data/lib/nimbleshop/sampledata/pictures/product4/pic2.jpg +0 -0
  199. data/lib/nimbleshop/sampledata/pictures/product5/pic1.jpg +0 -0
  200. data/lib/nimbleshop/sampledata/pictures/product5/pic2.jpg +0 -0
  201. data/lib/nimbleshop/sampledata/pictures/product6/pic1.jpg +0 -0
  202. data/lib/nimbleshop/sampledata/pictures/product6/pic10.jpg +0 -0
  203. data/lib/nimbleshop/sampledata/pictures/product6/pic11.jpg +0 -0
  204. data/lib/nimbleshop/sampledata/pictures/product6/pic12.jpg +0 -0
  205. data/lib/nimbleshop/sampledata/pictures/product6/pic13.jpg +0 -0
  206. data/lib/nimbleshop/sampledata/pictures/product6/pic14.jpg +0 -0
  207. data/lib/nimbleshop/sampledata/pictures/product6/pic15.jpg +0 -0
  208. data/lib/nimbleshop/sampledata/pictures/product6/pic16.jpg +0 -0
  209. data/lib/nimbleshop/sampledata/pictures/product6/pic17.jpg +0 -0
  210. data/lib/nimbleshop/sampledata/pictures/product6/pic2.jpg +0 -0
  211. data/lib/nimbleshop/sampledata/pictures/product6/pic3.jpg +0 -0
  212. data/lib/nimbleshop/sampledata/pictures/product6/pic4.jpg +0 -0
  213. data/lib/nimbleshop/sampledata/pictures/product6/pic5.jpg +0 -0
  214. data/lib/nimbleshop/sampledata/pictures/product6/pic6.jpg +0 -0
  215. data/lib/nimbleshop/sampledata/pictures/product6/pic7.jpg +0 -0
  216. data/lib/nimbleshop/sampledata/pictures/product6/pic8.jpg +0 -0
  217. data/lib/nimbleshop/sampledata/pictures/product6/pic9.jpg +0 -0
  218. data/lib/nimbleshop/sampledata/pictures/product7/pic1.jpg +0 -0
  219. data/lib/nimbleshop/sampledata/pictures/product7/pic2.jpg +0 -0
  220. data/lib/nimbleshop/sampledata/pictures/product7/pic3.jpg +0 -0
  221. data/lib/nimbleshop/sampledata/pictures/product8/pic1.jpg +0 -0
  222. data/lib/nimbleshop/sampledata/pictures/product8/pic2.jpg +0 -0
  223. data/lib/nimbleshop/sampledata/pictures/product8/pic3.jpg +0 -0
  224. data/lib/nimbleshop/sampledata/pictures/product8/pic4.jpg +0 -0
  225. data/lib/nimbleshop/sampledata/pictures/product8/pic5.jpg +0 -0
  226. data/lib/nimbleshop/sampledata/pictures/product8/pic6.jpg +0 -0
  227. data/lib/nimbleshop/sampledata/pictures/product8/pic7.jpg +0 -0
  228. data/lib/nimbleshop/sampledata/pictures/product8/pic8.jpg +0 -0
  229. data/lib/nimbleshop/sampledata/pictures/product9/pic1.jpg +0 -0
  230. data/lib/nimbleshop/sampledata/pictures/product9/pic2.jpg +0 -0
  231. data/lib/nimbleshop/util.rb +60 -0
  232. data/lib/nimbleshop/version.rb +18 -0
  233. data/lib/nimbleshop_core.rb +23 -0
  234. data/lib/tasks/localhost2public.rake +8 -0
  235. data/lib/tasks/setup.rake +26 -0
  236. data/test/factories/address_factory.rb +31 -0
  237. data/test/factories/creditcard_factory.rb +30 -0
  238. data/test/factories/custom_field_answer_factory.rb +6 -0
  239. data/test/factories/custom_field_factory.rb +21 -0
  240. data/test/factories/line_item_factory.rb +7 -0
  241. data/test/factories/link_factory.rb +6 -0
  242. data/test/factories/link_group_factory.rb +5 -0
  243. data/test/factories/navigation_factory.rb +6 -0
  244. data/test/factories/order_factory.rb +49 -0
  245. data/test/factories/payment_method_factory.rb +6 -0
  246. data/test/factories/payment_transaction_factory.rb +42 -0
  247. data/test/factories/picture_factory.rb +11 -0
  248. data/test/factories/product_group_condition_factory.rb +40 -0
  249. data/test/factories/product_group_factory.rb +5 -0
  250. data/test/factories/products_factory.rb +11 -0
  251. data/test/factories/shipment_carrier_factory.rb +6 -0
  252. data/test/factories/shipment_factory.rb +6 -0
  253. data/test/factories/shipping_method_factory.rb +15 -0
  254. data/test/factories/shipping_zone_factory.rb +5 -0
  255. data/test/factories/shop_factory.rb +8 -0
  256. data/test/fixtures/files/avatar.png +0 -0
  257. data/test/fixtures/link_groups.yml +13 -0
  258. data/test/fixtures/payment_methods.yml +39 -0
  259. data/test/fixtures/shops.yml +15 -0
  260. data/test/helpers/admin_helper_test.rb +37 -0
  261. data/test/helpers/nimbleshop_helper_test.rb +17 -0
  262. data/test/integration/admin/link_groups_acceptance_test.rb +39 -0
  263. data/test/integration/admin/orders_acceptance_test.rb +63 -0
  264. data/test/integration/admin/payment_methods_acceptance_test.rb +13 -0
  265. data/test/integration/admin/product_groups_acceptance_test.rb +89 -0
  266. data/test/integration/admin/products_acceptance_test.rb +105 -0
  267. data/test/integration/admin/shipping_methods_acceptance_test.rb +63 -0
  268. data/test/integration/admin/shipping_zones_acceptance_test.rb +16 -0
  269. data/test/integration/admin/shops_acceptance_test.rb +44 -0
  270. data/test/integration/checkout/cart_acceptance_test.rb +113 -0
  271. data/test/integration/checkout/payment_confirmation_acceptance_test.rb +24 -0
  272. data/test/integration/checkout/paypal_acceptance_test.rb +34 -0
  273. data/test/integration/checkout/shipping_address_acceptance_test.rb +91 -0
  274. data/test/integration/checkout/shipping_method_acceptance_test.rb +51 -0
  275. data/test/integration/homepage_acceptance_test.rb +24 -0
  276. data/test/integration/products_acceptance_test.rb +12 -0
  277. data/test/integration/static_pages_acceptance_test.rb +13 -0
  278. data/test/mailers/mailer_test.rb +25 -0
  279. data/test/rails_app/Gemfile +27 -0
  280. data/test/rails_app/Gemfile.lock +218 -0
  281. data/test/rails_app/Rakefile +10 -0
  282. data/test/rails_app/app/controllers/application_controller.rb +6 -0
  283. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  284. data/test/rails_app/app/views/layouts/application.html.erb +10 -0
  285. data/test/rails_app/config/application.rb +25 -0
  286. data/test/rails_app/config/application.yml +61 -0
  287. data/test/rails_app/config/boot.rb +5 -0
  288. data/test/rails_app/config/database.yml +18 -0
  289. data/test/rails_app/config/environment.rb +5 -0
  290. data/test/rails_app/config/environments/development.rb +18 -0
  291. data/test/rails_app/config/environments/production.rb +33 -0
  292. data/test/rails_app/config/environments/test.rb +33 -0
  293. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  294. data/test/rails_app/config/initializers/inflections.rb +2 -0
  295. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  296. data/test/rails_app/config/routes.rb +10 -0
  297. data/test/rails_app/config.ru +4 -0
  298. data/test/rails_app/db/development.sqlite3 +0 -0
  299. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +74 -0
  300. data/test/rails_app/db/schema.rb +52 -0
  301. data/test/rails_app/log/development.log +94 -0
  302. data/test/rails_app/log/test.log +0 -0
  303. data/test/rails_app/public/404.html +26 -0
  304. data/test/rails_app/public/422.html +26 -0
  305. data/test/rails_app/public/500.html +26 -0
  306. data/test/rails_app/public/favicon.ico +0 -0
  307. data/test/rails_app/script/rails +10 -0
  308. data/test/support/address_test_helper.rb +24 -0
  309. data/test/support/checkout_test_helper.rb +40 -0
  310. data/test/support/dbify_sql_helper.rb +12 -0
  311. data/test/support/images/cookware.jpg +0 -0
  312. data/test/support/must_be_like.rb +24 -0
  313. data/test/support/shipping_method_test_helper.rb +5 -0
  314. data/test/support/wait_for_ajax.rb +4 -0
  315. data/test/test_helper.rb +65 -0
  316. data/test/unit/address_test.rb +33 -0
  317. data/test/unit/country_shipping_zone_test.rb +17 -0
  318. data/test/unit/creditcard_test.rb +33 -0
  319. data/test/unit/custom_field_answer/field_test.rb +93 -0
  320. data/test/unit/order_test.rb +70 -0
  321. data/test/unit/payment_method/authorizedotnet_test.rb +21 -0
  322. data/test/unit/payment_method/paypalwp_test.rb +17 -0
  323. data/test/unit/payment_method/splitable_test.rb +18 -0
  324. data/test/unit/picture_test.rb +24 -0
  325. data/test/unit/processor/authorize_net_test.rb +236 -0
  326. data/test/unit/processor/paypal_test.rb +40 -0
  327. data/test/unit/processor/splitable_test.rb +123 -0
  328. data/test/unit/product_group_condition_test.rb +188 -0
  329. data/test/unit/product_group_test.rb +109 -0
  330. data/test/unit/product_test.rb +60 -0
  331. data/test/unit/shipping_cost_calculator_test.rb +19 -0
  332. data/test/unit/shipping_method_test.rb +197 -0
  333. data/test/unit/shop_test.rb +11 -0
  334. data/test/unit/tax_calculator_test.rb +13 -0
  335. data/test/vcr_cassettes/authorize_net/authorize-failure.yml +38 -0
  336. data/test/vcr_cassettes/authorize_net/authorize-success.yml +38 -0
  337. data/test/vcr_cassettes/authorize_net/capture-failure.yml +38 -0
  338. data/test/vcr_cassettes/authorize_net/capture-success.yml +38 -0
  339. data/test/vcr_cassettes/authorize_net/purchase-failure.yml +38 -0
  340. data/test/vcr_cassettes/authorize_net/purchase-success.yml +38 -0
  341. data/test/vcr_cassettes/authorize_net/refund-failure.yml +38 -0
  342. data/test/vcr_cassettes/authorize_net/refund-success.yml +38 -0
  343. data/test/vcr_cassettes/authorize_net/void-authorize.yml +38 -0
  344. data/test/vcr_cassettes/authorize_net/void-failure.yml +38 -0
  345. data/test/vcr_cassettes/authorize_net/void-success.yml +38 -0
  346. data/test/vcr_cassettes/splitable/split-create-failure.yml +48 -0
  347. data/test/vcr_cassettes/splitable/split-create-success.yml +50 -0
  348. data/test/vcr_cassettes/splitable/split-draft-create-failure.yml +50 -0
  349. data/test/vcr_cassettes/splitable/split-draft-create-success.yml +50 -0
  350. data/vendor/assets/javascripts/accounting.js +406 -0
  351. data/vendor/assets/javascripts/autoresize.js +275 -0
  352. data/vendor/assets/javascripts/jquery-1.7.1.js +9267 -0
  353. data/vendor/assets/javascripts/jquery-form.js +980 -0
  354. data/vendor/assets/javascripts/jquery-json.js +193 -0
  355. data/vendor/assets/javascripts/jquery-ui-1.8.16.js +11768 -0
  356. data/vendor/assets/javascripts/jquery-ujs.js +374 -0
  357. data/vendor/assets/javascripts/mustache.js +436 -0
  358. data/vendor/assets/javascripts/nested_form.js +51 -0
  359. metadata +740 -0
@@ -0,0 +1,74 @@
1
+ require 'product_group_search/core_field_strategy'
2
+ require 'product_group_search/custom_field_strategy'
3
+ require 'product_group_search/base_field'
4
+ require 'product_group_search/text_field'
5
+ require 'product_group_search/number_field'
6
+ require 'product_group_search/date_field'
7
+
8
+ module ProductGroupSearch
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+
13
+ # query_column is the value of name column in product_group_condition for core fields.
14
+ # For custom fields this value will be overridden
15
+ attr_reader :query_column
16
+
17
+ # field_handler could be TextField, NumberField or any other field handler.
18
+ attr_reader :field_handler
19
+
20
+ # index is used by custom_field_strategy
21
+ attr_accessor :index
22
+
23
+ delegate :where, :valid_value_data_type?, :valid_operator?, to: :field_handler
24
+
25
+ validate :validate_value_data_type
26
+ validate :validate_operator
27
+
28
+ after_initialize :prepare_instance
29
+ end
30
+
31
+ def name=(val)
32
+ val = val.try(:to_s)
33
+ if super(val)
34
+ prepare_instance
35
+ end
36
+ end
37
+
38
+ def summary
39
+ I18n.t(self.operator.to_sym, { field: localized_name, value: self.value })
40
+ end
41
+
42
+ private
43
+
44
+ def validate_operator
45
+ self.errors.add(:operator, :invalid) unless valid_operator?(operator)
46
+ end
47
+
48
+ def validate_value_data_type
49
+ self.errors.add(:value, :invalid) unless valid_value_data_type?
50
+ end
51
+
52
+ def prepare_instance
53
+ set_strategy
54
+ set_field_handler
55
+ end
56
+
57
+ def set_strategy
58
+ extend(custom_field? ? CustomFieldStrategy : CoreFieldStrategy)
59
+ end
60
+
61
+ def set_field_handler
62
+ klass = ProductGroupSearch.const_get("#{field_type.classify}Field")
63
+ @field_handler = klass.new(self)
64
+ end
65
+
66
+ def query_field
67
+ target_table.send(:[], query_column)
68
+ end
69
+
70
+ def custom_field?
71
+ # for a custom field the name column contains the primary key of the custom_fields table
72
+ name.try(:match, /\A\d+?\Z/).present?
73
+ end
74
+ end
@@ -0,0 +1,246 @@
1
+ module Sampledata
2
+ class Data
3
+
4
+ attr_accessor :products
5
+
6
+ def populate
7
+ load_shipment_carriers
8
+ load_shop
9
+ load_shipping_methods
10
+ load_product_group_for_price
11
+ load_product_group_for_category
12
+
13
+ load_tag_watch
14
+ load_iphone_cover
15
+ load_turquoise_bracelet
16
+ load_bag
17
+ load_tajmahal
18
+ load_chronograph_watch
19
+ load_mangoes
20
+ load_bangles
21
+ load_shoes
22
+ end
23
+
24
+ private
25
+
26
+ def load_shipment_carriers
27
+ %w(UPS USPS Fedex).each { |carrier| ShipmentCarrier.create!(name: carrier) }
28
+ end
29
+
30
+ def load_shop
31
+ Shop.create!( name: 'nimbleShop',
32
+ phone_number: '800-456-7890',
33
+ twitter_handle: '@nimbleshop',
34
+ from_email: 'support@nimbleshop.com',
35
+ tax_percentage: 1.23,
36
+ google_analytics_tracking_id: Nimbleshop.config.google_analytics_tracking_id,
37
+ facebook_url: 'http://www.facebook.com/pages/NimbleSHOP/119319381517845')
38
+ end
39
+
40
+ def handle_pictures_for_product(product, dirname)
41
+ p = Pathname.new(File.expand_path('../pictures', __FILE__))
42
+ pictures = Dir.glob(p.join(dirname, '*'))
43
+
44
+ pictures.sort.each do |filename|
45
+ attach_picture( filename, product)
46
+ end
47
+ end
48
+
49
+ def attach_picture(filename_with_extension, product)
50
+ path = Rails.root.join('lib', 'sampledata', 'pictures', filename_with_extension)
51
+ product.attach_picture(filename_with_extension, path)
52
+ end
53
+
54
+ def load_product_group_for_price
55
+ pg_lt_50 = ProductGroup.create!(name: '< $50')
56
+ pg_lt_50.product_group_conditions.create(name: 'price', operator: 'lt', value: 50)
57
+ pg_between_50_100 = ProductGroup.create!(name: '$50 - $100')
58
+ pg_between_50_100.product_group_conditions.create(name: 'price', operator: 'gteq', value: 50)
59
+ pg_between_50_100.product_group_conditions.create(name: 'price', operator: 'lteq', value: 100)
60
+ pg_gt_100 = ProductGroup.create!(name: '> $100')
61
+ pg_gt_100.product_group_conditions.create(name: 'price', operator: 'gt', value: 100)
62
+
63
+ link_group = LinkGroup.create!(name: 'Shop by price')
64
+ Navigation.create!(link_group: link_group, product_group: pg_lt_50)
65
+ Navigation.create!(link_group: link_group, product_group: pg_between_50_100)
66
+ Navigation.create!(link_group: link_group, product_group: pg_gt_100)
67
+ end
68
+
69
+ def load_product_group_for_category
70
+ cf = CustomField.create!(name: 'category', field_type: 'text')
71
+
72
+ pg_food = ProductGroup.create!(name: 'Food')
73
+ pg_food.product_group_conditions.create(name: cf.id, operator: 'eq', value: 'food')
74
+
75
+ pg_toy = ProductGroup.create!(name: 'Toy')
76
+ pg_toy.product_group_conditions.create(name: cf.id, operator: 'eq', value: 'toy')
77
+
78
+ pg_art = ProductGroup.create!(name: 'Art')
79
+ pg_art.product_group_conditions.create(name: cf.id, operator: 'eq', value: 'art')
80
+
81
+ pg_fashion = ProductGroup.create!(name: 'Fashion')
82
+ pg_fashion.product_group_conditions.create(name: cf.id, operator: 'eq', value: 'fashion')
83
+
84
+ link_group = LinkGroup.create!(name: 'Shop by category')
85
+ link_group.navigations.create(product_group: pg_art)
86
+ link_group.navigations.create(product_group: pg_food)
87
+ link_group.navigations.create(product_group: pg_fashion)
88
+ end
89
+
90
+ def load_shipping_methods
91
+ sz = CountryShippingZone.create!(country_code: 'US')
92
+ ShippingMethod.create!(name: 'Ground shipping', base_price: 10, shipping_zone_id: sz.id,
93
+ minimum_order_amount: 0, maximum_order_amount: 999999)
94
+
95
+ ShippingMethod.create!(name: 'Express shipping', base_price: 30, shipping_zone_id: sz.id,
96
+ minimum_order_amount: 10, maximum_order_amount: 999999)
97
+ end
98
+
99
+ def load_tajmahal
100
+ print '.'
101
+ desc = %q{
102
+ Year of construction: 1631
103
+ Completed in: 1653
104
+ Time taken: 22 years
105
+ Built by: Shah Jahan
106
+ Dedicated to: Mumtaz Mahal (Arjumand Bano Begum), the wife of Shah Jahan
107
+ Location: Agra (Uttar Pradesh), India
108
+ Building type: Islamic tomb
109
+ Architecture: Mughal (Combination of Persian, Islamic and Indian architecture style)
110
+ Architect: Ustad Ahmad Lahauri
111
+ Cost of construction: 32 crore rupees
112
+ Number of workers: 20,000
113
+ Highlights: One of the Seven Wonders of the World; A UNESCO World Heritage Site
114
+
115
+ Facts do not capture what Tajmahal is.
116
+ }
117
+ product = Product.create!( title: "Beautiful portrait of Tajmahal", price: 19, description: desc)
118
+ handle_pictures_for_product(product, "product1")
119
+ product.custom_field_answers.create(custom_field: CustomField.first, value: 'art')
120
+ end
121
+
122
+ def load_chronograph_watch
123
+ print '.'
124
+ desc = %q{
125
+ Chronograph sport watch from Guess
126
+
127
+ Chronograph: Stopwatch function, 24 Hour/Intl. time
128
+ 43/43/13
129
+ Brushed + Polished Ionic Black case
130
+ Red + Black dial
131
+ Brushed + Polished Ionic Black Steel bracelet
132
+ 100 M/330 FT Water resistant
133
+ }
134
+ product = Product.create!( title: "chronograph sport watch from Guess", price: 219, description: desc)
135
+ handle_pictures_for_product(product, "product2")
136
+ product.custom_field_answers.create(custom_field: CustomField.first, value: 'fashion')
137
+ end
138
+
139
+ def load_turquoise_bracelet
140
+ print '.'
141
+ desc = %q{
142
+ Simple, modern, stylish, easy to wear bracelet !
143
+
144
+ For a scale reference please see the photos with the bracelet worn.
145
+
146
+ For a custom color bracelet send me a message and I will see what colors are available for your bracelet.
147
+
148
+ The strap of the bracelet can also be customized in any color you would like.
149
+
150
+ All items come to you beautifully packaged and ready for gift giving.
151
+
152
+ Note that real colors may slightly differ from their appearance on your display.
153
+ }
154
+ product = Product.create!( title: "Turquoise bracelet", price: 89, description: desc)
155
+ handle_pictures_for_product(product, "product3")
156
+ product.custom_field_answers.create(custom_field: CustomField.first, value: 'fashion')
157
+ end
158
+
159
+ def load_mangoes
160
+ print '.'
161
+ desc = %q{
162
+ The mango is the national fruit of India and Pakistan. It is also the national fruit in the Philippines. The mango tree is the national tree of Bangladesh.
163
+
164
+ Mango leaves are used to decorate archways and doors in Indian houses and during weddings and celebrations.
165
+ }
166
+ product = Product.create!( title: "A basket of Indian mangoes", price: 17, description: desc)
167
+ handle_pictures_for_product(product, "product4")
168
+ product.custom_field_answers.create(custom_field: CustomField.first, value: 'food')
169
+ end
170
+
171
+ def load_bag
172
+ print '.'
173
+ desc = %q{
174
+ Stylish bag in indigo color. How could you say no to this.
175
+
176
+ It is just the perfect size also. It has enough space to carry ipad, magazine, cosmetic stuff and othe accessories.
177
+
178
+ Length: 32cm(12.60 inches)
179
+ Width: 19cm(7.48 inches)
180
+ }
181
+ product = Product.create!( title: "A simple and elegant bag", price: 107, description: desc)
182
+ handle_pictures_for_product(product, "product5")
183
+ product.custom_field_answers.create(custom_field: CustomField.first, value: 'fashion')
184
+ end
185
+
186
+ def load_bangles
187
+ print '.'
188
+ desc = %q{
189
+ Bangles are part of traditional Indian jewelry. They are usually worn in pairs by women, one or more on each arm. Most Indian women prefer wearing either gold or glass bangles or combination of both. Inexpensive bangles made from plastic are slowly replacing those made by glass, but the ones made of glass are still preferred at traditional occasions such as marriages and on festivals.
190
+
191
+ The designs range from simple to intricate handmade designs, often studded with precious and semi-precious stones such as diamonds, gems and pearls. Sets of expensive bangles made of gold and silver make a jingling sound. The imitation jewelry, tend to make a tinny sound when jingled.
192
+
193
+ It is tradition that the bride will try to wear as many small glass bangles as possible at her wedding and the honeymoon will end when the last bangle breaks.
194
+ }
195
+ product = Product.create!( title: "Handmade bangles", price: 11, description: desc)
196
+ handle_pictures_for_product(product, "product6")
197
+ product.custom_field_answers.create(custom_field: CustomField.first, value: 'fashion')
198
+ end
199
+
200
+ def load_shoes
201
+ print '.'
202
+ desc = %q{
203
+ People of India love color. Everything they use from top to bottom is colorful.
204
+
205
+ Lets talk about shoes. Making good looking shoes is an art they have perfected over centuries. Making a shoe takes the whole village. And the whole village participates in the business of making and selling quality colorful shoes.
206
+ }
207
+ product = Product.create!( title: "Colorful shoes", price: 191, description: desc)
208
+ handle_pictures_for_product(product, "product7")
209
+ product.custom_field_answers.create(custom_field: CustomField.first, value: 'fashion')
210
+ end
211
+
212
+ def load_tag_watch
213
+ print '.'
214
+ desc = %q{
215
+ Swiss label, TAG Heuer's Aquaracer 500M Ceramic watch embodies perfection, style and clean look.
216
+
217
+ It has ceramic bezel and has the case is 41mm, significantly smaller than the 43mm out-going model. The case has been given softer curvier lines to
218
+ create a more classic look.
219
+
220
+ Following models are available:
221
+
222
+ - Blue dial, blue ceramic bezel, steel
223
+ - Black dial, black ceramic bezel, steel
224
+ - Blue & gold, steel
225
+ - full black, ceramic bezel, titanium carbide case
226
+ }
227
+ product = Product.create!( title: "TAG Heuer Aquaracer 500M Ceramic Watch", price: 3000, description: desc)
228
+ handle_pictures_for_product(product, "product8")
229
+ product.custom_field_answers.create(custom_field: CustomField.first, value: 'fashion')
230
+ end
231
+
232
+ def load_iphone_cover
233
+ print '.'
234
+ desc = %q{
235
+ This is a hard case is for your iPhone 4. Fits both AT&T & Verizon models of the iPhone 4. The case has a wood like appearance.
236
+ It is not actual wood. It will protect it from scractches while also bringing it to life with some color!
237
+
238
+ It does not interfere with any buttons. It is available in many different colors. If you have a specific color in my then contact me.
239
+ }
240
+ product = Product.create!( title: "Hard wood case for iphone", price: 7.95, description: desc)
241
+ handle_pictures_for_product(product, "product9")
242
+ product.custom_field_answers.create(custom_field: CustomField.first, value: 'fashion')
243
+ end
244
+
245
+ end
246
+ end
@@ -0,0 +1,60 @@
1
+ class Util
2
+
3
+ # loads a yaml based configuration file and returns hash
4
+ def self.config2hash(file)
5
+ hash = YAML.load(ERB.new(File.read(file)).result)
6
+
7
+ common_hash = hash['common'] || {}
8
+ env_hash = hash[Rails.env.to_s] || {}
9
+
10
+ final_hash = common_hash.deep_merge(env_hash)
11
+ Hashr.new(final_hash)
12
+ end
13
+
14
+ # Converts the amount in cents and returns an integer.
15
+ def self.in_cents(amount)
16
+ (BigDecimal(amount.to_s) * 100).round(0).to_i
17
+ end
18
+
19
+ # returns public url for a given localhost url
20
+ #
21
+ # Usage: localhost2public_url ( '/nimbleshop_paypal/notify', 'http' )
22
+ #
23
+ def self.localhost2public_url(url, protocol)
24
+ return url unless Nimbleshop.config.use_localhost2public_url
25
+
26
+ tunnel = Rails.root.join('config', '.tunnel')
27
+ return Nimbleshop.config.default_localhost2public_url unless File.exists?(tunnel)
28
+
29
+ path = []
30
+
31
+ host = File.open(tunnel, "r").gets.sub("\n", "")
32
+ path << "#{protocol}://#{host}"
33
+
34
+ path << url
35
+ path.join('')
36
+ end
37
+
38
+ # The output is something like
39
+ # ["Timor-Leste", "TL"], ["Turkmenistan", "TM"], ["Tunisia", "TN"], ["Tonga", "TO"], .......
40
+ def self.countries_list_with_name_and_code
41
+ Carmen::Country.all.map { |t| [t.name, t.alpha_2_code] }
42
+ end
43
+
44
+ def self.countries_without_shipping_zone
45
+ Util.countries_list_with_name_and_code.reject { |_, t| CountryShippingZone.all_country_codes.include?(t) }
46
+ end
47
+
48
+ def self.disabled_shipping_zone_countries
49
+ countries_with_shipping_zone.reduce([]) { |result, element| result << [element[0], element[1], {disabled: :disabled}]}
50
+ end
51
+
52
+ def self.unconfigured_shipping_zone_countries
53
+ (Util.disabled_shipping_zone_countries + Util.countries_without_shipping_zone).sort
54
+ end
55
+
56
+ def self.countries_with_shipping_zone
57
+ Util.countries_list_with_name_and_code.select { |_, t| CountryShippingZone.all_country_codes.include?(t)}
58
+ end
59
+
60
+ end
@@ -0,0 +1,18 @@
1
+ module Nimbleshop
2
+ class Version
3
+ @major = 0
4
+ @minor = 0
5
+ @tiny = 1
6
+ @build = 'rc1'
7
+
8
+ class << self
9
+ attr_reader :major, :minor, :tiny, :build
10
+
11
+ def to_s
12
+ [@major, @minor, @tiny, @build].compact.join('.')
13
+ end
14
+ end
15
+ end
16
+
17
+ RailsVersion = '= 3.2.6'
18
+ end
@@ -0,0 +1,23 @@
1
+ require 'nimbleshop/engine'
2
+ require 'generators/nimbleshop/app/app_generator'
3
+
4
+ # Why do we need to require all the gems individually ?
5
+ #
6
+ # When bundler loads a gem and also requires it unless you say require false.
7
+ # nimbleshop_core gem is loaded using gemspec and unlke bundler gemspe does not
8
+ # autoload all the required gems.
9
+
10
+ require 'rails/all'
11
+ require 'hashr'
12
+ require 'carrierwave'
13
+ require 'delayed_job_active_record'
14
+ require 'carmen'
15
+ require 'nested_form'
16
+ require 'twitter-bootstrap-rails'
17
+ require 'state_machine'
18
+ require 'mini_magick'
19
+ require 'active_merchant'
20
+ require 'strong_parameters'
21
+ require 'valid_email'
22
+ require 'custom_error_message'
23
+ require 'american_date'
@@ -0,0 +1,8 @@
1
+ namespace :nimbleshop do
2
+
3
+ desc "makes localhost available through a public url using localtunnel gem"
4
+ task :localtunnel do
5
+ exec "bundle exec localtunnel -k ~/.ssh/id_rsa.pub 3000"
6
+ end
7
+
8
+ end
@@ -0,0 +1,26 @@
1
+ namespace :nimbleshop do
2
+
3
+ desc "sets up database for nimbleshop application"
4
+ task :setup => :environment do
5
+
6
+ #raise "this task should not be run in production" if Rails.env.production?
7
+
8
+ Rake::Task["db:reset"].invoke if Rails.env.development? || Rails.env.test?
9
+
10
+ Sampledata::Data.new.populate
11
+
12
+ Rake::Task["nimbleshop_splitable:load_record"].invoke
13
+ Rake::Task["nimbleshop_paypalwp:load_record"].invoke
14
+ Rake::Task["nimbleshop_authorizedotnet:load_record"].invoke
15
+ Rake::Task["nimbleshop_cod:load_record"].invoke
16
+
17
+ Rake::Task["nimbleshop_splitable:copy_images"].invoke
18
+ Rake::Task["nimbleshop_paypalwp:copy_images"].invoke
19
+ Rake::Task["nimbleshop_authorizedotnet:copy_images"].invoke
20
+ Rake::Task["nimbleshop_cod:copy_images"].invoke
21
+
22
+ puts ""
23
+ puts '**** shop is ready with sample data ****'
24
+ end
25
+
26
+ end
@@ -0,0 +1,31 @@
1
+ FactoryGirl.define do
2
+ factory :base_address do
3
+ country_code 'US'
4
+ state_code 'FL'
5
+ state_name 'Florida'
6
+
7
+ trait :good do
8
+ city { Faker::Address.city }
9
+ first_name { Faker::Name.first_name }
10
+ last_name { Faker::Name.last_name }
11
+ address1 { Faker::Address.street_address }
12
+ end
13
+
14
+ trait :bad do
15
+ city nil
16
+ first_name nil
17
+ last_name nil
18
+ address1 nil
19
+ end
20
+
21
+ zipcode { Faker::Address.zip_code }
22
+
23
+ factory :address, class: Address, parent: :base_address, traits: [:good]
24
+ factory :shipping_address, class: ShippingAddress, parent: :base_address, traits: [:good], aliases: [:good_shipping_address]
25
+
26
+ factory :billing_address, class: BillingAddress, parent: :base_address, traits: [:good], aliases: [:good_billing_address]
27
+
28
+ factory :bad_shipping_address, class: ShippingAddress, parent: :base_address, traits: [:bad]
29
+ factory :bad_billing_address, class: BillingAddress, parent: :base_address, traits: [:bad]
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ FactoryGirl.define do
2
+ factory :creditcard do |f|
3
+ cvv '123'
4
+ number '4007000000027'
5
+ cardtype 'visa'
6
+
7
+ first_name { Faker::Name.first_name }
8
+ last_name { Faker::Name.last_name }
9
+ address1 { Faker::Address.street_address }
10
+ zipcode { Faker::Address.zip_code }
11
+ month 5
12
+ year 2015
13
+ state 'Florida'
14
+
15
+ trait :visa do
16
+ cardtype 'visa'
17
+ number '4007000000027'
18
+ cvv '123'
19
+ end
20
+
21
+ trait :american_express do
22
+ cvv '1123'
23
+ cardtype 'american_express'
24
+ number '370000000000002'
25
+ end
26
+
27
+ factory :visa_creditcard, traits: [:visa]
28
+ factory :american_express_creditcard, traits: [:american_express]
29
+ end
30
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :custom_field_answer do
3
+ custom_field
4
+ product
5
+ end
6
+ end
@@ -0,0 +1,21 @@
1
+ FactoryGirl.define do
2
+ factory :custom_field do
3
+ sequence(:name) { |t| "name#{t}" }
4
+
5
+ trait :number do
6
+ field_type 'number'
7
+ end
8
+
9
+ trait :date do
10
+ field_type 'date'
11
+ end
12
+
13
+ trait :text do
14
+ field_type 'text'
15
+ end
16
+
17
+ factory :number_custom_field, traits: [:number]
18
+ factory :date_custom_field, traits: [:date ]
19
+ factory :text_custom_field, traits: [:text]
20
+ end
21
+ end