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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 37f958aff948ab1bc2cff07f7f26b06048fed9ff
4
- data.tar.gz: ca5575ca0e54d9b6f3d4d028c404b072be20342b
3
+ metadata.gz: b9a4844f265ec031ab1001d8f5600f4f5d14c005
4
+ data.tar.gz: 78ec39f0f8bbfc0e651c416ea7ee14a086dee58b
5
5
  SHA512:
6
- metadata.gz: 43dcaf294aa9f1e96dcbd524b92a0649d4541fac2612276906f9fb97462872e010ec882fd838ad1df1b3162d9f02912aa98ddf90c4ee8ed3729d9e140b1a4c31
7
- data.tar.gz: 7fca6c99080d015b2c18be58a43119be4679cd7eef5dceb206c3a1b2209feccf833e936676d8f56b102951b58ab18d44f8277444e61d77ecc864a91e52330fb6
6
+ metadata.gz: 40912e945e0961017752771bd31667046812b76a1de29da451c795b4dff5645beecc6a08c19e42ee0246eb7a46a15d4b25e000cec9659b99b9a7c3937b168859
7
+ data.tar.gz: a414083ee2f1b2604811c036a6f8a3b0c9de71e23c0d1b18de895f9bb047a9c8efe0c60b29311427a0ef5d0cbf9e878e0a6a6ce524fbb7efcf0965569a7a2120
data/README.md CHANGED
@@ -1,28 +1,72 @@
1
1
  # Everett
2
- Short description and motivation.
2
+ [![Gem Version](https://badge.fury.io/rb/everett.svg)](http://badge.fury.io/rb/everett)
3
+ [![Build Status](https://travis-ci.org/yasaichi/everett.svg?branch=master)](https://travis-ci.org/yasaichi/everett)
4
+ [![Code Climate](https://codeclimate.com/github/yasaichi/everett/badges/gpa.svg)](https://codeclimate.com/github/yasaichi/everett)
5
+ [![Test Coverage](https://codeclimate.com/github/yasaichi/everett/badges/coverage.svg)](https://codeclimate.com/github/yasaichi/everett/coverage)
3
6
 
4
- ## Usage
5
- How to use my plugin.
7
+ Everett is a simple observer for Rails 5 ActiveRecord.
6
8
 
7
9
  ## Installation
8
- Add this line to your application's Gemfile:
10
+ Put this in your Gemfile:
9
11
 
10
12
  ```ruby
11
13
  gem 'everett'
12
14
  ```
13
15
 
14
- And then execute:
15
- ```bash
16
- $ bundle
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
- Or install it yourself as:
20
- ```bash
21
- $ gem install everett
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
- Contribution directions go here.
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 'bundler/setup'
2
+ require "bundler/setup"
3
3
  rescue LoadError
4
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
4
+ puts "You must `gem install bundler` and `bundle install` to run rake tasks"
5
5
  end
6
6
 
7
- require 'rdoc/task'
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
- # Your code goes here...
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,9 @@
1
+ require "rails/railtie"
2
+
3
+ module Everett
4
+ class Railtie < ::Rails::Railtie
5
+ config.after_initialize do
6
+ ::Everett.enable
7
+ end
8
+ end
9
+ 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
@@ -1,3 +1,3 @@
1
1
  module Everett
2
- VERSION = '0.1.0'
2
+ VERSION = "0.2.0".freeze
3
3
  end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Create a Everett initializer
3
+
4
+ Example:
5
+ rails generate everett:install
6
+
7
+ This will create:
8
+ config/initializers/everett.rb
@@ -0,0 +1,11 @@
1
+ module Everett
2
+ module Generators
3
+ class InstallGenerator < ::Rails::Generators::Base
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
6
+ def copy_initializer_file
7
+ template "everett.rb", "config/initializers/everett.rb"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ Everett.configure do |config|
2
+ # Activate observers that should always be running.
3
+ # config.observers = :my_observer
4
+ end
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.1.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-10 00:00:00.000000000 Z
11
+ date: 2016-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
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.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.0.1
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.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: 5.0.0.1
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: