shell-spinner 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. data/.gitignore +22 -4
  2. data/.rspec +1 -0
  3. data/.rvmrc +53 -0
  4. data/Gemfile +90 -3
  5. data/Gemfile.lock +479 -0
  6. data/README.md +56 -0
  7. data/Rakefile +7 -1
  8. data/app/admin/carriers.rb +17 -0
  9. data/app/admin/dashboards.rb +31 -0
  10. data/app/admin/interviews.rb +77 -0
  11. data/app/admin/users.rb +40 -0
  12. data/app/assets/images/icons/ajax-loader.gif +0 -0
  13. data/app/assets/images/icons/clear-results.png +0 -0
  14. data/app/assets/images/icons/clipboard.png +0 -0
  15. data/app/assets/images/icons/magnify.png +0 -0
  16. data/app/assets/images/icons/social/facebook.png +0 -0
  17. data/app/assets/images/icons/social/google.png +0 -0
  18. data/app/assets/images/icons/social/linkedin.png +0 -0
  19. data/app/assets/images/icons/social/small/facebook.png +0 -0
  20. data/app/assets/images/icons/social/small/google.png +0 -0
  21. data/app/assets/images/icons/social/small/linkedin.png +0 -0
  22. data/app/assets/images/icons/social/small/twitter.png +0 -0
  23. data/app/assets/images/icons/social/small/windowslive.png +0 -0
  24. data/app/assets/images/icons/social/small/yahoo.png +0 -0
  25. data/app/assets/images/icons/social/twitter.png +0 -0
  26. data/app/assets/images/icons/social/windowslive.png +0 -0
  27. data/app/assets/images/icons/social/yahoo.png +0 -0
  28. data/app/assets/images/logo.png +0 -0
  29. data/app/assets/javascripts/active_admin.js.coffee +18 -0
  30. data/app/assets/javascripts/admin/base.coffee +0 -0
  31. data/app/assets/javascripts/admin/interview_form.coffee +95 -0
  32. data/app/assets/javascripts/app/controllers/questions.js.coffee +12 -0
  33. data/app/assets/javascripts/app/index.js.coffee +25 -0
  34. data/app/assets/javascripts/app/lib/view.js.coffee +3 -0
  35. data/app/assets/javascripts/app/models/interview_template.js.coffee +6 -0
  36. data/app/assets/javascripts/app/models/question.js.coffee +6 -0
  37. data/app/assets/javascripts/app/views/questions/show.jst.hamljs +2 -0
  38. data/app/assets/javascripts/application.coffee +48 -0
  39. data/app/assets/javascripts/attachment_form.coffee +31 -0
  40. data/app/assets/javascripts/clipboard_control.coffee +30 -0
  41. data/app/assets/javascripts/invitation_form.coffee +72 -0
  42. data/app/assets/javascripts/recommendation_form.coffee +19 -0
  43. data/app/assets/javascripts/recommendations_list.coffee +11 -0
  44. data/app/assets/javascripts/search_contacts_form.coffee +36 -0
  45. data/app/assets/javascripts/templates/empty_recipients_list.tmpl +1 -0
  46. data/app/assets/javascripts/templates/recipient.tmpl +5 -0
  47. data/app/assets/stylesheets/active_admin.css.scss +28 -0
  48. data/app/assets/stylesheets/application.sass +24 -0
  49. data/app/assets/stylesheets/includes/_authorisation.sass +29 -0
  50. data/app/assets/stylesheets/includes/_bootstrap_tweaks.sass +2 -0
  51. data/app/assets/stylesheets/includes/_campaigns.sass +44 -0
  52. data/app/assets/stylesheets/includes/_controls.sass +41 -0
  53. data/app/assets/stylesheets/includes/_form.sass +23 -0
  54. data/app/assets/stylesheets/includes/_formatting.sass +8 -0
  55. data/app/assets/stylesheets/includes/_icons.sass +31 -0
  56. data/app/assets/stylesheets/includes/_interview.sass +16 -0
  57. data/app/assets/stylesheets/includes/_interview_form.sass +170 -0
  58. data/app/assets/stylesheets/includes/_interview_management.sass +3 -0
  59. data/app/assets/stylesheets/includes/_invitation_form.sass +190 -0
  60. data/app/assets/stylesheets/includes/_layout.sass +69 -0
  61. data/app/assets/stylesheets/includes/_mixins.sass +42 -0
  62. data/app/assets/stylesheets/includes/_navigation.sass +16 -0
  63. data/app/assets/stylesheets/includes/_recommendations.sass +34 -0
  64. data/app/concerns/authenticate_users.rb +72 -0
  65. data/app/concerns/conditional_redirect_after_signing_in.rb +24 -0
  66. data/app/concerns/eventable.rb +16 -0
  67. data/app/controllers/application_controller.rb +31 -0
  68. data/app/controllers/attachments_controller.rb +36 -0
  69. data/app/controllers/campaigns_controller.rb +23 -0
  70. data/app/controllers/contacts_controller.rb +37 -0
  71. data/app/controllers/interview_result_invitations_controller.rb +21 -0
  72. data/app/controllers/interview_results_controller.rb +39 -0
  73. data/app/controllers/interview_templates_controller.rb +3 -0
  74. data/app/controllers/pages_controller.rb +6 -0
  75. data/app/controllers/questions_controller.rb +5 -0
  76. data/app/controllers/recommendations_controller.rb +64 -0
  77. data/app/controllers/resources_controller.rb +1 -0
  78. data/app/controllers/users/omniauth_callbacks_controller.rb +52 -0
  79. data/app/helpers/admin/interview_helper.rb +14 -0
  80. data/app/helpers/answers_helper.rb +8 -0
  81. data/app/helpers/application_helper.rb +1 -0
  82. data/app/helpers/attachments_helper.rb +5 -0
  83. data/app/helpers/campaigns_helper.rb +5 -0
  84. data/app/helpers/layout_helper.rb +5 -0
  85. data/app/helpers/recommendation_helper.rb +14 -0
  86. data/app/mailers/invitation_mailer.rb +13 -0
  87. data/app/models/ability.rb +23 -0
  88. data/app/models/answer.rb +36 -0
  89. data/app/models/answer_choice.rb +28 -0
  90. data/app/models/attachment.rb +34 -0
  91. data/app/models/buying_attempt.rb +31 -0
  92. data/app/models/campaign.rb +37 -0
  93. data/app/models/carrier.rb +30 -0
  94. data/app/models/cell_phone_insurance_interview.rb +17 -0
  95. data/app/models/contact.rb +31 -0
  96. data/app/models/default_interview.rb +17 -0
  97. data/app/models/interesting_fact.rb +30 -0
  98. data/app/models/interview_result.rb +65 -0
  99. data/app/models/interview_template.rb +52 -0
  100. data/app/models/invitation.rb +45 -0
  101. data/app/models/invitation_identifier.rb +29 -0
  102. data/app/models/numeric_question.rb +19 -0
  103. data/app/models/one_correct_question.rb +27 -0
  104. data/app/models/possible_answer.rb +54 -0
  105. data/app/models/question.rb +96 -0
  106. data/app/models/recommendation.rb +27 -0
  107. data/app/models/scale_question.rb +42 -0
  108. data/app/models/user.rb +102 -0
  109. data/app/models/yes_no_question.rb +18 -0
  110. data/app/renderers/nav_links_renderer.rb +10 -0
  111. data/app/uploaders/attachement_uploader.rb +55 -0
  112. data/app/uploaders/file_uploader.rb +20 -0
  113. data/app/views/admin/interviews/_form.html.haml +36 -0
  114. data/app/views/admin/interviews/_possible_answer_fields.html.haml +6 -0
  115. data/app/views/admin/interviews/_question_fields.html.haml +28 -0
  116. data/app/views/admin/interviews/_wrapper_question_fields.html.haml +2 -0
  117. data/app/views/admin/interviews/numeric_question/_fields.html.haml +7 -0
  118. data/app/views/admin/interviews/one_correct_question/_answer_fields.html.haml +6 -0
  119. data/app/views/admin/interviews/one_correct_question/_fields.html.haml +18 -0
  120. data/app/views/admin/interviews/scale_question/_fields.html.haml +7 -0
  121. data/app/views/admin/interviews/scale_question/_start_end_values.html.haml +6 -0
  122. data/app/views/admin/interviews/yes_no_question/_fields.html.haml +3 -0
  123. data/app/views/attachments/_form.html.haml +5 -0
  124. data/app/views/attachments/_interesting_facts.html.haml +11 -0
  125. data/app/views/attachments/_resource.html.haml +13 -0
  126. data/app/views/attachments/buttons/_delete.html.haml +3 -0
  127. data/app/views/attachments/index.html.haml +28 -0
  128. data/app/views/attachments/new.html.haml +1 -0
  129. data/app/views/attachments/show.html.haml +1 -0
  130. data/app/views/campaigns/_form.html.haml +7 -0
  131. data/app/views/campaigns/_form_actions.html.haml +4 -0
  132. data/app/views/campaigns/edit.html.haml +7 -0
  133. data/app/views/campaigns/index.html.haml +14 -0
  134. data/app/views/campaigns/new.html.haml +7 -0
  135. data/app/views/campaigns/show.html.haml +15 -0
  136. data/app/views/contacts/_list.html.haml +17 -0
  137. data/app/views/contacts/_table.html.haml +8 -0
  138. data/app/views/contacts/search.html.haml +1 -0
  139. data/app/views/interesting_facts/_fact.html.haml +4 -0
  140. data/app/views/interview_result_invitations/new.html.haml +29 -0
  141. data/app/views/interview_results/_answer_choice.html.haml +11 -0
  142. data/app/views/interview_results/_form.html.haml +16 -0
  143. data/app/views/interview_results/_list.html.haml +3 -0
  144. data/app/views/interview_results/_numeric_question.html.haml +3 -0
  145. data/app/views/interview_results/_one_correct_question.html.haml +3 -0
  146. data/app/views/interview_results/_scale_question.html.haml +6 -0
  147. data/app/views/interview_results/_yes_no_question.html.haml +6 -0
  148. data/app/views/interview_results/index.html.haml +2 -0
  149. data/app/views/interview_results/new.html.haml +4 -0
  150. data/app/views/interview_results/numeric/_price.html.haml +2 -0
  151. data/app/views/interview_results/numeric/_simple_number.html.haml +2 -0
  152. data/app/views/interview_results/one_correct/_dropdown.html.haml +1 -0
  153. data/app/views/interview_results/one_correct/_radio.html.haml +2 -0
  154. data/app/views/interview_results/one_correct/_slider.html.haml +2 -0
  155. data/app/views/interview_results/show.html.haml +24 -0
  156. data/app/views/interview_templates/index.json.rabl +6 -0
  157. data/app/views/interview_templates/show.html.haml +1 -0
  158. data/app/views/layouts/_footer.haml +9 -0
  159. data/app/views/layouts/_header.haml +21 -0
  160. data/app/views/layouts/application.html.haml +29 -0
  161. data/app/views/pages/home.html.haml +10 -0
  162. data/app/views/questions/show.json.rabl +2 -0
  163. data/app/views/recommendations/new.html.haml +19 -0
  164. data/app/views/shared/_ask_facebook_friends.html.haml +11 -0
  165. data/app/views/shared/_ask_twitter_followers.html.haml +13 -0
  166. data/app/views/shared/_conditional_html_tags.html.haml +8 -0
  167. data/app/views/shared/_errors.html.haml +2 -0
  168. data/app/views/shared/_friends_recommendations.html.haml +12 -0
  169. data/app/views/shared/_import_contacts_links.html.haml +10 -0
  170. data/app/views/shared/_interview_widget.html.haml +1 -0
  171. data/app/views/shared/_login_social_buttons.html.haml +19 -0
  172. data/app/views/shared/_sign_in_modal.html.haml +22 -0
  173. data/app/views/shared/buttons/_create.html.haml +3 -0
  174. data/app/views/shared/buttons/_delete.html.haml +3 -0
  175. data/app/views/shared/buttons/_edit.html.haml +3 -0
  176. data/app/views/users/confirmations/new.html.haml +11 -0
  177. data/app/views/users/mailer/confirmation_instructions.html.haml +4 -0
  178. data/app/views/users/mailer/reset_password_instructions.html.haml +6 -0
  179. data/app/views/users/mailer/unlock_instructions.html.haml +5 -0
  180. data/app/views/users/passwords/edit.html.haml +16 -0
  181. data/app/views/users/passwords/new.html.haml +9 -0
  182. data/app/views/users/registrations/edit.html.haml +27 -0
  183. data/app/views/users/registrations/new.html.haml +17 -0
  184. data/app/views/users/sessions/new.html.haml +14 -0
  185. data/app/views/users/shared/_links.haml +14 -0
  186. data/app/views/users/unlocks/new.html.haml +11 -0
  187. data/config.ru +4 -0
  188. data/config/application.rb +86 -0
  189. data/config/boot.rb +6 -0
  190. data/config/bottom_navigation.rb +13 -0
  191. data/config/cucumber.yml +8 -0
  192. data/config/database.yml +20 -0
  193. data/config/environment.rb +5 -0
  194. data/config/environments/development.rb +38 -0
  195. data/config/environments/production.rb +71 -0
  196. data/config/environments/test.rb +39 -0
  197. data/config/exceptional.yml +7 -0
  198. data/config/initializers/active_admin.rb +129 -0
  199. data/config/initializers/backtrace_silencers.rb +7 -0
  200. data/config/initializers/contacts_monkey_patch.rb +8 -0
  201. data/config/initializers/core_extensions.rb +1 -0
  202. data/config/initializers/delayed_job_config.rb +6 -0
  203. data/config/initializers/devise.rb +236 -0
  204. data/config/initializers/formtastic.rb +1 -0
  205. data/config/initializers/generators.rb +2 -0
  206. data/config/initializers/inflections.rb +15 -0
  207. data/config/initializers/mime_types.rb +5 -0
  208. data/config/initializers/net_ssl_monkey_patch.rb +22 -0
  209. data/config/initializers/secret_token.rb +7 -0
  210. data/config/initializers/session_store.rb +8 -0
  211. data/config/initializers/settings.rb +20 -0
  212. data/config/initializers/setup_mailer.rb +1 -0
  213. data/config/initializers/wrap_parameters.rb +14 -0
  214. data/config/locales/devise.en.yml +57 -0
  215. data/config/locales/en.yml +131 -0
  216. data/config/navigation.rb +25 -0
  217. data/config/omniauth.yml +54 -0
  218. data/config/routes.rb +41 -0
  219. data/config/sendgrid.yml +18 -0
  220. data/config/sendgrid.yml.example +18 -0
  221. data/config/top_navigation.rb +28 -0
  222. data/data/.gitkeep +0 -0
  223. data/db/migrate/20120615102902_create_users.rb +10 -0
  224. data/db/migrate/20120615103611_add_devise_to_users.rb +53 -0
  225. data/db/migrate/20120615104044_add_facebook_id_to_users.rb +5 -0
  226. data/db/migrate/20120618051144_add_twitter_id_to_users.rb +5 -0
  227. data/db/migrate/20120618051522_add_google_id_to_users.rb +5 -0
  228. data/db/migrate/20120618083140_add_linkedin_id_to_users.rb +5 -0
  229. data/db/migrate/20120618094240_add_yahoo_id_to_users.rb +5 -0
  230. data/db/migrate/20120618102303_add_windowslive_id_to_users.rb +5 -0
  231. data/db/migrate/20120618121959_create_survey_templates.rb +9 -0
  232. data/db/migrate/20120618122120_create_survey_results.rb +10 -0
  233. data/db/migrate/20120618122346_create_questions.rb +12 -0
  234. data/db/migrate/20120618122442_create_answers.rb +11 -0
  235. data/db/migrate/20120618122551_create_question_results.rb +10 -0
  236. data/db/migrate/20120618123137_create_question_choices.rb +10 -0
  237. data/db/migrate/20120619142239_create_admin_notes.rb +17 -0
  238. data/db/migrate/20120619142255_move_admin_notes_to_comments.rb +25 -0
  239. data/db/migrate/20120619142315_add_fields_to_survey_template.rb +6 -0
  240. data/db/migrate/20120621124117_add_role_to_users.rb +5 -0
  241. data/db/migrate/20120625115344_rename_surveys_to_interviews.rb +5 -0
  242. data/db/migrate/20120625120613_rename_survey_relation_field.rb +7 -0
  243. data/db/migrate/20120625121230_rename_survey_results_to_interview_results.rb +5 -0
  244. data/db/migrate/20120625134119_add_type_field_to_interview_templates.rb +5 -0
  245. data/db/migrate/20120627104823_add_display_as_field_to_question.rb +5 -0
  246. data/db/migrate/20120628115724_rename_question_choices_to_answer_choices.rb +5 -0
  247. data/db/migrate/20120628124041_rename_answers_to_possible_answers.rb +5 -0
  248. data/db/migrate/20120628125515_rename_question_results_to_answers.rb +5 -0
  249. data/db/migrate/20120628125728_rename_questions_body_to_text.rb +5 -0
  250. data/db/migrate/20120628125839_rename_possible_answers_body_to_text.rb +5 -0
  251. data/db/migrate/20120628131944_fix_answer_choice_fields.rb +6 -0
  252. data/db/migrate/20120704144442_add_text_to_answer_choices.rb +5 -0
  253. data/db/migrate/20120706065743_add_body_from3rd_point_view_to_possible_answers.rb +5 -0
  254. data/db/migrate/20120706125136_change_facebook_id_and_twitter_id_type.rb +11 -0
  255. data/db/migrate/20120710070940_create_invitations.rb +10 -0
  256. data/db/migrate/20120710105054_create_delayed_jobs.rb +22 -0
  257. data/db/migrate/20120711084512_create_recommendations.rb +14 -0
  258. data/db/migrate/20120712092224_create_invitation_identifiers.rb +8 -0
  259. data/db/migrate/20120712130638_remove_user_id_from_recommendations.rb +9 -0
  260. data/db/migrate/20120712130711_remove_interview_template_id_from_recommendations.rb +9 -0
  261. data/db/migrate/20120712130744_add_invitation_id_to_recommendations.rb +5 -0
  262. data/db/migrate/20120716113646_create_contacts.rb +12 -0
  263. data/db/migrate/20120718135613_add_secret_to_interview_results.rb +5 -0
  264. data/db/migrate/20120718162312_fix_recommendation_relation.rb +5 -0
  265. data/db/migrate/20120724095308_add_state_to_interview_results.rb +5 -0
  266. data/db/migrate/20120724142439_create_carriers.rb +11 -0
  267. data/db/migrate/20120725071947_create_campaigns.rb +11 -0
  268. data/db/migrate/20120725083605_add_last_visited_path_to_users.rb +5 -0
  269. data/db/migrate/20120725085526_create_interesting_facts.rb +13 -0
  270. data/db/migrate/20120725131809_add_attachment_to_campaigns.rb +5 -0
  271. data/db/migrate/20120726115141_create_attachments.rb +10 -0
  272. data/db/migrate/20120726115644_extract_attachment_from_campaign.rb +11 -0
  273. data/db/migrate/20120726135706_create_buying_attempts.rb +11 -0
  274. data/db/migrate/20120727104402_add_campaign_id_to_interview_result.rb +5 -0
  275. data/db/migrate/20120730064404_change_interesting_facts.rb +6 -0
  276. data/db/migrate/20120730114402_add_attachment_id_to_interesting_facts.rb +5 -0
  277. data/db/migrate/20120730115758_remove_campaign_id_from_interesting_facts.rb +9 -0
  278. data/db/schema.rb +201 -0
  279. data/db/seeds.rb +86 -0
  280. data/doc/Ability.html +221 -0
  281. data/doc/Admin/InterviewHelper.html +292 -0
  282. data/doc/Answer.html +241 -0
  283. data/doc/AnswerChoice.html +296 -0
  284. data/doc/AnswersHelper.html +194 -0
  285. data/doc/ApplicationController.html +318 -0
  286. data/doc/ApplicationHelper.html +119 -0
  287. data/doc/CellPhoneInsuranceInterview.html +192 -0
  288. data/doc/Contact.html +186 -0
  289. data/doc/ContactsController.html +283 -0
  290. data/doc/CoreExtensions.html +129 -0
  291. data/doc/CoreExtensions/Object.html +210 -0
  292. data/doc/DefaultInterview.html +192 -0
  293. data/doc/DevelopmentMailInterceptor.html +203 -0
  294. data/doc/EmailValidator.html +210 -0
  295. data/doc/InterviewResult.html +251 -0
  296. data/doc/InterviewResultInvitationsController.html +218 -0
  297. data/doc/InterviewResultsController.html +280 -0
  298. data/doc/InterviewTemplate.html +330 -0
  299. data/doc/InterviewTemplatesController.html +145 -0
  300. data/doc/Invitation.html +362 -0
  301. data/doc/InvitationIdentifier.html +287 -0
  302. data/doc/InvitationMailer.html +218 -0
  303. data/doc/LayoutHelper.html +188 -0
  304. data/doc/NavLinksRenderer.html +214 -0
  305. data/doc/NumericQuestion.html +196 -0
  306. data/doc/OneCorrectQuestion.html +269 -0
  307. data/doc/PagesController.html +206 -0
  308. data/doc/PossibleAnswer.html +627 -0
  309. data/doc/Question.html +620 -0
  310. data/doc/Recommendation.html +186 -0
  311. data/doc/RecommendationHelper.html +292 -0
  312. data/doc/RecommendationsController.html +230 -0
  313. data/doc/ResourcesController.html +141 -0
  314. data/doc/ScaleQuestion.html +525 -0
  315. data/doc/SocialProvidersConfig.html +240 -0
  316. data/doc/User.html +677 -0
  317. data/doc/Users/OmniauthCallbacksController.html +542 -0
  318. data/doc/Wisemuv/Contacts.html +188 -0
  319. data/doc/Wisemuv/Contacts/Google/ControllerConcerns.html +204 -0
  320. data/doc/Wisemuv/Contacts/Google/ModelConcerns.html +128 -0
  321. data/doc/Wisemuv/Contacts/WindowsLive/ControllerConcerns.html +204 -0
  322. data/doc/Wisemuv/Contacts/WindowsLive/Grabber.html +307 -0
  323. data/doc/Wisemuv/Contacts/WindowsLive/ModelConcerns.html +128 -0
  324. data/doc/Wisemuv/Contacts/Yahoo/ControllerConcerns.html +206 -0
  325. data/doc/Wisemuv/Contacts/Yahoo/Grabber.html +526 -0
  326. data/doc/Wisemuv/Contacts/Yahoo/ModelConcerns.html +128 -0
  327. data/doc/YesNoQuestion.html +209 -0
  328. data/doc/_index.html +509 -0
  329. data/doc/carriers-campaigns-interviews-relationships.png +0 -0
  330. data/doc/class_list.html +61 -0
  331. data/doc/css/common.css +1 -0
  332. data/doc/css/cucumber.css +222 -0
  333. data/doc/css/full_list.css +57 -0
  334. data/doc/css/style.css +328 -0
  335. data/doc/feature_list.html +513 -0
  336. data/doc/file.README.html +152 -0
  337. data/doc/file_list.html +63 -0
  338. data/doc/frames.html +28 -0
  339. data/doc/index.html +152 -0
  340. data/doc/js/app.js +214 -0
  341. data/doc/js/cucumber.js +305 -0
  342. data/doc/js/full_list.js +173 -0
  343. data/doc/js/jquery.js +4 -0
  344. data/doc/method_list.html +740 -0
  345. data/doc/requirements.html +196 -0
  346. data/doc/requirements/features.html +180 -0
  347. data/doc/requirements/features/admin_manages_users.html +1260 -0
  348. data/doc/requirements/features/ask_friends_and_family.html +918 -0
  349. data/doc/requirements/features/create_interview.html +1734 -0
  350. data/doc/requirements/features/edit_interview.html +832 -0
  351. data/doc/requirements/features/pass_interview.html +757 -0
  352. data/doc/requirements/features/pulling_contacts.html +718 -0
  353. data/doc/requirements/features/questions_order_during_creating_interview.html +126 -0
  354. data/doc/requirements/features/sign_in.html +1035 -0
  355. data/doc/requirements/features/sign_up.html +1948 -0
  356. data/doc/requirements/step_transformers.html +10401 -0
  357. data/doc/requirements/tags.html +670 -0
  358. data/doc/requirements/tags/javascript.html +245 -0
  359. data/doc/requirements/tags/omniauth.html +165 -0
  360. data/doc/requirements/tags/users.html +227 -0
  361. data/doc/tag_list.html +82 -0
  362. data/doc/top-level-namespace.html +128 -0
  363. data/features/admin_manages_users.feature +57 -0
  364. data/features/ask_friends_and_family.feature +39 -0
  365. data/features/buying_tracking_code.feature +11 -0
  366. data/features/campaign_management.feature +42 -0
  367. data/features/create_interview.feature +74 -0
  368. data/features/edit_interview.feature +40 -0
  369. data/features/interesting_facts_parser.feature +11 -0
  370. data/features/interview_completion.feature +6 -0
  371. data/features/pass_interview.feature +31 -0
  372. data/features/pulling_contacts.feature +21 -0
  373. data/features/questions_order_during_creating_interview.feature +2 -0
  374. data/features/redirecting_after_signing_in.feature +19 -0
  375. data/features/sign_in.feature +51 -0
  376. data/features/sign_up.feature +43 -0
  377. data/features/step_definitions/admin_manages_users_steps.rb +91 -0
  378. data/features/step_definitions/ask_friends_and_family_steps.rb +41 -0
  379. data/features/step_definitions/buying_tracking_code_steps.rb +15 -0
  380. data/features/step_definitions/campaign_management_steps.rb +50 -0
  381. data/features/step_definitions/create_interview_steps.rb +130 -0
  382. data/features/step_definitions/edit_interview_steps.rb +35 -0
  383. data/features/step_definitions/interesting_facts_parser_steps.rb +34 -0
  384. data/features/step_definitions/interview_completion_steps.rb +8 -0
  385. data/features/step_definitions/interview_results_steps.rb +7 -0
  386. data/features/step_definitions/interview_steps.rb +11 -0
  387. data/features/step_definitions/pass_interview_steps.rb +52 -0
  388. data/features/step_definitions/pulling_contacts_steps.rb +24 -0
  389. data/features/step_definitions/redirecting_after_sign_in_steps.rb +19 -0
  390. data/features/step_definitions/sign_in_steps.rb +110 -0
  391. data/features/step_definitions/sign_up_steps.rb +56 -0
  392. data/features/support/env.rb +23 -0
  393. data/features/support/omniauth.rb +69 -0
  394. data/features/support/pickle.rb +26 -0
  395. data/features/support/uploading.rb +6 -0
  396. data/features/support/users.rb +18 -0
  397. data/features/upload-files/Life Insurance Facts-Final.xls +0 -0
  398. data/lib/assets/.gitkeep +0 -0
  399. data/lib/core_extensions/object.rb +9 -0
  400. data/lib/interceptors/development_mail_interceptor.rb +5 -0
  401. data/lib/social_providers_config.rb +10 -0
  402. data/lib/tasks/auto_annotate_models.rake +22 -0
  403. data/lib/tasks/cucumber.rake +65 -0
  404. data/lib/tasks/db/reseed.rake +12 -0
  405. data/lib/tasks/db/seed/interviews.rake +14 -0
  406. data/lib/tasks/db/truncate.rake +19 -0
  407. data/lib/tasks/yardoc.rake +19 -0
  408. data/lib/validators/email_validator.rb +7 -0
  409. data/lib/wisemuv/contacts.rb +5 -0
  410. data/lib/wisemuv/contacts/google/controller_concerns.rb +19 -0
  411. data/lib/wisemuv/contacts/google/model_concerns.rb +17 -0
  412. data/lib/wisemuv/contacts/windows_live/controller_concerns.rb +23 -0
  413. data/lib/wisemuv/contacts/windows_live/grabber.rb +22 -0
  414. data/lib/wisemuv/contacts/windows_live/model_concerns.rb +17 -0
  415. data/lib/wisemuv/contacts/yahoo/controller_concerns.rb +29 -0
  416. data/lib/wisemuv/contacts/yahoo/grabber.rb +55 -0
  417. data/lib/wisemuv/contacts/yahoo/model_concerns.rb +17 -0
  418. data/lib/wisemuv/interesting_facts_parser.rb +65 -0
  419. data/log/.gitkeep +0 -0
  420. data/public/403.html +26 -0
  421. data/public/404.html +26 -0
  422. data/public/422.html +26 -0
  423. data/public/500.html +25 -0
  424. data/public/ZeroClipboard10.swf +0 -0
  425. data/public/favicon.ico +0 -0
  426. data/public/robots.txt +5 -0
  427. data/script/cucumber +10 -0
  428. data/script/delayed_job +5 -0
  429. data/script/rails +6 -0
  430. data/spec/factories/answer.rb +6 -0
  431. data/spec/factories/answer_choice.rb +6 -0
  432. data/spec/factories/attachment.rb +11 -0
  433. data/spec/factories/buying_attempts.rb +8 -0
  434. data/spec/factories/campaign.rb +8 -0
  435. data/spec/factories/carrier.rb +6 -0
  436. data/spec/factories/contact.rb +8 -0
  437. data/spec/factories/interesting_facts.rb +10 -0
  438. data/spec/factories/interview_result.rb +27 -0
  439. data/spec/factories/interview_template.rb +46 -0
  440. data/spec/factories/invitation_identifier.rb +8 -0
  441. data/spec/factories/possible_answer.rb +23 -0
  442. data/spec/factories/question.rb +55 -0
  443. data/spec/factories/recommendation.rb +10 -0
  444. data/spec/factories/user.rb +21 -0
  445. data/spec/mailers/invitation_mailer_spec.rb +5 -0
  446. data/spec/models/answer_spec.rb +5 -0
  447. data/spec/models/attachment_spec.rb +5 -0
  448. data/spec/models/buying_attempt_spec.rb +5 -0
  449. data/spec/models/campaign_spec.rb +5 -0
  450. data/spec/models/carrier_spec.rb +5 -0
  451. data/spec/models/contact_spec.rb +5 -0
  452. data/spec/models/interesting_fact_spec.rb +5 -0
  453. data/spec/models/invitation_identifier_spec.rb +5 -0
  454. data/spec/models/question_choice_spec.rb +5 -0
  455. data/spec/models/question_result_spec.rb +5 -0
  456. data/spec/models/question_spec.rb +5 -0
  457. data/spec/models/recommendation_spec.rb +5 -0
  458. data/spec/models/survey_result_spec.rb +5 -0
  459. data/spec/models/survey_template_spec.rb +5 -0
  460. data/spec/spec_helper.rb +32 -0
  461. data/vendor/.rvmrc +53 -0
  462. data/vendor/Gemfile +60 -0
  463. data/vendor/Gemfile.lock +166 -0
  464. data/vendor/README.rdoc +261 -0
  465. data/vendor/Rakefile +7 -0
  466. data/vendor/assets/javascripts/ZeroClipboard.js +316 -0
  467. data/vendor/assets/javascripts/selectToUISlider.js +240 -0
  468. data/vendor/assets/javascripts/underscore.string.js +566 -0
  469. data/vendor/assets/stylesheets/.gitkeep +0 -0
  470. data/vendor/config.ru +4 -0
  471. data/vendor/plugins/.gitkeep +0 -0
  472. metadata +504 -55
  473. data/README.markdown +0 -44
  474. data/lib/shell-spinner.rb +0 -52
  475. data/lib/shell-spinner/version.rb +0 -3
  476. data/shell-spinner.gemspec +0 -18
