bottled_observers 0.1.0.alpha.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a32f5a4c6ac1a64683f4b80e60a69a7536d3584
4
- data.tar.gz: 338109d77dd2f7eeffbfc3295e6d271c16f68524
3
+ metadata.gz: 0de7b24c1c7374eb622b321c0a15bfe54abda7f4
4
+ data.tar.gz: 5514640d30cb75a05fbb9fac0d898dcc27a182b7
5
5
  SHA512:
6
- metadata.gz: b75f44850891b606243876455843af74217cd09662fd8157f72f6af1d3ef5e3f18a824138f924b6ecc1551076494b4fcef13231a00372019b96df5ea1a4547ea
7
- data.tar.gz: ffa4db46b39e685ae4e579b08594f86e227b67f67c17d615daeec33061917ea3fecd24d1a9468ee070058a7e77080a9a834f846d94289110549b570acae6429a
6
+ metadata.gz: a5cfb97d46b6ce73546dedd6dc03f963e297944f53aee7bfb4402e601fb61ef2bb8d7e36b3b48703437ea11ed8ae8ac7d67d7fbc12349d2ce33fc2f4498dde62
7
+ data.tar.gz: 839972e93ad95495ec94ec40a647627d0099e76f5662b9476d5667fede9284786bd752d3b3205ce8affdba3b4c7628978155f9cb2a25510c5172c3517075d4dd
data/README.md CHANGED
@@ -1,8 +1,12 @@
1
1
  # BottledObservers
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/bottled_observers`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ ## The best thing to happen since bottled water
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ Wait, wasn't that [bottled_decorators?](https://github.com/John-Hayes-Reed/bottled_decorators),
6
+ or was it [bottled_services?](https://github.com/John-Hayes-Reed/bottled_services),
7
+ I am starting to lose track. Anyway! bottled_observers are an easy-to-use solution,
8
+ for the Observer / Subscribe-Publish pattern in ruby. all you need to worry about
9
+ is adding your business logic, let bottled_observers handle the rest!
6
10
 
7
11
  ## Installation
8
12
 
@@ -22,17 +26,143 @@ Or install it yourself as:
22
26
 
23
27
  ## Usage
24
28
 
25
- TODO: Write usage instructions here
29
+ bottled_observers has two main modules you need to be aware of; BottledObserver and BottledObservable.
30
+
31
+ #### BottledObserver
32
+
33
+ This module should be included in your observer class, and that observer class
34
+ should only contain a single public method: `#call`.
35
+ eg:
36
+
37
+ ```ruby
38
+ class SendPushNotification
39
+ include BottledObserver # <-- just like this!
40
+
41
+ def call
42
+ # Some intense and awesome logic to notify the hell out of them users.
43
+ end
44
+ end
45
+ ```
46
+
47
+ That is all there is to it, your observer is now ready to rock'n'roll.
48
+
49
+ #### BottledObservable
50
+
51
+ This module is included in any class that should allow observers to subscribe to it.
52
+ eg:
53
+
54
+ ```ruby
55
+ class Product
56
+ include BottledObservable # <-- and just like this!
57
+
58
+ # The rest of the class....
59
+ end
60
+ ```
61
+
62
+ And that is it, your whole bottled_observers subscribe/publish cycle is ready to go.
63
+
64
+ #### The Subscribe / Publish Cycle
65
+
66
+ There are three main methods available in your arsenal that you need to be aware of:
67
+ * `#add_subscription`
68
+ * `#modified`
69
+ * `#publish`
70
+
71
+ These are available to your observable class instances, so if we wanted to subscribe
72
+ our `SendPushNotification` observer to an instance of our `Product` class, we could
73
+ do the following:
74
+
75
+ ```ruby
76
+ @product = Product.find(1) # <-- instantiate Product from a record in the database.
77
+ @product.add_subscription SendPushNotification # <-- add a subscription for the SendPushNotification class
78
+ ```
79
+
80
+ We now have a `SendPushNotification` observer lying in wait for any publications from the `@product` instance.
81
+ Then, when we want to notify the observer(s) of any changes to the instance, just
82
+ set the state of the instance as *modified* using the `#modified` method, and publish
83
+ this change of state to its subscribers:
84
+
85
+ *Example case: sending push notifications after a successful save of the @product instance.*
86
+ ```ruby
87
+ # The product is only in a modified state if the save is successful
88
+ @product.modified if @product.save
89
+
90
+ # If the @product's state is 'modified' the observers call method will be excecuted.
91
+ # If the state is not modified, nothing will happen.
92
+ @product.publish
93
+ ```
94
+
95
+ **Super simple!**
96
+
97
+ Another thing that needs to be noted is, after publishing, the instances *modified*
98
+ state is reset, so to publish anything again, it must be set again.
99
+
100
+ ```ruby
101
+ @product.modified
102
+ @product.publish # <-- push notifications sent.
103
+ @product.publish # <-- push notifications not sent.
104
+ ```
105
+
106
+ ```ruby
107
+ @product.modified
108
+ @product.publish # <-- push notifications sent.
109
+ @product.modified
110
+ @product.publish # <-- push notifications sent.
111
+ ```
112
+
113
+ #### Extras
114
+
115
+ You can have as many observers subscribed to a single instance as you like:
116
+ ```ruby
117
+ @product.add_subscription SendPushNotification
118
+ @product.add_subscription MailToMailingList
119
+ @product.add_subscription CreateRecentActivityRecord
120
+
121
+ @product.modified if @product.save
122
+ @product.publish
123
+ ```
124
+
125
+ `#subscriptions` will return an array of current observer instances subscribed to the observable instance:
126
+ ```ruby
127
+ @product.add_subscription SendPushNotification
128
+ @product.subscriptions #=> [#<SendPushNotification:0x00...>]
129
+ ```
130
+
131
+ To remove observers of a particular class, use `#remove_subscription`:
132
+ ```ruby
133
+ @product.add_subscription SendPushNotification
134
+ @product.subscriptions #=> [#<SendPushNotification:0x00...>]
135
+ @product.remove_subscription SendPushNotification
136
+ @product.subscriptions #=> []
137
+ ```
138
+
139
+ Or use `#remove_subscriptions` *(notice the plural)* to, you guessed it, remove **all** observers:
140
+ ```ruby
141
+ @product.add_subscription SendPushNotification
142
+ @product.add_subscription MailToMailingList
143
+ @product.add_subscription CreateRecentActivityRecord
144
+ @product.subscriptions #=> [#<SendPushNotification:0x00...>, ...]
145
+
146
+ @product.remove_subscriptions
147
+ @product.subscriptions #=> []
148
+ ```
149
+
150
+ You can also check if your product is in a modified state by checking if it is `#publishable?`:
151
+ ```ruby
152
+ @product.publishable? #=> false
153
+ @product.modified
154
+ @product.publishable? #=> true
155
+ ```
26
156
 
