everett 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +55 -11
- data/Rakefile +6 -18
- data/lib/everett.rb +30 -1
- data/lib/everett/configuration.rb +38 -0
- data/lib/everett/observer.rb +42 -0
- data/lib/everett/railtie.rb +9 -0
- data/lib/everett/subject.rb +40 -0
- data/lib/everett/utils.rb +14 -0
- data/lib/everett/version.rb +1 -1
- data/lib/generators/everett/install/USAGE +8 -0
- data/lib/generators/everett/install/install_generator.rb +11 -0
- data/lib/generators/everett/install/templates/everett.rb +4 -0
- metadata +122 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9a4844f265ec031ab1001d8f5600f4f5d14c005
|
4
|
+
data.tar.gz: 78ec39f0f8bbfc0e651c416ea7ee14a086dee58b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40912e945e0961017752771bd31667046812b76a1de29da451c795b4dff5645beecc6a08c19e42ee0246eb7a46a15d4b25e000cec9659b99b9a7c3937b168859
|
7
|
+
data.tar.gz: a414083ee2f1b2604811c036a6f8a3b0c9de71e23c0d1b18de895f9bb047a9c8efe0c60b29311427a0ef5d0cbf9e878e0a6a6ce524fbb7efcf0965569a7a2120
|
data/README.md
CHANGED
@@ -1,28 +1,72 @@
|
|
1
1
|
# Everett
|
2
|
-
|
2
|
+
[](http://badge.fury.io/rb/everett)
|
3
|
+
[](https://travis-ci.org/yasaichi/everett)
|
4
|
+
[](https://codeclimate.com/github/yasaichi/everett)
|
5
|
+
[](https://codeclimate.com/github/yasaichi/everett/coverage)
|
3
6
|
|
4
|
-
|
5
|
-
How to use my plugin.
|
7
|
+
Everett is a simple observer for Rails 5 ActiveRecord.
|
6
8
|
|
7
9
|
## Installation
|
8
|
-
|
10
|
+
Put this in your Gemfile:
|
9
11
|
|
10
12
|
```ruby
|
11
13
|
gem 'everett'
|
12
14
|
```
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
Run the installation generator with:
|
17
|
+
|
18
|
+
```sh
|
19
|
+
$ rails g everett:install
|
20
|
+
```
|
21
|
+
|
22
|
+
They will install the initializer into `config/initializers/everett.rb`.
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
Observers allow you to implement trigger-like behavior outside the original classes.
|
26
|
+
You can put them anywhere, for example `app/observers/comment_observer.rb`:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
class CommentObserver < Everett::Observer
|
30
|
+
def after_create(comment)
|
31
|
+
Rails.logger.info("New comment was posted.")
|
32
|
+
end
|
33
|
+
|
34
|
+
def after_destroy(comment)
|
35
|
+
Rails.logger.info("Comment with an id of #{comment.id} was destroyed.")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
This observer prints a log message when specific callbacks are triggered.
|
41
|
+
|
42
|
+
Like [rails-observers](https://github.com/rails/rails-observers), the convention is to name observers after the class they observe.
|
43
|
+
If you need to change this, or want to use one observer for several classes, use `observe`:
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
class NotificationsObserver < Everett::Observer
|
47
|
+
observe :comment, :like
|
48
|
+
|
49
|
+
def after_create_commit(record)
|
50
|
+
# notifiy users of new comment or like
|
51
|
+
end
|
52
|
+
end
|
17
53
|
```
|
18
54
|
|
19
|
-
|
20
|
-
|
21
|
-
|
55
|
+
Note that you must register observers first to activate them.
|
56
|
+
This can be done by adding the following line into `config/initializers/everett.rb`:
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
config.observers = :comment_observer, :notifications_observer
|
22
60
|
```
|
23
61
|
|
24
62
|
## Contributing
|
25
|
-
|
63
|
+
You should follow the steps below.
|
64
|
+
|
65
|
+
1. [Fork the repository](https://help.github.com/articles/fork-a-repo/)
|
66
|
+
2. Create a feature branch: `git checkout -b add-new-feature`
|
67
|
+
3. Commit your changes: `git commit -am 'add new feature'`
|
68
|
+
4. Push the branch: `git push origin add-new-feature`
|
69
|
+
4. [Send us a pull request](https://help.github.com/articles/about-pull-requests/)
|
26
70
|
|
27
71
|
## License
|
28
72
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
@@ -1,23 +1,11 @@
|
|
1
1
|
begin
|
2
|
-
require
|
2
|
+
require "bundler/setup"
|
3
3
|
rescue LoadError
|
4
|
-
puts
|
4
|
+
puts "You must `gem install bundler` and `bundle install` to run rake tasks"
|
5
5
|
end
|
6
6
|
|
7
|
-
require
|
8
|
-
|
9
|
-
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
-
rdoc.rdoc_dir = 'rdoc'
|
11
|
-
rdoc.title = 'Everett'
|
12
|
-
rdoc.options << '--line-numbers'
|
13
|
-
rdoc.rdoc_files.include('README.md')
|
14
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
require 'bundler/gem_tasks'
|
7
|
+
require "bundler/gem_tasks"
|
8
|
+
require "rspec/core/rake_task"
|
23
9
|
|
10
|
+
RSpec::Core::RakeTask.new(:spec)
|
11
|
+
task default: :spec
|
data/lib/everett.rb
CHANGED
@@ -1,3 +1,32 @@
|
|
1
|
+
require "everett/configuration"
|
2
|
+
require "everett/observer"
|
3
|
+
require "everett/subject"
|
4
|
+
require "everett/utils"
|
5
|
+
require "everett/version"
|
6
|
+
|
7
|
+
if defined? Rails
|
8
|
+
require "everett/railtie"
|
9
|
+
end
|
10
|
+
|
1
11
|
module Everett
|
2
|
-
|
12
|
+
class << self
|
13
|
+
attr_writer :configuration
|
14
|
+
|
15
|
+
def configuration
|
16
|
+
@configuration ||= ::Everett::Configuration.instance
|
17
|
+
end
|
18
|
+
|
19
|
+
def configure
|
20
|
+
yield(configuration) if block_given?
|
21
|
+
end
|
22
|
+
|
23
|
+
def enable
|
24
|
+
configuration.instantiated_observers.each do |observer|
|
25
|
+
observer
|
26
|
+
.observed_classes
|
27
|
+
.map { |klass| ::Everett::Subject[klass] }
|
28
|
+
.each { |subject| subject.add_observer(observer) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
3
32
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "everett/utils"
|
2
|
+
require "singleton"
|
3
|
+
|
4
|
+
module Everett
|
5
|
+
class Configuration
|
6
|
+
include ::Singleton
|
7
|
+
include ::Everett::Utils
|
8
|
+
|
9
|
+
attr_reader :observers
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@observers = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def instantiated_observers
|
16
|
+
@observers.map { |observer| instantiate_observer(observer) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def observers=(observers)
|
20
|
+
@observers = Array(observers)
|
21
|
+
end
|
22
|
+
|
23
|
+
def reset
|
24
|
+
@observers.clear
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def instantiate_observer(observer)
|
30
|
+
constant = constantize(observer)
|
31
|
+
return constant.instance if constant.respond_to?(:instance)
|
32
|
+
|
33
|
+
raise ::TypeError,
|
34
|
+
"#{constant} must be a lowercase, underscored class name " +
|
35
|
+
"(or the class itself) responding to the method :instance."
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "active_support"
|
2
|
+
require "active_support/inflector"
|
3
|
+
require "everett/utils"
|
4
|
+
require "set"
|
5
|
+
require "singleton"
|
6
|
+
|
7
|
+
module Everett
|
8
|
+
class Observer
|
9
|
+
include ::Singleton
|
10
|
+
include ::Everett::Utils
|
11
|
+
|
12
|
+
class << self
|
13
|
+
private
|
14
|
+
|
15
|
+
def observe(*models)
|
16
|
+
instance.observe(*models)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@observed_classes = ::Set.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def observe(*models)
|
25
|
+
models.map! { |model| constantize(model) }.compact!
|
26
|
+
!!@observed_classes.merge(models)
|
27
|
+
end
|
28
|
+
|
29
|
+
def observed_classes
|
30
|
+
@observed_classes.empty? ? Array(default_class) : @observed_classes.to_a
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def default_class
|
36
|
+
md = /\A(?<class_name>.*)Observer\z/.match(self.class.name)
|
37
|
+
md[:class_name].constantize if md
|
38
|
+
rescue ::NameError
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "active_record"
|
2
|
+
require "set"
|
3
|
+
|
4
|
+
module Everett
|
5
|
+
class Subject
|
6
|
+
CALLBACKS = ::Set[
|
7
|
+
*::ActiveRecord::Callbacks::CALLBACKS.map(&:to_sym),
|
8
|
+
*%i(create update destroy).map { |fire_on| :"after_#{fire_on}_commit" }
|
9
|
+
].freeze
|
10
|
+
|
11
|
+
class << self
|
12
|
+
private :new
|
13
|
+
|
14
|
+
def [](model)
|
15
|
+
instances.fetch(model) { |key| instances[key] = new(model) }
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def instances
|
21
|
+
@instances ||= {}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(model)
|
26
|
+
@model = model
|
27
|
+
@observers = ::Set.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_observer(observer)
|
31
|
+
return false if @observers.include?(observer)
|
32
|
+
|
33
|
+
callbacks = CALLBACKS.select { |callback| observer.respond_to?(callback) }
|
34
|
+
return false if callbacks.empty?
|
35
|
+
|
36
|
+
callbacks.each { |callback| @model.public_send(callback, observer) }
|
37
|
+
!!@observers.add(observer)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "active_support"
|
2
|
+
require "active_support/inflector"
|
3
|
+
|
4
|
+
module Everett
|
5
|
+
module Utils
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def constantize(underscored_name_or_constant)
|
9
|
+
underscored_name_or_constant.respond_to?(:to_sym) ?
|
10
|
+
underscored_name_or_constant.to_s.camelize.constantize :
|
11
|
+
underscored_name_or_constant
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/everett/version.rb
CHANGED
metadata
CHANGED
@@ -1,35 +1,141 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: everett
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yasaichi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 5.0
|
20
|
-
|
19
|
+
version: '5.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
21
25
|
- !ruby/object:Gem::Version
|
22
|
-
version: 5.0
|
26
|
+
version: '5.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: railties
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '5.0'
|
23
34
|
type: :runtime
|
24
35
|
prerelease: false
|
25
36
|
version_requirements: !ruby/object:Gem::Requirement
|
26
37
|
requirements:
|
27
38
|
- - "~>"
|
28
39
|
- !ruby/object:Gem::Version
|
29
|
-
version: 5.0
|
40
|
+
version: '5.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ammeter
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: codeclimate-test-reporter
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry-coolline
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
30
94
|
- - ">="
|
31
95
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-rails
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
33
139
|
- !ruby/object:Gem::Dependency
|
34
140
|
name: sqlite3
|
35
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -55,7 +161,15 @@ files:
|
|
55
161
|
- README.md
|
56
162
|
- Rakefile
|
57
163
|
- lib/everett.rb
|
164
|
+
- lib/everett/configuration.rb
|
165
|
+
- lib/everett/observer.rb
|
166
|
+
- lib/everett/railtie.rb
|
167
|
+
- lib/everett/subject.rb
|
168
|
+
- lib/everett/utils.rb
|
58
169
|
- lib/everett/version.rb
|
170
|
+
- lib/generators/everett/install/USAGE
|
171
|
+
- lib/generators/everett/install/install_generator.rb
|
172
|
+
- lib/generators/everett/install/templates/everett.rb
|
59
173
|
- lib/tasks/everett_tasks.rake
|
60
174
|
homepage: https://github.com/yasaichi/everett
|
61
175
|
licenses:
|