alchemy_crm 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (240) hide show
  1. data/.gitignore +22 -0
  2. data/.travis.yml +12 -0
  3. data/Gemfile +21 -0
  4. data/Guardfile +13 -0
  5. data/LICENSE +24 -0
  6. data/README.md +82 -0
  7. data/Rakefile +27 -0
  8. data/alchemy_crm.gemspec +31 -0
  9. data/app/assets/images/.DS_Store +0 -0
  10. data/app/assets/images/alchemy_crm/.DS_Store +0 -0
  11. data/app/assets/images/alchemy_crm/contact-icons.png +0 -0
  12. data/app/assets/images/alchemy_crm/fill_content.gif +0 -0
  13. data/app/assets/images/alchemy_crm/group-icons.png +0 -0
  14. data/app/assets/images/alchemy_crm/mailing-icons.png +0 -0
  15. data/app/assets/images/alchemy_crm/module_icon.png +0 -0
  16. data/app/assets/images/alchemy_crm/newsletter-icons.png +0 -0
  17. data/app/assets/images/alchemy_crm/statistic.png +0 -0
  18. data/app/assets/images/alchemy_crm/tag-icons.png +0 -0
  19. data/app/assets/javascripts/alchemy_crm/alchemy_crm.base.js +65 -0
  20. data/app/assets/javascripts/alchemy_crm/scripts.js +2 -0
  21. data/app/assets/stylesheets/alchemy_crm/base.css.scss +473 -0
  22. data/app/assets/stylesheets/alchemy_crm/styles.css +3 -0
  23. data/app/controllers/alchemy_crm/admin/base_controller.rb +7 -0
  24. data/app/controllers/alchemy_crm/admin/contact_groups_controller.rb +23 -0
  25. data/app/controllers/alchemy_crm/admin/contacts_controller.rb +112 -0
  26. data/app/controllers/alchemy_crm/admin/deliveries_controller.rb +80 -0
  27. data/app/controllers/alchemy_crm/admin/elements_controller_extension.rb +32 -0
  28. data/app/controllers/alchemy_crm/admin/mailings_controller.rb +47 -0
  29. data/app/controllers/alchemy_crm/admin/newsletters_controller.rb +24 -0
  30. data/app/controllers/alchemy_crm/admin/tags_controller.rb +62 -0
  31. data/app/controllers/alchemy_crm/base_controller.rb +5 -0
  32. data/app/controllers/alchemy_crm/contacts_controller.rb +103 -0
  33. data/app/controllers/alchemy_crm/mailings_controller.rb +20 -0
  34. data/app/controllers/alchemy_crm/recipients_controller.rb +35 -0
  35. data/app/controllers/alchemy_crm/subscriptions_controller.rb +57 -0
  36. data/app/helpers/alchemy/pages_helper_extension.rb +18 -0
  37. data/app/helpers/alchemy_crm/admin/base_helper.rb +12 -0
  38. data/app/helpers/alchemy_crm/mailings_helper.rb +190 -0
  39. data/app/mailers/alchemy_crm/bounce_receiver.rb +13 -0
  40. data/app/mailers/alchemy_crm/contacts_mailer.rb +26 -0
  41. data/app/mailers/alchemy_crm/mailings_mailer.rb +48 -0
  42. data/app/mailers/alchemy_crm/subscriptions_mailer.rb +17 -0
  43. data/app/models/alchemy/essence_element_teaser.rb +19 -0
  44. data/app/models/alchemy_crm/contact.rb +264 -0
  45. data/app/models/alchemy_crm/contact_group.rb +26 -0
  46. data/app/models/alchemy_crm/contact_group_filter.rb +26 -0
  47. data/app/models/alchemy_crm/delivery.rb +57 -0
  48. data/app/models/alchemy_crm/element_extension.rb +28 -0
  49. data/app/models/alchemy_crm/mailing.rb +93 -0
  50. data/app/models/alchemy_crm/newsletter.rb +48 -0
  51. data/app/models/alchemy_crm/reaction.rb +9 -0
  52. data/app/models/alchemy_crm/recipient.rb +48 -0
  53. data/app/models/alchemy_crm/subscription.rb +8 -0
  54. data/app/views/alchemy/admin/elements/_view_not_found.text.erb +0 -0
  55. data/app/views/alchemy/admin/elements/fill.js.erb +13 -0
  56. data/app/views/alchemy/admin/elements/link.js.erb +1 -0
  57. data/app/views/alchemy/elements/_newsletter_article_editor.html.erb +4 -0
  58. data/app/views/alchemy/elements/_newsletter_article_view.html.erb +16 -0
  59. data/app/views/alchemy/elements/_newsletter_article_view.text.erb +5 -0
  60. data/app/views/alchemy/elements/_newsletter_greeting_editor.html.erb +3 -0
  61. data/app/views/alchemy/elements/_newsletter_greeting_view.html.erb +11 -0
  62. data/app/views/alchemy/elements/_newsletter_greeting_view.text.erb +6 -0
  63. data/app/views/alchemy/elements/_newsletter_signout_form_editor.html.erb +3 -0
  64. data/app/views/alchemy/elements/_newsletter_signout_form_view.html.erb +32 -0
  65. data/app/views/alchemy/elements/_newsletter_signout_mail_editor.html.erb +4 -0
  66. data/app/views/alchemy/elements/_newsletter_signup_form_editor.html.erb +6 -0
  67. data/app/views/alchemy/elements/_newsletter_signup_form_view.html.erb +78 -0
  68. data/app/views/alchemy/elements/_newsletter_signup_mail_editor.html.erb +4 -0
  69. data/app/views/alchemy/essences/_essence_date_view.text.erb +3 -0
  70. data/app/views/alchemy/essences/_essence_element_teaser_editor.html.erb +31 -0
  71. data/app/views/alchemy/essences/_essence_element_teaser_view.html.erb +1 -0
  72. data/app/views/alchemy/essences/_essence_element_teaser_view.text.erb +3 -0
  73. data/app/views/alchemy/essences/_essence_richtext_view.text.erb +1 -0
  74. data/app/views/alchemy/essences/_essence_text_view.text.erb +1 -0
  75. data/app/views/alchemy/newsletter_layouts/_standard.html.erb +39 -0
  76. data/app/views/alchemy/newsletter_layouts/_standard.text.erb +5 -0
  77. data/app/views/alchemy_crm/admin/contact_groups/_contact_group.html.erb +32 -0
  78. data/app/views/alchemy_crm/admin/contact_groups/_filter.html.erb +30 -0
  79. data/app/views/alchemy_crm/admin/contact_groups/_form.html.erb +47 -0
  80. data/app/views/alchemy_crm/admin/contact_groups/_tag.html.erb +6 -0
  81. data/app/views/alchemy_crm/admin/contact_groups/add_filter.js.erb +9 -0
  82. data/app/views/alchemy_crm/admin/contact_groups/destroy.rjs +1 -0
  83. data/app/views/alchemy_crm/admin/contact_groups/edit.html.erb +1 -0
  84. data/app/views/alchemy_crm/admin/contact_groups/index.html.erb +41 -0
  85. data/app/views/alchemy_crm/admin/contact_groups/new.html.erb +1 -0
  86. data/app/views/alchemy_crm/admin/contacts/_contact.html.erb +44 -0
  87. data/app/views/alchemy_crm/admin/contacts/_form.html.erb +86 -0
  88. data/app/views/alchemy_crm/admin/contacts/destroy.rjs +1 -0
  89. data/app/views/alchemy_crm/admin/contacts/edit.html.erb +1 -0
  90. data/app/views/alchemy_crm/admin/contacts/import.html.erb +33 -0
  91. data/app/views/alchemy_crm/admin/contacts/import.js.erb +2 -0
  92. data/app/views/alchemy_crm/admin/contacts/index.html.erb +51 -0
  93. data/app/views/alchemy_crm/admin/contacts/new.html.erb +1 -0
  94. data/app/views/alchemy_crm/admin/contacts/vcf_import_result.html.erb +49 -0
  95. data/app/views/alchemy_crm/admin/deliveries/_delivery.html.erb +41 -0
  96. data/app/views/alchemy_crm/admin/deliveries/_form.html.erb +65 -0
  97. data/app/views/alchemy_crm/admin/deliveries/_recipient.html.erb +40 -0
  98. data/app/views/alchemy_crm/admin/deliveries/edit.html.erb +1 -0
  99. data/app/views/alchemy_crm/admin/deliveries/index.html.erb +29 -0
  100. data/app/views/alchemy_crm/admin/deliveries/new.html.erb +1 -0
  101. data/app/views/alchemy_crm/admin/deliveries/show.html.erb +66 -0
  102. data/app/views/alchemy_crm/admin/elements/link.rjs +4 -0
  103. data/app/views/alchemy_crm/admin/elements/teasables.html.erb +57 -0
  104. data/app/views/alchemy_crm/admin/mailings/_form.html.erb +43 -0
  105. data/app/views/alchemy_crm/admin/mailings/_mailing.html.erb +75 -0
  106. data/app/views/alchemy_crm/admin/mailings/edit.html.erb +1 -0
  107. data/app/views/alchemy_crm/admin/mailings/edit_content.html.erb +194 -0
  108. data/app/views/alchemy_crm/admin/mailings/import_result.html.erb +37 -0
  109. data/app/views/alchemy_crm/admin/mailings/index.html.erb +39 -0
  110. data/app/views/alchemy_crm/admin/mailings/new.html.erb +1 -0
  111. data/app/views/alchemy_crm/admin/mailings/show.html.erb +1 -0
  112. data/app/views/alchemy_crm/admin/mailings/show.text.erb +1 -0
  113. data/app/views/alchemy_crm/admin/newsletters/_form.html.erb +54 -0
  114. data/app/views/alchemy_crm/admin/newsletters/_newsletter.html.erb +42 -0
  115. data/app/views/alchemy_crm/admin/newsletters/_tag_with_radiobutton.html.erb +7 -0
  116. data/app/views/alchemy_crm/admin/newsletters/destroy.rjs +1 -0
  117. data/app/views/alchemy_crm/admin/newsletters/edit.html.erb +1 -0
  118. data/app/views/alchemy_crm/admin/newsletters/index.html.erb +42 -0
  119. data/app/views/alchemy_crm/admin/newsletters/new.html.erb +10 -0
  120. data/app/views/alchemy_crm/admin/tags/_radio_tag.html.erb +6 -0
  121. data/app/views/alchemy_crm/admin/tags/_tag.html.erb +32 -0
  122. data/app/views/alchemy_crm/admin/tags/edit.html.erb +40 -0
  123. data/app/views/alchemy_crm/admin/tags/index.html.erb +35 -0
  124. data/app/views/alchemy_crm/admin/tags/new.html.erb +16 -0
  125. data/app/views/alchemy_crm/contacts_mailer/signout_mail.html.erb +8 -0
  126. data/app/views/alchemy_crm/contacts_mailer/signout_mail.text.erb +4 -0
  127. data/app/views/alchemy_crm/contacts_mailer/signup_mail.html.erb +11 -0
  128. data/app/views/alchemy_crm/contacts_mailer/signup_mail.text.erb +4 -0
  129. data/app/views/alchemy_crm/mailings/show.html.erb +1 -0
  130. data/app/views/alchemy_crm/mailings_mailer/verification_mail.html.erb +11 -0
  131. data/app/views/alchemy_crm/subscriptions/index.html.erb +23 -0
  132. data/app/views/alchemy_crm/subscriptions_mailer/overview_mail.html.erb +27 -0
  133. data/app/views/alchemy_crm/subscriptions_mailer/overview_mail.text.erb +19 -0
  134. data/app/views/csv_magic/import_errors.html.erb +44 -0
  135. data/app/views/csv_magic/mapper.html.erb +62 -0
  136. data/app/views/layouts/alchemy_crm/mailings.html.erb +212 -0
  137. data/app/views/layouts/alchemy_crm/mailings.text.erb +3 -0
  138. data/config/alchemy_crm.config.yml +21 -0
  139. data/config/authorization_rules.rb +37 -0
  140. data/config/initializers/assets.rb +4 -0
  141. data/config/initializers/delayed_job.rb +6 -0
  142. data/config/locales/alchemy.de.yml +55 -0
  143. data/config/locales/alchemy.en.yml +52 -0
  144. data/config/locales/alchemy_crm.de.yml +196 -0
  145. data/config/locales/alchemy_crm.en.yml +53 -0
  146. data/config/locales/localized_country_select.de.rb +268 -0
  147. data/config/locales/localized_country_select.en.rb +282 -0
  148. data/config/module_definition.yml +30 -0
  149. data/config/routes.rb +71 -0
  150. data/db/migrate/20100708220434_create_mailings.rb +19 -0
  151. data/db/migrate/20100708220534_create_contacts.rb +27 -0
  152. data/db/migrate/20100708220812_create_contact_groups.rb +13 -0
  153. data/db/migrate/20100708221009_create_newsletters.rb +15 -0
  154. data/db/migrate/20100708221319_create_sent_mailings.rb +15 -0
  155. data/db/migrate/20100708221529_create_recipients.rb +21 -0
  156. data/db/migrate/20100708222620_acts_as_taggable_migration.rb +28 -0
  157. data/db/migrate/20100708223324_create_contact_group_filters.rb +17 -0
  158. data/db/migrate/20100708223727_create_newsletter_subscriptions.rb +14 -0
  159. data/db/migrate/20100708223922_create_essence_element_teasers.rb +15 -0
  160. data/db/migrate/20100714172207_create_contact_groups_newsletters.rb +12 -0
  161. data/db/migrate/20100927152601_create_reactions.rb +14 -0
  162. data/db/migrate/20111028091722_acts_as_taggable_on_migration.rb +15 -0
  163. data/db/migrate/20111028200710_add_counter_cache_columns_for_tags.rb +11 -0
  164. data/db/migrate/20111030204931_create_delayed_jobs.rb +21 -0
  165. data/db/migrate/20111104105854_add_deliver_at_to_sent_mailings.rb +9 -0
  166. data/db/migrate/20111104125306_remove_sent_mailing_pdf_id_from_sent_mailings.rb +9 -0
  167. data/db/migrate/20111104131912_add_delivered_at_to_sent_mailings.rb +9 -0
  168. data/db/migrate/20111124145923_namespace_alchemy_crm_models.rb +17 -0
  169. data/db/migrate/20120306115555_add_disabled_to_alchemy_crm_contacts.rb +5 -0
  170. data/db/migrate/20120307160721_rename_alchemy_crm_recipients_sent_mailing_id.rb +5 -0
  171. data/db/migrate/20120315113522_add_url_to_alchemy_crm_reactions.rb +5 -0
  172. data/db/migrate/20120316161333_add_sha1_and_salt_to_alchemy_crm_recipients.rb +6 -0
  173. data/db/migrate/20120320103412_add_indexes_to_alchemy_crm_sha1_columns.rb +7 -0
  174. data/db/migrate/20120321105455_add_queue_to_delayed_jobs.rb +9 -0
  175. data/db/migrate/20120327174301_add_more_indexes_to_alchemy_crm_tables.rb +12 -0
  176. data/lib/alchemy_crm.rb +18 -0
  177. data/lib/alchemy_crm/bounced_delivery.rb +46 -0
  178. data/lib/alchemy_crm/config.rb +28 -0
  179. data/lib/alchemy_crm/engine.rb +40 -0
  180. data/lib/alchemy_crm/i18n_helpers.rb +35 -0
  181. data/lib/alchemy_crm/newsletter_layout.rb +40 -0
  182. data/lib/alchemy_crm/seeder.rb +30 -0
  183. data/lib/alchemy_crm/version.rb +3 -0
  184. data/lib/generators/alchemy_crm/scaffold/files/_standard.html.erb +1 -0
  185. data/lib/generators/alchemy_crm/scaffold/files/_standard.text.erb +1 -0
  186. data/lib/generators/alchemy_crm/scaffold/files/elements.yml +51 -0
  187. data/lib/generators/alchemy_crm/scaffold/files/newsletter_layouts.yml +3 -0
  188. data/lib/generators/alchemy_crm/scaffold/files/newsletters.html.erb +22 -0
  189. data/lib/generators/alchemy_crm/scaffold/files/newsletters.text.erb +4 -0
  190. data/lib/generators/alchemy_crm/scaffold/files/page_layouts.yml +19 -0
  191. data/lib/generators/alchemy_crm/scaffold/scaffold_generator.rb +26 -0
  192. data/lib/tasks/alchemy_crm.rake +28 -0
  193. data/lib/tasks/routes.rake +29 -0
  194. data/rails/init.rb +1 -0
  195. data/recipes/alchemy-mailings-capistrano-tasks.rb +12 -0
  196. data/spec/alchemy_mailings_spec.rb +7 -0
  197. data/spec/config_spec.rb +28 -0
  198. data/spec/controllers/alchemy_crm/contacts_controller_spec.rb +210 -0
  199. data/spec/controllers/alchemy_crm/mailings_controller_spec.rb +89 -0
  200. data/spec/controllers/alchemy_crm/recipients_controller_spec.rb +155 -0
  201. data/spec/dummy/Rakefile +7 -0
  202. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  203. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  204. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  205. data/spec/dummy/config.ru +4 -0
  206. data/spec/dummy/config/alchemy/config.yml +142 -0
  207. data/spec/dummy/config/alchemy/elements.yml +79 -0
  208. data/spec/dummy/config/alchemy/newsletter_layouts.yml +4 -0
  209. data/spec/dummy/config/alchemy/page_layouts.yml +55 -0
  210. data/spec/dummy/config/application.rb +43 -0
  211. data/spec/dummy/config/boot.rb +10 -0
  212. data/spec/dummy/config/database.yml +22 -0
  213. data/spec/dummy/config/environment.rb +5 -0
  214. data/spec/dummy/config/environments/development.rb +30 -0
  215. data/spec/dummy/config/environments/production.rb +60 -0
  216. data/spec/dummy/config/environments/test.rb +39 -0
  217. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  218. data/spec/dummy/config/initializers/inflections.rb +10 -0
  219. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  220. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  221. data/spec/dummy/config/initializers/session_store.rb +8 -0
  222. data/spec/dummy/config/locales/en.yml +5 -0
  223. data/spec/dummy/config/routes.rb +4 -0
  224. data/spec/dummy/db/schema.rb +452 -0
  225. data/spec/dummy/public/404.html +26 -0
  226. data/spec/dummy/public/422.html +26 -0
  227. data/spec/dummy/public/500.html +26 -0
  228. data/spec/dummy/public/favicon.ico +0 -0
  229. data/spec/dummy/script/rails +6 -0
  230. data/spec/helpers/alchemy_crm/mailings_helper_spec.rb +169 -0
  231. data/spec/mailers/alchemy_crm/contacts_mailer_spec.rb +88 -0
  232. data/spec/mailers/alchemy_crm/mailings_mailer_spec.rb +42 -0
  233. data/spec/models/alchemy_crm/contact_group_spec.rb +41 -0
  234. data/spec/models/alchemy_crm/contact_spec.rb +108 -0
  235. data/spec/models/alchemy_crm/delivery_spec.rb +55 -0
  236. data/spec/models/alchemy_crm/mailing_spec.rb +63 -0
  237. data/spec/models/alchemy_crm/newsletter_spec.rb +45 -0
  238. data/spec/spec_helper.rb +58 -0
  239. data/vendor/assets/javascripts/autocomplete-rails.js +16 -0
  240. metadata +438 -0
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ module AlchemyCrm
4
+ describe Delivery do
5
+
6
+ before(:each) do
7
+ @emails = ["jim@family.com", "jon@doe.com", "jane@family.com", "john@gmail.com", "jaja@binks.com", "lulu@fame.org"]
8
+ @mailing = Mailing.create!(
9
+ :name => 'Mailing',
10
+ :additional_email_addresses => @emails.join(', '),
11
+ :newsletter => Newsletter.create!(:name => 'Newsletter', :layout => 'standard')
12
+ )
13
+ @delivery = Delivery.create!(:mailing => @mailing)
14
+ @recipients = @delivery.recipients
15
+ end
16
+
17
+ describe '#send_chunks' do
18
+
19
+ it "should send mailings to recipients in chunks." do
20
+ AlchemyCrm::Delivery.stub!(:settings).and_return(2)
21
+ @delivery.should_receive(:send_mail_chunk).once.with(@recipients[0..1], {})
22
+ @delivery.should_receive(:send_mail_chunk).once.with(@recipients[2..3], {})
23
+ @delivery.should_receive(:send_mail_chunk).once.with(@recipients[4..5], {})
24
+ @delivery.send_chunks
25
+ end
26
+
27
+ end
28
+
29
+ describe '#after_create' do
30
+
31
+ it "should create recipients from mailings contacts" do
32
+ @recipients.first.should be_an_instance_of(Recipient)
33
+ @recipients.count.should == @mailing.contacts.count
34
+ end
35
+
36
+ context "mailing having former deliveries" do
37
+
38
+ before(:each) do
39
+ @more_emails = %w(tim@struppi.de mickey@mouse.com)
40
+ @mailing.additional_email_addresses += ", #{@more_emails.join(', ')}"
41
+ @mailing.save
42
+ @delivery = Delivery.create!(:mailing => @mailing)
43
+ end
44
+
45
+ it "should not create recipients for former recipients" do
46
+ @mailing.recipients.should_not be_empty
47
+ @delivery.recipients.collect(&:email).should == @more_emails
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ module AlchemyCrm
4
+ describe Mailing do
5
+
6
+ before(:all) do
7
+ @mailing = Mailing.new(:name => 'Mailing', :additional_email_addresses => "jim@family.com, jon@doe.com, jane@family.com, \n")
8
+ @newsletter = Newsletter.create!(:name => 'Newsletter', :layout => 'newsletter_layout_standard')
9
+ @mailing.newsletter = @newsletter
10
+ @mailing.save!
11
+ end
12
+
13
+ describe "#additional_emails" do
14
+
15
+ it "should return an array with email adresses" do
16
+ @mailing.additional_emails.should == ["jim@family.com", "jon@doe.com", "jane@family.com"]
17
+ end
18
+
19
+ end
20
+
21
+ describe "#contacts_from_additional_email_addresses" do
22
+
23
+ it "should return an array of contacts" do
24
+ @mailing.contacts_from_additional_email_addresses.collect(&:email).should == ["jim@family.com", "jon@doe.com", "jane@family.com"]
25
+ end
26
+
27
+ end
28
+
29
+ describe "#contacts" do
30
+
31
+ before(:each) do
32
+ @verified_contact = Contact.new(:email => 'jon@doe.com', :firstname => 'Jon', :lastname => 'Doe', :salutation => 'mr')
33
+ @verified_contact.verified = true
34
+ @verified_contact.save!
35
+ @subscription = Subscription.create!(:contact => @verified_contact, :newsletter => @newsletter, :verified => true, :wants => true)
36
+ end
37
+
38
+ it "should return all contacts from additional email addresses and newsletter contacts" do
39
+ @mailing.contacts.collect(&:email).should == ["jon@doe.com", "jim@family.com", "jane@family.com"]
40
+ end
41
+
42
+ end
43
+
44
+ describe '#before_create' do
45
+
46
+ it "should set sha1 and salt" do
47
+ @mailing.sha1.should_not be_nil
48
+ @mailing.salt.should_not be_nil
49
+ end
50
+
51
+ end
52
+
53
+ describe '#after_create' do
54
+
55
+ it "should create a page with correct page layout" do
56
+ @mailing.page.should be_an_instance_of(Alchemy::Page)
57
+ @mailing.page.page_layout.should == "newsletter_layout_standard"
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ module AlchemyCrm
4
+ describe Newsletter do
5
+
6
+ before(:each) do
7
+ @newsletter = Newsletter.create!(:name => 'Newsletter', :layout => 'standard')
8
+ @verified_contact = Contact.create!({:email => 'jon@doe.com', :firstname => 'Jon', :lastname => 'Doe', :salutation => 'mr', :verified => true}, :as => :admin)
9
+ @subscription = Subscription.create!(:contact => @verified_contact, :newsletter => @newsletter, :verified => true, :wants => true)
10
+ @contact = Contact.create!(:email => 'jon_2@doe.com', :firstname => 'Jon', :lastname => 'Doe', :salutation => 'mr')
11
+ @father = Contact.create!({:email => 'father@family.com', :firstname => 'Jon', :lastname => 'Doe', :salutation => 'mr', :tag_list => 'father', :verified => true}, :as => :admin)
12
+ @mother = Contact.create!({:email => 'mother@family.com', :firstname => 'Jane', :lastname => 'Doe', :salutation => 'ms', :tag_list => 'mother', :verified => true}, :as => :admin)
13
+ @son = Contact.create!(:email => 'son@family.com', :firstname => 'Jim', :lastname => 'Doe', :salutation => 'mr', :tag_list => 'son')
14
+
15
+ @subscription_2 = Subscription.create!(:contact => @contact, :newsletter => @newsletter)
16
+
17
+ @contact_group = @newsletter.contact_groups.create!(:name => 'Family', :contact_tag_list => 'father, mother, son')
18
+ end
19
+
20
+ describe "Contacts" do
21
+
22
+ it "should have collection for all verified subscribers" do
23
+ @newsletter.verified_subscribers.should == [@verified_contact]
24
+ end
25
+
26
+ it "should have collection for all verified contact group contacts" do
27
+ @newsletter.verified_contact_group_contacts.should == [@father, @mother]
28
+ end
29
+
30
+ it "should have collection for all verified contacts" do
31
+ @newsletter.contacts.should == [@father, @mother, @verified_contact]
32
+ end
33
+
34
+ end
35
+
36
+ describe "#humanized_name" do
37
+
38
+ it "should return a string composed of name and contacts count" do
39
+ @newsletter.humanized_name.should == "Newsletter (3)"
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,58 @@
1
+ begin
2
+ require 'spork'
3
+ rescue LoadError => e
4
+ end
5
+
6
+ def configure
7
+ # Configure Rails Environment
8
+ ENV["RAILS_ENV"] = "test"
9
+
10
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
11
+
12
+ require 'database_cleaner'
13
+ DatabaseCleaner.strategy = :truncation
14
+
15
+ require "rails/test_help"
16
+ require "rspec/rails"
17
+ require "email_spec"
18
+
19
+ ActionMailer::Base.delivery_method = :test
20
+ ActionMailer::Base.perform_deliveries = true
21
+ ActionMailer::Base.default_url_options[:host] = "test.com"
22
+
23
+ Rails.backtrace_cleaner.remove_silencers!
24
+
25
+ # Load support files
26
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
27
+
28
+ RSpec.configure do |config|
29
+ # Remove this line if you don't want RSpec's should and should_not
30
+ # methods or matchers
31
+ require 'rspec/expectations'
32
+ config.include RSpec::Matchers
33
+ # for testing mails
34
+ config.include(EmailSpec::Helpers)
35
+ config.include(EmailSpec::Matchers)
36
+ config.use_transactional_fixtures = true
37
+ # == Mock Framework
38
+ config.mock_with :rspec
39
+ end
40
+
41
+ end
42
+
43
+ def seed
44
+ # This code will be run each time you run your specs.
45
+ DatabaseCleaner.clean
46
+
47
+ # Seed the database
48
+ Alchemy::Seeder.seed!
49
+ AlchemyCrm::Seeder.seed!
50
+ end
51
+
52
+ if defined?(Spork)
53
+ Spork.prefork { configure }
54
+ Spork.each_run { seed }
55
+ else
56
+ configure
57
+ seed
58
+ end
@@ -0,0 +1,16 @@
1
+ /*
2
+ * Unobtrusive autocomplete
3
+ *
4
+ * To use it, you just have to include the HTML attribute autocomplete
5
+ * with the autocomplete URL as the value
6
+ *
7
+ * Example:
8
+ * <input type="text" data-autocomplete="/url/to/autocomplete">
9
+ *
10
+ * Optionally, you can use a jQuery selector to specify a field that can
11
+ * be updated with the element id whenever you find a matching value
12
+ *
13
+ * Example:
14
+ * <input type="text" data-autocomplete="/url/to/autocomplete" data-id-element="#id_field">
15
+ */
16
+ (function($) {$(document).ready(function(){$("input[data-autocomplete]").railsAutocomplete()}),function(a){var b=null;a.fn.railsAutocomplete=function(){return this.live("focus",function(){this.railsAutoCompleter||(this.railsAutoCompleter=new a.railsAutocomplete(this))})},a.railsAutocomplete=function(a){_e=a,this.init(_e)},a.railsAutocomplete.fn=a.railsAutocomplete.prototype={railsAutocomplete:"0.0.1"},a.railsAutocomplete.fn.extend=a.railsAutocomplete.extend=a.extend,a.railsAutocomplete.fn.extend({init:function(a){function b(b){return b.split(a.delimiter)}function c(a){return b(a).pop().replace(/^\s+/,"")}a.delimiter=$(a).attr("data-delimiter")||null,$(a).autocomplete({source:function(b,d){$.getJSON($(a).attr("data-autocomplete"),{term:c(b.term)},function(){$(arguments[0]).each(function(b,c){var d={};d[c.id]=c,$(a).data(d)}),d.apply(null,arguments)})},search:function(){var a=c(this.value);if(a.length<2)return!1},focus:function(){return!1},select:function(c,d){var f=b(this.value);f.pop(),f.push(d.item.value);if(a.delimiter!=null)f.push(""),this.value=f.join(a.delimiter);else{this.value=f.join(""),$(this).attr("data-id-element")&&$($(this).attr("data-id-element")).val(d.item.id);if($(this).attr("data-update-elements")){var g=$(this).data(d.item.id.toString()),h=$.parseJSON($(this).attr("data-update-elements"));for(var i in h)$(h[i]).val(g[i])}}var j=this.value;return $(this).bind("keyup.clearId",function(){$(this).val().trim()!=j.trim()&&($($(this).attr("data-id-element")).val(""),$(this).unbind("keyup.clearId"))}),$(this).trigger("railsAutocomplete.select",d),!1}})}})}(jQuery);})(jQuery);
metadata ADDED
@@ -0,0 +1,438 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alchemy_crm
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Thomas von Deyen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: alchemy_cms
16
+ requirement: &70252795385220 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.1.7
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70252795385220
25
+ - !ruby/object:Gem::Dependency
26
+ name: vcard
27
+ requirement: &70252795375960 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 0.1.1
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70252795375960
36
+ - !ruby/object:Gem::Dependency
37
+ name: csv_magic
38
+ requirement: &70252795375060 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 0.2.2
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70252795375060
47
+ - !ruby/object:Gem::Dependency
48
+ name: delayed_job_active_record
49
+ requirement: &70252795374540 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 0.3.2
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70252795374540
58
+ - !ruby/object:Gem::Dependency
59
+ name: acts-as-taggable-on
60
+ requirement: &70252795373940 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 2.1.0
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *70252795373940
69
+ - !ruby/object:Gem::Dependency
70
+ name: rails3-jquery-autocomplete
71
+ requirement: &70252795372760 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 1.0.4
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70252795372760
80
+ - !ruby/object:Gem::Dependency
81
+ name: magic-localized_country_select
82
+ requirement: &70252795371760 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: 0.2.0
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *70252795371760
91
+ - !ruby/object:Gem::Dependency
92
+ name: rspec-rails
93
+ requirement: &70252795369660 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 2.8.0
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70252795369660
102
+ - !ruby/object:Gem::Dependency
103
+ name: sqlite3
104
+ requirement: &70252795351660 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.3.5
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70252795351660
113
+ description: A fully featured CRM / Newsletter and Mailings Module for Alchemy CMS.
114
+ Building and sending Newsletters has never been easier!
115
+ email:
116
+ - tvd@magiclabs.de
117
+ executables: []
118
+ extensions: []
119
+ extra_rdoc_files: []
120
+ files:
121
+ - .gitignore
122
+ - .travis.yml
123
+ - Gemfile
124
+ - Guardfile
125
+ - LICENSE
126
+ - README.md
127
+ - Rakefile
128
+ - alchemy_crm.gemspec
129
+ - app/assets/images/.DS_Store
130
+ - app/assets/images/alchemy_crm/.DS_Store
131
+ - app/assets/images/alchemy_crm/contact-icons.png
132
+ - app/assets/images/alchemy_crm/fill_content.gif
133
+ - app/assets/images/alchemy_crm/group-icons.png
134
+ - app/assets/images/alchemy_crm/mailing-icons.png
135
+ - app/assets/images/alchemy_crm/module_icon.png
136
+ - app/assets/images/alchemy_crm/newsletter-icons.png
137
+ - app/assets/images/alchemy_crm/statistic.png
138
+ - app/assets/images/alchemy_crm/tag-icons.png
139
+ - app/assets/javascripts/alchemy_crm/alchemy_crm.base.js
140
+ - app/assets/javascripts/alchemy_crm/scripts.js
141
+ - app/assets/stylesheets/alchemy_crm/base.css.scss
142
+ - app/assets/stylesheets/alchemy_crm/styles.css
143
+ - app/controllers/alchemy_crm/admin/base_controller.rb
144
+ - app/controllers/alchemy_crm/admin/contact_groups_controller.rb
145
+ - app/controllers/alchemy_crm/admin/contacts_controller.rb
146
+ - app/controllers/alchemy_crm/admin/deliveries_controller.rb
147
+ - app/controllers/alchemy_crm/admin/elements_controller_extension.rb
148
+ - app/controllers/alchemy_crm/admin/mailings_controller.rb
149
+ - app/controllers/alchemy_crm/admin/newsletters_controller.rb
150
+ - app/controllers/alchemy_crm/admin/tags_controller.rb
151
+ - app/controllers/alchemy_crm/base_controller.rb
152
+ - app/controllers/alchemy_crm/contacts_controller.rb
153
+ - app/controllers/alchemy_crm/mailings_controller.rb
154
+ - app/controllers/alchemy_crm/recipients_controller.rb
155
+ - app/controllers/alchemy_crm/subscriptions_controller.rb
156
+ - app/helpers/alchemy/pages_helper_extension.rb
157
+ - app/helpers/alchemy_crm/admin/base_helper.rb
158
+ - app/helpers/alchemy_crm/mailings_helper.rb
159
+ - app/mailers/alchemy_crm/bounce_receiver.rb
160
+ - app/mailers/alchemy_crm/contacts_mailer.rb
161
+ - app/mailers/alchemy_crm/mailings_mailer.rb
162
+ - app/mailers/alchemy_crm/subscriptions_mailer.rb
163
+ - app/models/alchemy/essence_element_teaser.rb
164
+ - app/models/alchemy_crm/contact.rb
165
+ - app/models/alchemy_crm/contact_group.rb
166
+ - app/models/alchemy_crm/contact_group_filter.rb
167
+ - app/models/alchemy_crm/delivery.rb
168
+ - app/models/alchemy_crm/element_extension.rb
169
+ - app/models/alchemy_crm/mailing.rb
170
+ - app/models/alchemy_crm/newsletter.rb
171
+ - app/models/alchemy_crm/reaction.rb
172
+ - app/models/alchemy_crm/recipient.rb
173
+ - app/models/alchemy_crm/subscription.rb
174
+ - app/views/alchemy/admin/elements/_view_not_found.text.erb
175
+ - app/views/alchemy/admin/elements/fill.js.erb
176
+ - app/views/alchemy/admin/elements/link.js.erb
177
+ - app/views/alchemy/elements/_newsletter_article_editor.html.erb
178
+ - app/views/alchemy/elements/_newsletter_article_view.html.erb
179
+ - app/views/alchemy/elements/_newsletter_article_view.text.erb
180
+ - app/views/alchemy/elements/_newsletter_greeting_editor.html.erb
181
+ - app/views/alchemy/elements/_newsletter_greeting_view.html.erb
182
+ - app/views/alchemy/elements/_newsletter_greeting_view.text.erb
183
+ - app/views/alchemy/elements/_newsletter_signout_form_editor.html.erb
184
+ - app/views/alchemy/elements/_newsletter_signout_form_view.html.erb
185
+ - app/views/alchemy/elements/_newsletter_signout_mail_editor.html.erb
186
+ - app/views/alchemy/elements/_newsletter_signup_form_editor.html.erb
187
+ - app/views/alchemy/elements/_newsletter_signup_form_view.html.erb
188
+ - app/views/alchemy/elements/_newsletter_signup_mail_editor.html.erb
189
+ - app/views/alchemy/essences/_essence_date_view.text.erb
190
+ - app/views/alchemy/essences/_essence_element_teaser_editor.html.erb
191
+ - app/views/alchemy/essences/_essence_element_teaser_view.html.erb
192
+ - app/views/alchemy/essences/_essence_element_teaser_view.text.erb
193
+ - app/views/alchemy/essences/_essence_richtext_view.text.erb
194
+ - app/views/alchemy/essences/_essence_text_view.text.erb
195
+ - app/views/alchemy/newsletter_layouts/_standard.html.erb
196
+ - app/views/alchemy/newsletter_layouts/_standard.text.erb
197
+ - app/views/alchemy_crm/admin/contact_groups/_contact_group.html.erb
198
+ - app/views/alchemy_crm/admin/contact_groups/_filter.html.erb
199
+ - app/views/alchemy_crm/admin/contact_groups/_form.html.erb
200
+ - app/views/alchemy_crm/admin/contact_groups/_tag.html.erb
201
+ - app/views/alchemy_crm/admin/contact_groups/add_filter.js.erb
202
+ - app/views/alchemy_crm/admin/contact_groups/destroy.rjs
203
+ - app/views/alchemy_crm/admin/contact_groups/edit.html.erb
204
+ - app/views/alchemy_crm/admin/contact_groups/index.html.erb
205
+ - app/views/alchemy_crm/admin/contact_groups/new.html.erb
206
+ - app/views/alchemy_crm/admin/contacts/_contact.html.erb
207
+ - app/views/alchemy_crm/admin/contacts/_form.html.erb
208
+ - app/views/alchemy_crm/admin/contacts/destroy.rjs
209
+ - app/views/alchemy_crm/admin/contacts/edit.html.erb
210
+ - app/views/alchemy_crm/admin/contacts/import.html.erb
211
+ - app/views/alchemy_crm/admin/contacts/import.js.erb
212
+ - app/views/alchemy_crm/admin/contacts/index.html.erb
213
+ - app/views/alchemy_crm/admin/contacts/new.html.erb
214
+ - app/views/alchemy_crm/admin/contacts/vcf_import_result.html.erb
215
+ - app/views/alchemy_crm/admin/deliveries/_delivery.html.erb
216
+ - app/views/alchemy_crm/admin/deliveries/_form.html.erb
217
+ - app/views/alchemy_crm/admin/deliveries/_recipient.html.erb
218
+ - app/views/alchemy_crm/admin/deliveries/edit.html.erb
219
+ - app/views/alchemy_crm/admin/deliveries/index.html.erb
220
+ - app/views/alchemy_crm/admin/deliveries/new.html.erb
221
+ - app/views/alchemy_crm/admin/deliveries/show.html.erb
222
+ - app/views/alchemy_crm/admin/elements/link.rjs
223
+ - app/views/alchemy_crm/admin/elements/teasables.html.erb
224
+ - app/views/alchemy_crm/admin/mailings/_form.html.erb
225
+ - app/views/alchemy_crm/admin/mailings/_mailing.html.erb
226
+ - app/views/alchemy_crm/admin/mailings/edit.html.erb
227
+ - app/views/alchemy_crm/admin/mailings/edit_content.html.erb
228
+ - app/views/alchemy_crm/admin/mailings/import_result.html.erb
229
+ - app/views/alchemy_crm/admin/mailings/index.html.erb
230
+ - app/views/alchemy_crm/admin/mailings/new.html.erb
231
+ - app/views/alchemy_crm/admin/mailings/show.html.erb
232
+ - app/views/alchemy_crm/admin/mailings/show.text.erb
233
+ - app/views/alchemy_crm/admin/newsletters/_form.html.erb
234
+ - app/views/alchemy_crm/admin/newsletters/_newsletter.html.erb
235
+ - app/views/alchemy_crm/admin/newsletters/_tag_with_radiobutton.html.erb
236
+ - app/views/alchemy_crm/admin/newsletters/destroy.rjs
237
+ - app/views/alchemy_crm/admin/newsletters/edit.html.erb
238
+ - app/views/alchemy_crm/admin/newsletters/index.html.erb
239
+ - app/views/alchemy_crm/admin/newsletters/new.html.erb
240
+ - app/views/alchemy_crm/admin/tags/_radio_tag.html.erb
241
+ - app/views/alchemy_crm/admin/tags/_tag.html.erb
242
+ - app/views/alchemy_crm/admin/tags/edit.html.erb
243
+ - app/views/alchemy_crm/admin/tags/index.html.erb
244
+ - app/views/alchemy_crm/admin/tags/new.html.erb
245
+ - app/views/alchemy_crm/contacts_mailer/signout_mail.html.erb
246
+ - app/views/alchemy_crm/contacts_mailer/signout_mail.text.erb
247
+ - app/views/alchemy_crm/contacts_mailer/signup_mail.html.erb
248
+ - app/views/alchemy_crm/contacts_mailer/signup_mail.text.erb
249
+ - app/views/alchemy_crm/mailings/show.html.erb
250
+ - app/views/alchemy_crm/mailings_mailer/verification_mail.html.erb
251
+ - app/views/alchemy_crm/subscriptions/index.html.erb
252
+ - app/views/alchemy_crm/subscriptions_mailer/overview_mail.html.erb
253
+ - app/views/alchemy_crm/subscriptions_mailer/overview_mail.text.erb
254
+ - app/views/csv_magic/import_errors.html.erb
255
+ - app/views/csv_magic/mapper.html.erb
256
+ - app/views/layouts/alchemy_crm/mailings.html.erb
257
+ - app/views/layouts/alchemy_crm/mailings.text.erb
258
+ - config/alchemy_crm.config.yml
259
+ - config/authorization_rules.rb
260
+ - config/initializers/assets.rb
261
+ - config/initializers/delayed_job.rb
262
+ - config/locales/alchemy.de.yml
263
+ - config/locales/alchemy.en.yml
264
+ - config/locales/alchemy_crm.de.yml
265
+ - config/locales/alchemy_crm.en.yml
266
+ - config/locales/localized_country_select.de.rb
267
+ - config/locales/localized_country_select.en.rb
268
+ - config/module_definition.yml
269
+ - config/routes.rb
270
+ - db/migrate/20100708220434_create_mailings.rb
271
+ - db/migrate/20100708220534_create_contacts.rb
272
+ - db/migrate/20100708220812_create_contact_groups.rb
273
+ - db/migrate/20100708221009_create_newsletters.rb
274
+ - db/migrate/20100708221319_create_sent_mailings.rb
275
+ - db/migrate/20100708221529_create_recipients.rb
276
+ - db/migrate/20100708222620_acts_as_taggable_migration.rb
277
+ - db/migrate/20100708223324_create_contact_group_filters.rb
278
+ - db/migrate/20100708223727_create_newsletter_subscriptions.rb
279
+ - db/migrate/20100708223922_create_essence_element_teasers.rb
280
+ - db/migrate/20100714172207_create_contact_groups_newsletters.rb
281
+ - db/migrate/20100927152601_create_reactions.rb
282
+ - db/migrate/20111028091722_acts_as_taggable_on_migration.rb
283
+ - db/migrate/20111028200710_add_counter_cache_columns_for_tags.rb
284
+ - db/migrate/20111030204931_create_delayed_jobs.rb
285
+ - db/migrate/20111104105854_add_deliver_at_to_sent_mailings.rb
286
+ - db/migrate/20111104125306_remove_sent_mailing_pdf_id_from_sent_mailings.rb
287
+ - db/migrate/20111104131912_add_delivered_at_to_sent_mailings.rb
288
+ - db/migrate/20111124145923_namespace_alchemy_crm_models.rb
289
+ - db/migrate/20120306115555_add_disabled_to_alchemy_crm_contacts.rb
290
+ - db/migrate/20120307160721_rename_alchemy_crm_recipients_sent_mailing_id.rb
291
+ - db/migrate/20120315113522_add_url_to_alchemy_crm_reactions.rb
292
+ - db/migrate/20120316161333_add_sha1_and_salt_to_alchemy_crm_recipients.rb
293
+ - db/migrate/20120320103412_add_indexes_to_alchemy_crm_sha1_columns.rb
294
+ - db/migrate/20120321105455_add_queue_to_delayed_jobs.rb
295
+ - db/migrate/20120327174301_add_more_indexes_to_alchemy_crm_tables.rb
296
+ - lib/alchemy_crm.rb
297
+ - lib/alchemy_crm/bounced_delivery.rb
298
+ - lib/alchemy_crm/config.rb
299
+ - lib/alchemy_crm/engine.rb
300
+ - lib/alchemy_crm/i18n_helpers.rb
301
+ - lib/alchemy_crm/newsletter_layout.rb
302
+ - lib/alchemy_crm/seeder.rb
303
+ - lib/alchemy_crm/version.rb
304
+ - lib/generators/alchemy_crm/scaffold/files/_standard.html.erb
305
+ - lib/generators/alchemy_crm/scaffold/files/_standard.text.erb
306
+ - lib/generators/alchemy_crm/scaffold/files/elements.yml
307
+ - lib/generators/alchemy_crm/scaffold/files/newsletter_layouts.yml
308
+ - lib/generators/alchemy_crm/scaffold/files/newsletters.html.erb
309
+ - lib/generators/alchemy_crm/scaffold/files/newsletters.text.erb
310
+ - lib/generators/alchemy_crm/scaffold/files/page_layouts.yml
311
+ - lib/generators/alchemy_crm/scaffold/scaffold_generator.rb
312
+ - lib/tasks/alchemy_crm.rake
313
+ - lib/tasks/routes.rake
314
+ - rails/init.rb
315
+ - recipes/alchemy-mailings-capistrano-tasks.rb
316
+ - spec/alchemy_mailings_spec.rb
317
+ - spec/config_spec.rb
318
+ - spec/controllers/alchemy_crm/contacts_controller_spec.rb
319
+ - spec/controllers/alchemy_crm/mailings_controller_spec.rb
320
+ - spec/controllers/alchemy_crm/recipients_controller_spec.rb
321
+ - spec/dummy/Rakefile
322
+ - spec/dummy/app/controllers/application_controller.rb
323
+ - spec/dummy/app/helpers/application_helper.rb
324
+ - spec/dummy/app/views/layouts/application.html.erb
325
+ - spec/dummy/config.ru
326
+ - spec/dummy/config/alchemy/config.yml
327
+ - spec/dummy/config/alchemy/elements.yml
328
+ - spec/dummy/config/alchemy/newsletter_layouts.yml
329
+ - spec/dummy/config/alchemy/page_layouts.yml
330
+ - spec/dummy/config/application.rb
331
+ - spec/dummy/config/boot.rb
332
+ - spec/dummy/config/database.yml
333
+ - spec/dummy/config/environment.rb
334
+ - spec/dummy/config/environments/development.rb
335
+ - spec/dummy/config/environments/production.rb
336
+ - spec/dummy/config/environments/test.rb
337
+ - spec/dummy/config/initializers/backtrace_silencers.rb
338
+ - spec/dummy/config/initializers/inflections.rb
339
+ - spec/dummy/config/initializers/mime_types.rb
340
+ - spec/dummy/config/initializers/secret_token.rb
341
+ - spec/dummy/config/initializers/session_store.rb
342
+ - spec/dummy/config/locales/en.yml
343
+ - spec/dummy/config/routes.rb
344
+ - spec/dummy/db/schema.rb
345
+ - spec/dummy/log/production.log
346
+ - spec/dummy/log/server.log
347
+ - spec/dummy/public/404.html
348
+ - spec/dummy/public/422.html
349
+ - spec/dummy/public/500.html
350
+ - spec/dummy/public/favicon.ico
351
+ - spec/dummy/script/rails
352
+ - spec/helpers/alchemy_crm/mailings_helper_spec.rb
353
+ - spec/mailers/alchemy_crm/contacts_mailer_spec.rb
354
+ - spec/mailers/alchemy_crm/mailings_mailer_spec.rb
355
+ - spec/models/alchemy_crm/contact_group_spec.rb
356
+ - spec/models/alchemy_crm/contact_spec.rb
357
+ - spec/models/alchemy_crm/delivery_spec.rb
358
+ - spec/models/alchemy_crm/mailing_spec.rb
359
+ - spec/models/alchemy_crm/newsletter_spec.rb
360
+ - spec/spec_helper.rb
361
+ - vendor/assets/javascripts/autocomplete-rails.js
362
+ homepage: http://alchemy-cms.com
363
+ licenses:
364
+ - BSD New
365
+ post_install_message:
366
+ rdoc_options: []
367
+ require_paths:
368
+ - lib
369
+ required_ruby_version: !ruby/object:Gem::Requirement
370
+ none: false
371
+ requirements:
372
+ - - ! '>='
373
+ - !ruby/object:Gem::Version
374
+ version: '0'
375
+ segments:
376
+ - 0
377
+ hash: -2719722105629080639
378
+ required_rubygems_version: !ruby/object:Gem::Requirement
379
+ none: false
380
+ requirements:
381
+ - - ! '>='
382
+ - !ruby/object:Gem::Version
383
+ version: '0'
384
+ segments:
385
+ - 0
386
+ hash: -2719722105629080639
387
+ requirements: []
388
+ rubyforge_project:
389
+ rubygems_version: 1.8.15
390
+ signing_key:
391
+ specification_version: 3
392
+ summary: A fully featured CRM / Newsletter and Mailings Module for Alchemy CMS.
393
+ test_files:
394
+ - spec/alchemy_mailings_spec.rb
395
+ - spec/config_spec.rb
396
+ - spec/controllers/alchemy_crm/contacts_controller_spec.rb
397
+ - spec/controllers/alchemy_crm/mailings_controller_spec.rb
398
+ - spec/controllers/alchemy_crm/recipients_controller_spec.rb
399
+ - spec/dummy/Rakefile
400
+ - spec/dummy/app/controllers/application_controller.rb
401
+ - spec/dummy/app/helpers/application_helper.rb
402
+ - spec/dummy/app/views/layouts/application.html.erb
403
+ - spec/dummy/config.ru
404
+ - spec/dummy/config/alchemy/config.yml
405
+ - spec/dummy/config/alchemy/elements.yml
406
+ - spec/dummy/config/alchemy/newsletter_layouts.yml
407
+ - spec/dummy/config/alchemy/page_layouts.yml
408
+ - spec/dummy/config/application.rb
409
+ - spec/dummy/config/boot.rb
410
+ - spec/dummy/config/database.yml
411
+ - spec/dummy/config/environment.rb
412
+ - spec/dummy/config/environments/development.rb
413
+ - spec/dummy/config/environments/production.rb
414
+ - spec/dummy/config/environments/test.rb
415
+ - spec/dummy/config/initializers/backtrace_silencers.rb
416
+ - spec/dummy/config/initializers/inflections.rb
417
+ - spec/dummy/config/initializers/mime_types.rb
418
+ - spec/dummy/config/initializers/secret_token.rb
419
+ - spec/dummy/config/initializers/session_store.rb
420
+ - spec/dummy/config/locales/en.yml
421
+ - spec/dummy/config/routes.rb
422
+ - spec/dummy/db/schema.rb
423
+ - spec/dummy/log/production.log
424
+ - spec/dummy/log/server.log
425
+ - spec/dummy/public/404.html
426
+ - spec/dummy/public/422.html
427
+ - spec/dummy/public/500.html
428
+ - spec/dummy/public/favicon.ico
429
+ - spec/dummy/script/rails
430
+ - spec/helpers/alchemy_crm/mailings_helper_spec.rb
431
+ - spec/mailers/alchemy_crm/contacts_mailer_spec.rb
432
+ - spec/mailers/alchemy_crm/mailings_mailer_spec.rb
433
+ - spec/models/alchemy_crm/contact_group_spec.rb
434
+ - spec/models/alchemy_crm/contact_spec.rb
435
+ - spec/models/alchemy_crm/delivery_spec.rb
436
+ - spec/models/alchemy_crm/mailing_spec.rb
437
+ - spec/models/alchemy_crm/newsletter_spec.rb
438
+ - spec/spec_helper.rb