27
157
  ## Development
28
158
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
159
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
160
 
31
161
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
162
 
33
163
  ## Contributing
34
164
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/bottled_observers. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
165
+ Bug reports and pull requests are welcome on GitHub at https://github.com/John-Hayes-Reed/bottled_observers. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
166
 
37
167
  ## License
38
168
 
@@ -40,4 +170,4 @@ The gem is available as open source under the terms of the [MIT License](http://
40
170
 
41
171
  ## Code of Conduct
42
172
 
43
- Everyone interacting in the BottledObservers project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/bottled_observers/blob/master/CODE_OF_CONDUCT.md).
173
+ Everyone interacting in the BottledObservers project’s codebases, issue trackers, chat rooms and mailing lists is expected to have a beer or two before and enjoy life. Oh yeah and apparently this too: [code of conduct](https://github.com/[USERNAME]/bottled_observers/blob/master/CODE_OF_CONDUCT.md).
@@ -46,7 +46,6 @@ module BottledObservable
46
46
  # @model.remove_subscriptions
47
47
  # @return [void]
48
48
  def remove_subscriptions
49
- puts 'entered'
50
49
  subscriptions.map(&:class).each(&method(:remove_subscription))
51
50
  end
52
51
 
@@ -1,3 +1,3 @@
1
1
  module BottledObservers
2
- VERSION = :'0.1.0.alpha.1'
2
+ VERSION = :'0.1.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bottled_observers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Hayes-Reed
@@ -91,9 +91,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
91
  version: '0'
92
92
  required_rubygems_version: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 1.3.1
96
+ version: '0'
97
97
  requirements: []
98
98
  rubyforge_project:
99
99
  rubygems_version: 2.6.10