@@ -0,0 +1,35 @@
1
+ When /^(?:|I )should see link to edit the interview$/ do
2
+ page.should have_css('.member_link.edit_link')
3
+ end
4
+
5
+ When /^(?:|I )follow the link to edit the interview$/ do
6
+ click_link 'Edit'
7
+ end
8
+
9
+ When /^(?:|I )go to edit interview "(.*)" page$/ do |interview|
10
+ visit edit_admin_interview_path InterviewTemplate.find_by_title(interview)
11
+ end
12
+
13
+ When /^(?:|I )go to pass interview "(.*)" page$/ do |interview|
14
+ visit new_interview_result_path(InterviewTemplate.find_by_title(interview))
15
+ end
16
+
17
+ When /^(?:|I )change interview's type to cell phone insurance$/ do
18
+ select 'Cell Phone Insurance', :from => 'Algorithm'
19
+ end
20
+
21
+ Then /^(?:|I )should see that interview has been updated$/ do
22
+ page.should have_content('Interview template was successfully updated')
23
+ end
24
+
25
+ Then /^(?:|I )should see "(.*)"$/ do |text|
26
+ page.should have_content(text)
27
+ end
28
+
29
+ Then /^interview "(.*)" type must be cell phone insurance$/ do |interview|
30
+ InterviewTemplate.find_by_title(interview).type.should be_eql('CellPhoneInsuranceInterview')
31
+ end
32
+
33
+ Then /^(?:|I )should see that interview type is set to Cell Phone Insurance$/ do
34
+ page.evaluate_script("$('#interview_template_type').val()").should be_eql('CellPhoneInsuranceInterview')
35
+ end
@@ -0,0 +1,34 @@
1
+ When /^I parse sample excel spreadsheet$/ do
2
+ @data = Wisemuv::InterestingFactsParser.parse ConfigMe.interesting_facts_source.sample,
3
+ line_number: ConfigMe.interesting_facts_source.line_number,
4
+ spreadsheet_number: ConfigMe.interesting_facts_source.spreadsheet_number
5
+ end
6
+
7
+ Then /^there is about (\d+) interesting facts should be found$/ do |count|
8
+ @data.should have(count.to_i).records
9
+ end
10
+
11
+ Given /^a "(.*?)" campaign exists$/ do |campaign_title|
12
+ FactoryGirl.create :campaign, title: campaign_title
13
+ end
14
+
15
+ When /^I attach sample excel spreadsheet to the "(.*?)" campaign$/ do |campaign_title|
16
+ campaign = Campaign.find_by_title(campaign_title)
17
+ campaign.attachment = FactoryGirl.create :attachment, :sample
18
+ campaign.save
19
+ end
20
+
21
+ Then /^"(.*?)" campaign should have at least (\d+) interesting facts$/ do |campaign_title, interesting_facts_count|
22
+ Campaign.find_by_title(campaign_title).interesting_facts.should have(interesting_facts_count).records
23
+ end
24
+
25
+ Then /^each of the found interesting fact should be valid$/ do
26
+ @facts = []
27
+
28
+ @data.each do |params|
29
+ @facts << InterestingFact.new(params)
30
+ end
31
+
32
+ @facts.all?(&:valid?).should be_true
33
+ end
34
+
@@ -0,0 +1,8 @@
1
+ When /^I answered last question of the "(.*?)" interview$/ do |interview_name|
2
+ result = FactoryGirl.build :interview_result, :simple, :interview_template => InterviewTemplate.find_by_title(interview_name)
3
+ result.save
4
+ end
5
+
6
+ Then /^interview "(.*?)" should be completed by me$/ do |interview_name|
7
+ InterviewTemplate.find_by_title(interview_name).results.first.should be_completed
8
+ end
@@ -0,0 +1,7 @@
1
+ When /^I pass "(.*?)" interview$/ do |title|
2
+ @interview = InterviewTemplate.find_by_title(title) || raise(ActiveRecord::RecordNotFound)
3
+ # kludge for a user
4
+ @user = User.find_by_email 'arnie@wisemuv.com'
5
+ @result = FactoryGirl.create :interview_result, :simple, :interview_template => @interview, :user => @user
6
+ visit interview_result_path(@interview, @result)
7
+ end
@@ -0,0 +1,11 @@
1
+ Given /^interview "(.*?)" with yes-no questions exists$/ do |title|
2
+ FactoryGirl.create :interview_template, :with_yes_no_questions, :title => title
3
+ end
4
+
5
+ Given /^interview "(.*?)" with questions of different types exits$/ do |title|
6
+ FactoryGirl.create :interview_with_combined_questions, :title => title
7
+ end
8
+
9
+ Given /^interview "(.*?)" exists$/ do |title|
10
+ FactoryGirl.create :interview_template, :simple, :title => title
11
+ end
@@ -0,0 +1,52 @@
1
+ When /^(?:|I )answer all questions$/ do
2
+ page.execute_script("$(':radio').each(function(){$(this).click()})")
3
+ end
4
+
5
+ When /^(?:|I )submit interview form$/ do
6
+ click_button 'Save'
7
+ end
8
+
9
+ When /^(?:|I )follow the link to pass the interview$/ do
10
+ find('.l-interview-links a').click
11
+ end
12
+
13
+ When /^(?:|I )visit pass "(.*?)" interview page$/ do |title|
14
+ visit new_interview_result_path(InterviewTemplate.find_by_title(title))
15
+ end
16
+
17
+ Then /^(?:|I )should see that my interview result has been saved$/ do
18
+ page.should have_css('.alert-success')
19
+ page.should have_content('successfully created')
20
+ end
21
+
22
+ Then /^(?:|I )should see validation errors$/ do
23
+ page.should have_css('.alert-error')
24
+ end
25
+
26
+ Then /^(?:|I )should see link to pass the interview$/ do
27
+ page.should have_css('.l-interview-links')
28
+ end
29
+
30
+ Then /^(?:|I )should see interview's form$/ do
31
+ page.should have_css('.l-interview')
32
+ end
33
+
34
+ Then /^(?:|I )should see radio buttons$/ do
35
+ page.should have_css('.interview_result .choices-group')
36
+ end
37
+
38
+ Then /^(?:|I )should see select$/ do
39
+ page.should have_css('.interview_result .select.input')
40
+ end
41
+
42
+ Then /^(?:|I )I should see numeric field$/ do
43
+ page.should have_css('.interview_result .number.input.numeric')
44
+ end
45
+
46
+ Then /^(?:|I )I should see slider$/ do
47
+ page.should have_css('.interview_result .b-slider .select.input')
48
+ end
49
+
50
+ Then /^show me the page$/ do
51
+ save_and_open_page
52
+ end
@@ -0,0 +1,24 @@
1
+ When /^I ask for a contacts from "(.*?)"$/ do |provider|
2
+ visit import_contacts_path(:provider => provider)
3
+ end
4
+
5
+ Then /^I should be redirected to the google authentication page$/ do
6
+ page.should have_content 'Google'
7
+ page.should have_content 'permission to access'
8
+ end
9
+
10
+ Then /^I should be redirected to the yahoo authentication page$/ do
11
+ page.should have_content 'Sign in to Yahoo!'
12
+ end
13
+
14
+ Then /^I should be redirected to the windowslive authentication page$/ do
15
+ page.should have_content 'Windows Live'
16
+ end
17
+
18
+ Then /^I should see that this page cannot be found$/ do
19
+ page.should have_content "The page you were looking for doesn't exist."
20
+ end
21
+
22
+ Then /^I should be redirected to the sign in page$/ do
23
+ step %(I should see authentication error)
24
+ end
@@ -0,0 +1,19 @@
1
+ Given /^regular user uncompleted interview "(.*?)"$/ do |interview_name|
2
+ FactoryGirl.build :interview_result, :uncompleted, :interview_template => InterviewTemplate.find_by_title(interview_name)
3
+ end
4
+
5
+ Then /^I should be redirected to the "(.*?)" interview path$/ do |interview_name|
6
+ page.should have_content interview_name and page.should have_content 'Save'
7
+ end
8
+
9
+ Given /^regular user completed interview "(.*?)"$/ do |interview_name|
10
+ FactoryGirl.create :interview_result, :simple, :interview_template => InterviewTemplate.find_by_title(interview_name), :user => @regular_user
11
+ end
12
+
13
+ Then /^I should be redirected to the "(.*?)" interview results$/ do |interview_name|
14
+ page.should have_content interview_name and page.should_not have_content 'Save'
15
+ end
16
+
17
+ Then /^I should be redirected to the homepage$/ do
18
+ page.should have_content "You may pass following interviews:"
19
+ end
@@ -0,0 +1,110 @@
1
+ When /^(?:|I )visit home page$/ do
2
+ visit root_path
3
+ end
4
+
5
+ When /^(?:|I )click sign in link$/ do
6
+ click_link('Sign up / Sign in')
7
+ end
8
+
9
+ When /^(?:|I )login via Facebook$/ do
10
+ visit '/users/auth/facebook'
11
+ end
12
+
13
+ When /^(?:|I )login via Twitter$/ do
14
+ visit '/users/auth/twitter'
15
+ end
16
+
17
+ When /^(?:|I )login via Google$/ do
18
+ visit '/users/auth/google_oauth2'
19
+ end
20
+
21
+ When /^(?:|I )login via Linked In$/ do
22
+ visit '/users/auth/linkedin'
23
+ end
24
+
25
+ When /^(?:|I )login via Windows Live ID$/ do
26
+ visit '/users/auth/windowslive'
27
+ end
28
+
29
+ When /^(?:|I )login via Yahoo!$/ do
30
+ visit '/users/auth/yahoo'
31
+ end
32
+
33
+ When /^(?:|I )provide correct email address$/ do
34
+ fill_in 'user_email', :with => 'arnie@wisemuv.com'
35
+ end
36
+
37
+ When /^(?:|I )provide correct admin email address$/ do
38
+ fill_in 'user_email', :with => 'admin@wisemuv.com'
39
+ end
40
+
41
+ When /^(?:|I )provide correct manager email address$/ do
42
+ fill_in 'user_email', :with => 'manager@wisemuv.com'
43
+ end
44
+
45
+ When /^(?:|I )provide correct manager password$/ do
46
+ fill_in 'user_password', :with => 'wisemuv'
47
+ end
48
+
49
+ When /^(?:|I )provide correct password$/ do
50
+ fill_in 'user_password', :with => 'wisemuv'
51
+ end
52
+
53
+ When /^(?:|I )provide correct admin password$/ do
54
+ fill_in 'user_password', :with => 'wisemuv'
55
+ end
56
+
57
+ When /^(?:|I )submit login form$/ do
58
+ find_button('Sign In').click
59
+ end
60
+
61
+ When /^(?:|I )I open modal window to sign in$/ do
62
+ step 'visit home page'
63
+ step 'click sign in link'
64
+ end
65
+
66
+ When /^user "(.*?)" exists$/ do |email|
67
+ FactoryGirl.create :user, :email => email
68
+ end
69
+
70
+ Then /^(?:|I )should see sign in link$/ do
71
+ page.should have_content('Sign up / Sign in')
72
+ end
73
+
74
+ Then /^(?:|I )should see modal window$/ do
75
+ page.should have_css('#sign_in.in')
76
+ end
77
+
78
+ Then /^(?:|I )should see that I has logged in via Facebook$/ do
79
+ page.should have_css('.b-social-provider.facebook')
80
+ end
81
+
82
+ Then /^(?:|I )should see that I has logged in via Twitter/ do
83
+ page.should have_css('.b-social-provider.twitter')
84
+ end
85
+
86
+ Then /^(?:|I )should see that I has logged in via Google/ do
87
+ page.should have_css('.b-social-provider.google')
88
+ end
89
+
90
+ Then /^(?:|I )should see that I has logged in via Linked In/ do
91
+ page.should have_css('.b-social-provider.linkedin')
92
+ end
93
+
94
+ Then /^(?:|I )should see that I has logged in via Yahoo!/ do
95
+ page.should have_css('.b-social-provider.yahoo')
96
+ end
97
+
98
+ Then /^(?:|I )should see that I has logged in via Windows Live ID/ do
99
+ page.should have_css('.b-social-provider.windowslive')
100
+ end
101
+
102
+ Then /^(?:|I )should see that I'm successfully authenticated as regular user$/ do
103
+ page.should have_css('.b-profile-link')
104
+ page.should_not have_link('Admin')
105
+ end
106
+
107
+ Then /^(?:|I )should see that I'm successfully authenticated as admin user$/ do
108
+ page.should have_css('.b-profile-link')
109
+ page.should have_link('Admin')
110
+ end
@@ -0,0 +1,56 @@
1
+ When /^(?:|I )click sign up link$/ do
2
+ click_link('Sign up')
3
+ end
4
+
5
+ When /^(?:|I )visit sign up page$/ do
6
+ visit sign_up_path
7
+ end
8
+
9
+ When /^(?:|I )fill first name field$/ do
10
+ fill_in 'user_first_name', :with => 'Arnold'
11
+ end
12
+
13
+ When /^(?:|I )fill last name field$/ do
14
+ fill_in 'user_last_name', :with => 'Schwarzenegger'
15
+ end
16
+
17
+ When /^(?:|I )fill first name with "(.*?)"$/ do |first_name|
18
+ fill_in 'user_first_name', :with => first_name
19
+ end
20
+
21
+ When /^(?:|I )fill last name with "(.*?)"$/ do |last_name|
22
+ fill_in 'user_last_name', :with => last_name
23
+ end
24
+
25
+ When /^I fill email with "(.*?)"$/ do |email|
26
+ fill_in 'user_email', :with => email
27
+ end
28
+
29
+ When /^I fill password with "(.*?)"$/ do |password|
30
+ fill_in 'user_password', :with => password
31
+ end
32
+
33
+ When /^I fill password confirmation with "(.*?)"$/ do |password_confirmation|
34
+ fill_in 'user_password_confirmation', :with => password_confirmation
35
+ end
36
+
37
+ When /^(?:|I )submit sign up form$/ do
38
+ find_button('Sign up').click
39
+ end
40
+
41
+ When /^(?:|I )sign out$/ do
42
+ delete sign_out_path
43
+ end
44
+
45
+ Then /^(?:|I )should see sign up form$/ do
46
+ page.should have_css('#new_user')
47
+ end
48
+
49
+ Then /^(?:|I )should see that I'm successfully signed up$/ do
50
+ page.should have_css('.b-profile-link')
51
+ page.should have_content('You have signed up successfully')
52
+ end
53
+
54
+ Then /^(?:|I )should see that I'm not signed up$/ do
55
+ page.should have_css('#error_explanation')
56
+ end
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+ require 'spork'
3
+
4
+ Spork.prefork do
5
+ require 'cucumber/rails'
6
+ require 'capybara-webkit'
7
+
8
+ Capybara.default_selector = :css
9
+ Capybara.javascript_driver = :webkit
10
+
11
+ ActionController::Base.allow_rescue = false
12
+ DatabaseCleaner.strategy = :transaction
13
+ Cucumber::Rails::Database.javascript_strategy = :truncation
14
+ end
15
+
16
+ Spork.each_run do
17
+ # Clean up the screenshots
18
+ FileUtils.rm_rf Rails.root.join('tmp/capybara').to_s
19
+
20
+ FactoryGirl.definition_file_paths = [ Rails.root.join('spec', 'factories') ]
21
+ FactoryGirl.factories.clear
22
+ FactoryGirl.find_definitions
23
+ end
@@ -0,0 +1,69 @@
1
+ Before('@omniauth') do
2
+ OmniAuth.config.test_mode = true
3
+
4
+ OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new(
5
+ 'extra' => {
6
+ 'raw_info' => {
7
+ 'id' => '123123123',
8
+ 'email' => 'winnie@pooh.com',
9
+ 'first_name' => 'Winnie',
10
+ 'last_name' => 'Pooh',
11
+ }
12
+ }
13
+ )
14
+
15
+ OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new(
16
+ 'extra' => {
17
+ 'raw_info' => {
18
+ 'id' => '123123123',
19
+ 'name' => 'Winnie-the-Pooh'
20
+ }
21
+ }
22
+ )
23
+
24
+ OmniAuth.config.mock_auth[:google_oauth2] = OmniAuth::AuthHash.new(
25
+ 'extra' => {
26
+ 'raw_info' => {
27
+ 'id' => '123123123',
28
+ 'email' => 'winnie@pooh.com',
29
+ 'given_name' => 'Winnie',
30
+ 'family_name' => 'the Pooh'
31
+ }
32
+ }
33
+ )
34
+
35
+ OmniAuth.config.mock_auth[:linkedin] = OmniAuth::AuthHash.new(
36
+ 'extra' => {
37
+ 'raw_info' => {
38
+ 'id' => '123123123asd',
39
+ 'firstName' => 'Winnie',
40
+ 'lastName' => 'the Pooh'
41
+ }
42
+ }
43
+ )
44
+
45
+ OmniAuth.config.mock_auth[:yahoo] = OmniAuth::AuthHash.new(
46
+ 'extra' => {
47
+ 'raw_info' => {
48
+ 'profile' => {
49
+ 'guid' => '123123123asd',
50
+ 'nickname' => 'Winnie the Pooh'
51
+ }
52
+ }
53
+ }
54
+ )
55
+
56
+ OmniAuth.config.mock_auth[:windowslive] = OmniAuth::AuthHash.new(
57
+ 'extra' => {
58
+ 'raw_info' => {
59
+ 'id' => '123123123asd',
60
+ 'first_name' => 'Winnie',
61
+ 'last_name' => 'Pooh'
62
+ }
63
+ }
64
+ )
65
+ end
66
+
67
+ After('@omniauth') do
68
+ OmniAuth.config.test_mode = false
69
+ end