canmoia 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/Guardfile +30 -0
  3. data/README.md +186 -0
  4. data/Rakefile +27 -0
  5. data/WTFP-LICENSE +13 -0
  6. data/lib/canmoia/concerns/notification.rb~ +38 -0
  7. data/lib/canmoia/concerns/order.rb +71 -0
  8. data/lib/canmoia/concerns/order.rb~ +65 -0
  9. data/lib/canmoia/concerns/work.rb +21 -0
  10. data/lib/canmoia/concerns/work.rb~ +33 -0
  11. data/lib/canmoia/features/notification.rb +51 -0
  12. data/lib/canmoia/features/notification.rb~ +38 -0
  13. data/lib/canmoia/tasks/install.rb.erb +23 -0
  14. data/lib/canmoia/version.rb +3 -0
  15. data/lib/canmoia.rb +8 -0
  16. data/lib/canmoia.rb~ +6 -0
  17. data/lib/tasks/canmoia_tasks.rake +4 -0
  18. data/lib/tasks/canmoia_tasks.rb.erb +16 -0
  19. data/spec/concerns/order_spec.rb +45 -0
  20. data/spec/concerns/order_spec.rb~ +41 -0
  21. data/spec/concerns/work_spec.rb +32 -0
  22. data/spec/dummy/README.rdoc +261 -0
  23. data/spec/dummy/Rakefile +7 -0
  24. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  25. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  26. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  27. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  28. data/spec/dummy/app/mailers/notifiable_order_mailer.rb~ +14 -0
  29. data/spec/dummy/app/mailers/work_order_mailer.rb +14 -0
  30. data/spec/dummy/app/mailers/work_order_mailer.rb~ +14 -0
  31. data/spec/dummy/app/models/employee.rb +4 -0
  32. data/spec/dummy/app/models/employee.rb~ +3 -0
  33. data/spec/dummy/app/models/item.rb +5 -0
  34. data/spec/dummy/app/models/order.rb +4 -0
  35. data/spec/dummy/app/models/order.rb~ +4 -0
  36. data/spec/dummy/app/models/user.rb +6 -0
  37. data/spec/dummy/app/models/user.rb~ +4 -0
  38. data/spec/dummy/app/models/work_order.rb +4 -0
  39. data/spec/dummy/app/models/work_order.rb~ +3 -0
  40. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  41. data/spec/dummy/app/views/work_order_mailer/close_notification_to_responsible.text.erb +3 -0
  42. data/spec/dummy/config/application.rb +62 -0
  43. data/spec/dummy/config/application.rb~ +59 -0
  44. data/spec/dummy/config/boot.rb +10 -0
  45. data/spec/dummy/config/database.yml +25 -0
  46. data/spec/dummy/config/environment.rb +5 -0
  47. data/spec/dummy/config/environment.rb~ +5 -0
  48. data/spec/dummy/config/environments/development.rb +37 -0
  49. data/spec/dummy/config/environments/development.rb~ +37 -0
  50. data/spec/dummy/config/environments/production.rb +67 -0
  51. data/spec/dummy/config/environments/test.rb +37 -0
  52. data/spec/dummy/config/environments/test.rb~ +37 -0
  53. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  54. data/spec/dummy/config/initializers/inflections.rb +15 -0
  55. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  56. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  57. data/spec/dummy/config/initializers/session_store.rb +8 -0
  58. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  59. data/spec/dummy/config/locales/en.yml +5 -0
  60. data/spec/dummy/config/mongoid.yml +68 -0
  61. data/spec/dummy/config/mongoid.yml~ +68 -0
  62. data/spec/dummy/config/routes.rb +58 -0
  63. data/spec/dummy/config.ru +4 -0
  64. data/spec/dummy/db/development.sqlite3 +0 -0
  65. data/spec/dummy/log/development.log +1 -0
  66. data/spec/dummy/log/test.log +4574 -0
  67. data/spec/dummy/public/404.html +26 -0
  68. data/spec/dummy/public/422.html +26 -0
  69. data/spec/dummy/public/500.html +25 -0
  70. data/spec/dummy/public/favicon.ico +0 -0
  71. data/spec/dummy/script/rails +6 -0
  72. data/spec/dummy/spec/fixtures/work_order_mailer/close_notification_to_responsible +3 -0
  73. data/spec/dummy/spec/mailers/notifiable_order_mailer_spec.rb~ +18 -0
  74. data/spec/dummy/spec/mailers/work_order_mailer_spec.rb +19 -0
  75. data/spec/dummy/spec/mailers/work_order_mailer_spec.rb~ +20 -0
  76. data/spec/fabricators/item_fabricator.rb +5 -0
  77. data/spec/fabricators/item_fabricator.rb~ +5 -0
  78. data/spec/fabricators/order_fabricator.rb +15 -0
  79. data/spec/fabricators/order_fabricator.rb~ +9 -0
  80. data/spec/fabricators/user_fabricator.rb +7 -0
  81. data/spec/fabricators/user_fabricator.rb~ +7 -0
  82. data/spec/spec_helper.rb +50 -0
  83. data/spec/spec_helper.rb~ +34 -0
  84. data/spec/support/concern_macros.rb +0 -0
  85. data/spec/support/fabrication.rb +8 -0
  86. data/spec/support/fabricator.rb +5 -0
  87. data/spec/support/mailer_macros.rb +9 -0
  88. metadata +437 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e32b4b89e98944da5607f61c21ef58cf8b2ab1e5
