alchemy_crm 2.0.0

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 (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