4
+ data.tar.gz: 07f3260fddc77f8d5a45328a50a91fedce11290f
5
+ SHA512:
6
+ metadata.gz: 6d0d92901045552b14bb859e4ff04936d006bae028bdd02ee15c8658607f9ea9db6e12b2fa6c965b45209eca322accd55ee4d3b7cde22acda36c658c7c2120bf
7
+ data.tar.gz: 13c93f718d7d5413eb7123e4a3f9f942cd953f27a1ee8ec39e6c7ca6cb4ee9707963eba80f5c45f616fa0620342371d4536415b3c8f378c1461c92b0e9870fca
data/Guardfile ADDED
@@ -0,0 +1,30 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+
9
+ # Rails example
10
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
11
+ watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
12
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
13
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
14
+ watch('config/routes.rb') { "spec/routing" }
15
+ watch('app/controllers/application_controller.rb') { "spec/controllers" }
16
+
17
+ # Canmoia Concerns
18
+ watch(%r{^lib/canmoia/concerns(.+)\.rb$}) { |m| ["spec/#{m[1]}_spec.rb", "spec/lib/concerns/#{m[1]}_spec.rb"] }
19
+ watch(%r{^lib/canmoia/features(.+)\.rb$}) { |m| ["spec/#{m[1]}_spec.rb", "spec/lib/features/#{m[1]}_spec.rb"] }
20
+
21
+ # Fabricators
22
+ watch(%r{^spec/fabricators/(.+)\.rb$}) { |m| ["spec/#{m[1]}_spec.rb", "spec/concerns/#{m[1]}_spec.rb", "spec/models/#{m[1]}_spec.rb"] }
23
+
24
+ # Capybara features specs
25
+ watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
26
+
27
+ # Turnip features and steps
28
+ watch(%r{^spec/acceptance/(.+)\.feature$})
29
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
30
+ end
data/README.md ADDED
@@ -0,0 +1,186 @@
1
+ Canmöia
2
+ =======
3
+
4
+ <!---
5
+
6
+ TODO Add badges of this services
7
+
8
+ [![Travis](https://api.travis-ci.org/indefinido/canmoia.png)](http://travis-ci.org/indefinido/canmoia)
9
+ [![Coverage Status](https://coveralls.io/repos/indefinido/canmoia/badge.png?branch=master)](https://coveralls.io/r/indefinido/canmoia)
10
+ [![Code Climate](https://codeclimate.com/github/indefinido/canmoia.png)](https://codeclimate.com/github/indefinido/canmoia)
11
+ ![project status](http://stillmaintained.com/indefinido/canmoia.png)
12
+
13
+ -->
14
+
15
+ Summary
16
+ -------
17
+
18
+ Canmöia (can = order, möia = work, work order). The core functionality of the [Order domain](http://en.wikipedia.org/wiki/Work_order)
19
+
20
+ Requirements
21
+ ------------
22
+
23
+ - ruby 2.0.0
24
+ - workflow
25
+ - currently only support mongoid models
26
+
27
+ Getting Started
28
+ ---------------
29
+
30
+ Add to your Gemfile:
31
+
32
+ ```ruby
33
+ gem 'canmoia'
34
+ ```
35
+
36
+ You must have a **model named User** and a **model named Item** for this to
37
+ work properly. Then add the concern you want to your model:
38
+
39
+ ```ruby
40
+ class Order
41
+ include Mongoid::Document
42
+ include Canmoia::Order
43
+ end
44
+ ```
45
+
46
+
47
+ You now have a fully working Order:
48
+
49
+ ```ruby
50
+ order = Order.new
51
+ order.items << Item.new(value: 100)
52
+ order.items << Item.new(value: 150)
53
+
54
+ # Automatically computes total upon validation
55
+ order.valid?
56
+ order.total # 250.00
57
+
58
+ # Manage basic order states (workflow gem basics)
59
+ # To override behaviour just define close! method on model
60
+ order.close!
61
+ order.closed? # true
62
+
63
+ order.accept!
64
+ order.accepted? # true
65
+ order.state # accepted
66
+
67
+
68
+ # Automagically generated associations
69
+ order.client # your User model
70
+ order.items # your Item model
71
+ ```
72
+
73
+ You might also try the Work Order concern:
74
+
75
+ ```ruby
76
+ class Order
77
+ include Mongoid::Document
78
+ # Canmoia::Order is automatically included
79
+ include Canmoia::Work
80
+ end
81
+
82
+ # Automagically generated associations
83
+ order.responsible
84
+
85
+ # Autmatically notifications!
86
+ # When closing a order:
87
+ order.close!
88
+
89
+ # Canmoia will automatically try to notify
90
+ # the domain resposables for the event
91
+ # Trigerring this methods:
92
+ # OrderMailer.close_notification_to_responsible(order, order.responsible).deliver
93
+ # OrderMailer.close_notification_to_client(order, order.client).deliver
94
+ #
95
+ # Generalizing:
96
+ # #{YourModel}Mailer.#{event}_notification_to_#{recipient}
97
+
98
+ ```
99
+
100
+ Documentation
101
+ -------------
102
+
103
+ Sometime on the future might be a wiki page
104
+
105
+ ### Concerns
106
+ #### Order (Canmoia::Order)
107
+
108
+ The current states and transitions are:
109
+ <sup>Order will always start at opened state (italics)</sup>
110
+
111
+ | state | event | transitions to |
112
+ |:-----------:|:--------:|:--------------:|
113
+ | *opened* | close | reviewing |
114
+ | *opened* | cancel | canceled |
115
+ | reviewing | accept | accepted |
116
+ | reviewing | reject | rejected |
117
+ | reviewing | cancel | canceled |
118
+ | accepted | complete | completed |
119
+ | accepted | cancel | canceled |
120
+ | rejected | complete | completed |
121
+ | rejected | cancel | canceled |
122
+ | completed | - | - |
123
+ | canceled | - | - |
124
+
125
+
126
+ #### Work Order (Canmoia::Work)
127
+
128
+
129
+ You can specify to which events canmöia should send notifications:
130
+
131
+ ```ruby
132
+ class Order
133
+ include Mongoid::Document
134
+ # Canmoia::Order is automatically included
135
+ include Canmoia::Work
136
+
137
+ # BTW this are the defaults!
138
+ notify :responsible, :on => [:open, :close]
139
+ notify :client , :on => [:open, :accept, :reject, :cancel]
140
+ end
141
+ ```
142
+ ### Features
143
+
144
+
145
+ #### Notification (Canmoia::Notification)
146
+ Include workflow and rock with only notification functionalities!
147
+
148
+ ```ruby
149
+ class Order
150
+ include Mongoid::Document
151
+ include Workflow
152
+ include Canmoia::Notification
153
+
154
+ workflow do
155
+
156
+ state :opened do
157
+ event :close, :transitions_to => :checkout
158
+ end
159
+
160
+ state :checkout
161
+
162
+ end
163
+
164
+ # Remember, will trigger: OrderMailer.close_notification_to_responsible(order, order.responsible).deliver
165
+ notify :responsible, :on => :close
166
+ end
167
+ ```
168
+
169
+
170
+ TODO
171
+ ----
172
+
173
+ ### Mail Generator
174
+ Automatically add default mail templates for notification kinds to the view_path
175
+
176
+ ### Purchase Order
177
+ Add suport for Purchase Order Concern (Canmoia::Purchasable)
178
+
179
+ ### Reviewable Feature
180
+ Extract review order feature from Order concern (Canmoia::Reviewable)
181
+
182
+
183
+
184
+
185
+
186
+ This project rocks and uses WTFP-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'Canmoia'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+
24
+
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
data/WTFP-LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
2
+ Version 2, December 2004
3
+
4
+ Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
5
+
6
+ Everyone is permitted to copy and distribute verbatim or modified
7
+ copies of this license document, and changing it is allowed as long
8
+ as the name is changed.
9
+
10
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
11
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
12
+
13
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
@@ -0,0 +1,38 @@
1
+ module Canmoia::Notification
2
+
3
+ def notify entity_name = :responsible, on: -> { raise "on is required" }, via: :email
4
+ raise "Recipient named as '#{entity_name}' not found for #{self.name}" unless instance_methods.include? entity_name.to_sym
5
+
6
+ on.each do |event|
7
+ add_notification_method event, entity_name, via
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ # TODO use method missing
14
+ def add_notification_method event, entity_name, via
15
+ mail_method = "#{event}_notification_to_#{entity_name}"
16
+
17
+ define_method "#{event}!" do |*args|
18
+ returned = super *args
19
+ # TODO better error message when mailer is not found
20
+ # TODO allow specification of custom mailer
21
+ mailer = "#{self.class.name}Mailer".classify.constantize
22
+
23
+ # TODO better error message when mail method is not found
24
+ entity = send entity_name
25
+ mail = mailer.send mail_method, self, entity
26
+
27
+ mail.deliver or returned
28
+ end
29
+ end
30
+
31
+ # - on :open , close: :reviewing, cancel: :canceled, notify: :responsible
32
+ # V on :review, reject: :rejected, accept: :accepted
33
+ # - on :accept, notify: :buyer
34
+ # - on :reject, notify: :buyer
35
+ # - on :cancel, notify: [:buyer, via: :email] }
36
+ # - on :finish, notify: [:buyer, via: :email] }
37
+
38
+ end
@@ -0,0 +1,71 @@
1
+ require 'active_support/concern'
2
+
3
+ module Canmoia
4
+ module Order
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include ::Workflow
9
+ include CalculationMethods
10
+ # extend Notification
11
+
12
+ # Fields
13
+ # TODO move to Canmoia::Purchase
14
+ field :state, type: Symbol
15
+ field :total, type: Float
16
+
17
+ # Relations
18
+ embeds_many :items
19
+
20
+ # TODO move to Canmoia::Purchase
21
+ has_one :client, :class_name => "::User"
22
+
23
+ # Domain Callbacks
24
+ before_validation :calculate_total, :if => :opened?
25
+
26
+ # States
27
+ workflow_column :state
28
+ workflow do
29
+
30
+ state :opened do
31
+ event :close , transitions_to: :reviewing
32
+ event :cancel, transitions_to: :canceled
33
+ end
34
+
35
+ state :reviewing do
36
+ event :accept, transitions_to: :accepted
37
+ event :reject, transitions_to: :rejected
38
+
39
+ event :cancel, transitions_to: :canceled
40
+ end
41
+
42
+ state :accepted do
43
+ event :complete, transitions_to: :completed
44
+ event :cancel , transitions_to: :canceled
45
+ end
46
+
47
+ state :rejected do
48
+ event :complete, transitions_to: :completed
49
+ event :cancel , transitions_to: :canceled
50
+ end
51
+
52
+ state :completed
53
+ state :canceled
54
+ end
55
+ end
56
+
57
+ module CalculationMethods
58
+ def calculate_total
59
+ self.total = items.sum &:value
60
+ end
61
+ end
62
+
63
+ # - on :open , close: :reviewing, cancel: :canceled, notify: :responsible
64
+ # V on :review, reject: :rejected, accept: :accepted
65
+ # - on :accept, notify: :buyer
66
+ # - on :reject, notify: :buyer
67
+ # - on :cancel, notify: [:buyer, via: :email] }
68
+ # - on :finish, notify: [:buyer, via: :email] }
69
+
70
+ end
71
+ end
@@ -0,0 +1,65 @@
1
+ require 'active_support/concern'
2
+
3
+ module Canmoia
4
+ module Order
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include ::Workflow
9
+ include CalculationMethods
10
+ # extend Notification
11
+
12
+ # Fields
13
+ field :total, type: Float
14
+ field :state, type: Symbol
15
+
16
+ # Relations
17
+ embeds_many :items
18
+ has_one :client, :class_name => "::User"
19
+
20
+ # States
21
+ workflow_column :state
22
+ workflow do
23
+
24
+ state :opened do
25
+ event :close , transitions_to: :reviewing
26
+ event :cancel, transitions_to: :canceled
27
+ end
28
+
29
+ state :reviewing do
30
+ event :accept, transitions_to: :accepted
31
+ event :reject, transitions_to: :rejected
32
+
33
+ event :cancel, transitions_to: :canceled
34
+ end
35
+
36
+ state :accepted do
37
+ event :complete, transitions_to: :completed
38
+ event :cancel , transitions_to: :canceled
39
+ end
40
+
41
+ state :rejected do
42
+ event :complete, transitions_to: :completed
43
+ event :cancel , transitions_to: :canceled
44
+ end
45
+
46
+ state :completed
47
+ state :canceled
48
+ end
49
+ end
50
+
51
+ module CalculationMethods
52
+ def total
53
+ @total ||= super or items.sum(&:value)
54
+ end
55
+ end
56
+
57
+ # - on :open , close: :reviewing, cancel: :canceled, notify: :responsible
58
+ # V on :review, reject: :rejected, accept: :accepted
59
+ # - on :accept, notify: :buyer
60
+ # - on :reject, notify: :buyer
61
+ # - on :cancel, notify: [:buyer, via: :email] }
62
+ # - on :finish, notify: [:buyer, via: :email] }
63
+
64
+ end
65
+ end
@@ -0,0 +1,21 @@
1
+ require 'active_support/concern'
2
+
3
+ module Canmoia
4
+ module Work
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include Order
9
+ extend Notification
10
+
11
+ # Fields
12
+
13
+ # Relations
14
+ belongs_to :responsible, :class_name => "::User"
15
+
16
+ # States Notifications
17
+ notify :responsible, :on => [:open, :close]
18
+ notify :client , :on => [:open, :accept, :reject, :cancel]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ require 'active_support/concern'
2
+
3
+ module Canmoia
4
+ module Work
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include Order
9
+
10
+ # Fields
11
+
12
+ # Relations
13
+ belongs_to :responsible, :class_name => "::User"
14
+
15
+ # States Notifications
16
+ notify :responsible
17
+ end
18
+
19
+ module CalculationMethods
20
+ def total
21
+ @total ||= items.sum(&:value)
22
+ end
23
+ end
24
+
25
+ # - on :open , close: :reviewing, cancel: :canceled, notify: :responsible
26
+ # V on :review, reject: :rejected, accept: :accepted
27
+ # - on :accept, notify: :buyer
28
+ # - on :reject, notify: :buyer
29
+ # - on :cancel, notify: [:buyer, via: :email] }
30
+ # - on :finish, notify: [:buyer, via: :email] }
31
+
32
+ end
33
+ end
@@ -0,0 +1,51 @@
1
+ # require 'active_support/concern'
2
+
3
+ module Canmoia
4
+ module Notification
5
+ # TODO add when needed extend ActiveSupport::Concern
6
+
7
+ attr_accessor :notifications_declared
8
+
9
+ def self.extended base
10
+ base.notifications_declared = []
11
+ end
12
+
13
+ def notify recipient_attribute = :responsible, on: -> { raise "on is required" }, via: :email
14
+ raise "Recipient named as '#{recipient_attribute}' not found for #{self.name}" unless instance_methods.include? recipient_attribute.to_sym
15
+
16
+ on.each do |event|
17
+ add_notification_method event, recipient_attribute, via
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ # TODO use method missing
24
+ def add_notification_method event, recipient_attribute, via
25
+ mail_method = "#{event}_notification_to_#{recipient_attribute}"
26
+
27
+ notification = "#{event}_#{recipient_attribute}".to_sym
28
+ unless notifications_declared.include? notification
29
+ notifications_declared << notification
30
+ else
31
+ raise "Notification for event '#{event}' to recipient '#{recipient_attribute}' already declared!"
32
+ end
33
+
34
+ # TODO only define notification method if method is present on mailer
35
+ # TODO create task to generate / update mailer with notification settings
36
+
37
+ define_method "#{event}!" do |*args|
38
+ returned = super *args
39
+ # TODO better error message when mailer is not found
40
+ # TODO allow specification of custom mailer
41
+ mailer = "#{self.class.name}Mailer".classify.constantize
42
+
43
+ # TODO better error message when mail method is not found
44
+ entity = send recipient_attribute
45
+ mail = mailer.send mail_method, self, entity
46
+
47
+ mail.deliver or returned
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,38 @@
1
+ # require 'active_support/concern'
2
+
3
+ module Canmoia
4
+ module Notification
5
+ # TODO add when needed extend ActiveSupport::Concern
6
+
7
+ def notify entity_name = :responsible, on: -> { raise "on is required" }, via: :email
8
+ raise "Recipient named as '#{entity_name}' not found for #{self.name}" unless instance_methods.include? entity_name.to_sym
9
+
10
+ on.each do |event|
11
+ add_notification_method event, entity_name, via
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ # TODO use method missing
18
+ def add_notification_method event, entity_name, via
19
+ mail_method = "#{event}_notification_to_#{entity_name}"
20
+
21
+ # TODO only define notification method if method is present on mailer
22
+ # TODO create task to generate / update mailer with notification settings
23
+
24
+ define_method "#{event}!" do |*args|
25
+ returned = super *args
26
+ # TODO better error message when mailer is not found
27
+ # TODO allow specification of custom mailer
28
+ mailer = "#{self.class.name}Mailer".classify.constantize
29
+
30
+ # TODO better error message when mail method is not found
31
+ entity = send entity_name
32
+ mail = mailer.send mail_method, self, entity
33
+
34
+ mail.deliver or returned
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ module Canmoia
2
+ module Tasks
3
+ require 'rails/generators'
4
+
5
+ class Install < Rails::Generators::Base
6
+
7
+
8
+ # Sample installation task
9
+ # def copy_initializer_file
10
+ # template 'canmoia.rb', 'config/initializers/canmoia.rb'
11
+ # end
12
+
13
+ private
14
+ def self.add_templates_path!
15
+ current_directory = File.dirname(__FILE__)
16
+ source_paths << File.join(current_directory, 'templates')
17
+ source_paths << File.expand_path(File.join current_directory, '..', '..', '..')
18
+ end
19
+
20
+ add_templates_path!
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Canmoia
2
+ VERSION = "0.0.1"
3
+ end
data/lib/canmoia.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'mongoid'
2
+ require 'workflow'
3
+
4
+ module Canmoia
5
+ autoload :Order , 'canmoia/concerns/order'
6
+ autoload :Work , 'canmoia/concerns/work'
7
+ autoload :Notification , 'canmoia/features/notification'
8
+ end
data/lib/canmoia.rb~ ADDED
@@ -0,0 +1,6 @@
1
+ require 'mongoid'
2
+ require 'workflow'
3
+
4
+ module Canmoia
5
+ autoload :Work, 'canmoia/work'
6
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :canmoia do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,16 @@
1
+ require File.expand_path('../../canmoia/tasks/install', __FILE__)
2
+
3
+ namespace :canmoia do
4
+ # Example install task
5
+ # desc "Install canmoia"
6
+ # task :install do
7
+ # Canmoia::Tasks::Install.start # Execute all install tasks
8
+ # end
9
+
10
+ # Example update task
11
+ # desc "Update canmoia"
12
+ # task :update do
13
+ # installation = Canmoia::Tasks::Install.new # Execute some install tasks
14
+ # installation.copy_initializer_file
15
+ # end
16
+ end