spotter 0.0.1
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.
- data/.document +5 -0
- data/.travis.yml +7 -0
- data/Gemfile +14 -0
- data/LICENSE.txt +20 -0
- data/README.md +121 -0
- data/Rakefile +28 -0
- data/VERSION +1 -0
- data/lib/spotter.rb +59 -0
- data/spec/lib/spotter_spec.rb +83 -0
- data/spec/spec_helper.rb +20 -0
- data/spotter.gemspec +98 -0
- metadata +334 -0
data/.document
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2013 Suman Mukherjee
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
## Spotter
|
2
|
+
|
3
|
+
Allows you to easily add observers to your objects.
|
4
|
+
You can define several observers for a single class and add specific
|
5
|
+
observers for specific methods.
|
6
|
+
|
7
|
+
## Build status
|
8
|
+
|
9
|
+
[](https://travis-ci.org/sumanmukherjee03/spotter)
|
10
|
+
[](https://codeclimate.com/github/sumanmukherjee03/spotter)
|
11
|
+
[](https://gemnasium.com/sumanmukherjee03/spotter)
|
12
|
+
[](https://coveralls.io/r/sumanmukherjee03/spotter)
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
Add this line to your application's Gemfile:
|
17
|
+
|
18
|
+
gem 'spotter'
|
19
|
+
|
20
|
+
And then execute:
|
21
|
+
|
22
|
+
$ bundle
|
23
|
+
|
24
|
+
Or install it yourself as:
|
25
|
+
|
26
|
+
$ gem install spotter
|
27
|
+
|
28
|
+
## Usage
|
29
|
+
Lets say there is a class called SuperHero.
|
30
|
+
Assume we need to observe the object with an observer Foo when it is saved.
|
31
|
+
Assume we need to observe the object with an observer Bar when it is reset.
|
32
|
+
|
33
|
+
In the SuperHero class, you need to include the module Spotter.
|
34
|
+
You need to register your observers using the ```register_observers``` class method.
|
35
|
+
You also need to specify the methods being observed using the ```methods_observed``` class method.
|
36
|
+
And lastly, you need to invoke ```run_observers``` in the method where you want to trigger the observers.
|
37
|
+
```ruby
|
38
|
+
class SuperHero
|
39
|
+
|
40
|
+
include Spotter
|
41
|
+
|
42
|
+
register_observers :foo, :bar
|
43
|
+
methods_observed :build, :destroy
|
44
|
+
|
45
|
+
attr_accessor :super_hero
|
46
|
+
|
47
|
+
def initialize
|
48
|
+
@super_hero = 'Ironman'
|
49
|
+
end
|
50
|
+
|
51
|
+
def build
|
52
|
+
run_observers(:for => :save, :with => :foo) do
|
53
|
+
self.super_hero += ' - Tony Stark'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def destroy
|
58
|
+
run_observers(:for => :reset, :with => :bar) do
|
59
|
+
self.super_hero = self.super_hero.split('-').first.strip
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
```
|
64
|
+
While calling the method ```run_observers```, you need to specify 2 options - :for and :with.
|
65
|
+
The :for option specifies the method for which the observer is to be called.
|
66
|
+
The :with option specifies the observers which need to be triggered.
|
67
|
+
You also need to pass it a block, which contains the actual body of the method.
|
68
|
+
The run_observers method attaches the observer to the object and then triggers them.
|
69
|
+
|
70
|
+
As the example above depicts, you can have multiple observers - :foo, :bar.
|
71
|
+
Also, you can have multiple methods being observed with different observers.
|
72
|
+
|
73
|
+
Now we need to implement our observer.
|
74
|
+
The observer must be within the namespace of the class.
|
75
|
+
So, the observers named named Spottertest::Foo SuperHero::Bar and not just Foo or Bar.
|
76
|
+
```ruby
|
77
|
+
class SuperHero::Foo
|
78
|
+
attr_accessor :obj
|
79
|
+
|
80
|
+
def initialize(obj)
|
81
|
+
@obj = obj
|
82
|
+
obj.add_observer(self, :notify_paparrazzi)
|
83
|
+
end
|
84
|
+
|
85
|
+
def notify_paparrazzi
|
86
|
+
Notifier.inform_paparazzi(obj) # Send an email to paparazzi
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
class SuperHero::Bar
|
91
|
+
attr_accessor :obj
|
92
|
+
|
93
|
+
def initialize(obj)
|
94
|
+
@obj = obj
|
95
|
+
obj.add_observer(self, :notify_the_mandarin)
|
96
|
+
end
|
97
|
+
|
98
|
+
def notify_the_mandarin
|
99
|
+
Notifier.inform_mandarin(obj) # Send an email to mandarin
|
100
|
+
end
|
101
|
+
end
|
102
|
+
```
|
103
|
+
The initialize method of the observer must accept the object it is observing.
|
104
|
+
It must then add itself to the object being observed.
|
105
|
+
By default the method ```update``` is called when notify_observers is invoked.
|
106
|
+
However, while adding the observer you can specify which method is to be invoked.
|
107
|
+
|
108
|
+
## Contributing
|
109
|
+
|
110
|
+
1. Fork it
|
111
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
112
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
113
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
114
|
+
5. Create new Pull Request
|
115
|
+
|
116
|
+
## License
|
117
|
+
Copyright (c) 2013 Suman Mukherjee
|
118
|
+
|
119
|
+
MIT License
|
120
|
+
|
121
|
+
For more information on license, please look at LICENSE.txt
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "spotter"
|
18
|
+
gem.homepage = "http://github.com/sumanmukherjee03/spotter"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{A gem that implements a simple interface for adding observers to your classes}
|
21
|
+
gem.description = %Q{Gem that provides a simple interface for adding observers to your ruby classes}
|
22
|
+
gem.email = "sumanmukherjee03@gmail.com"
|
23
|
+
gem.authors = ["Suman Mukherjee"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
task :default => :test
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/lib/spotter.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require "active_support/concern"
|
2
|
+
require "active_support/inflector"
|
3
|
+
require "observer"
|
4
|
+
|
5
|
+
module Spotter
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
include Observable
|
10
|
+
end
|
11
|
+
|
12
|
+
def attach_observer(name)
|
13
|
+
self.class.fetch_observer(name).new(self)
|
14
|
+
end
|
15
|
+
|
16
|
+
def attach_observers(*names)
|
17
|
+
names.each { |name| attach_observer(name) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def run_observers(options, &block)
|
21
|
+
method_name = "observe_#{options.fetch(:for) { raise ArgumentError.new("Must have an option called :for") }}".to_sym
|
22
|
+
observers = Array(options.fetch(:with) { raise ArgumentError.new("Must have an option called :with") })
|
23
|
+
self.respond_to?(method_name) ? self.__send__(method_name, *observers, &block) : raise(ArgumentError.new("Method is not being observed"))
|
24
|
+
end
|
25
|
+
|
26
|
+
module ClassMethods
|
27
|
+
def observing_classes
|
28
|
+
@observing_classes ||= {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def register_observer(observing_klass_name)
|
32
|
+
observing_classes[observing_klass_name.to_sym] = "#{name}::#{observing_klass_name.to_s.camelize}".constantize
|
33
|
+
rescue NameError
|
34
|
+
raise ArgumentError.new("#{observing_klass_name} is not valid. If you have an observer #{name}::FooBar, pass :foo_bar")
|
35
|
+
end
|
36
|
+
|
37
|
+
def register_observers(*names)
|
38
|
+
names.each { |name| register_observer(name) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def methods_observed(*names)
|
42
|
+
names.each do |name|
|
43
|
+
define_method("observe_#{name.to_s}".to_sym) do |*args, &block|
|
44
|
+
attach_observers(*args)
|
45
|
+
block.call
|
46
|
+
changed
|
47
|
+
notify_observers
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def fetch_observer(name)
|
53
|
+
observing_classes.fetch(name)
|
54
|
+
rescue IndexError
|
55
|
+
raise ArgumentError.new("#{name} is not registered as an observer")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spotter do
|
4
|
+
class SpotterTest
|
5
|
+
class Foo
|
6
|
+
attr_accessor :obj
|
7
|
+
|
8
|
+
def initialize(obj)
|
9
|
+
@obj = obj
|
10
|
+
obj.add_observer(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def update
|
14
|
+
obj.bar += 'observer'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
include Spotter
|
19
|
+
|
20
|
+
register_observers :foo
|
21
|
+
methods_observed :save, :improper_save, :another_improper_save
|
22
|
+
|
23
|
+
attr_accessor :bar
|
24
|
+
|
25
|
+
def initialize
|
26
|
+
@bar = 'hola'
|
27
|
+
end
|
28
|
+
|
29
|
+
def save
|
30
|
+
run_observers(:for => :save, :with => :foo) do
|
31
|
+
self.bar += 'test'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def improper_save
|
36
|
+
run_observers(:for => :improper_save) do
|
37
|
+
self.bar += 'test'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def another_improper_save
|
42
|
+
run_observers(:with => :foo) do
|
43
|
+
self.bar += 'test'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def unobserved_save
|
48
|
+
run_observers(:for => :unobserved_save, :with => :foo) do
|
49
|
+
self.bar += 'test'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
subject { SpotterTest.new }
|
55
|
+
|
56
|
+
describe "observes the changes in the object it is observing" do
|
57
|
+
it "updates the object" do
|
58
|
+
subject.save
|
59
|
+
subject.bar.should eq('holatestobserver')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
it "throws an error when you call run_observers without a option :with" do
|
64
|
+
expect { subject.improper_save }.to raise_exception(ArgumentError, "Must have an option called :with")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "throws an error when you call run_observers without a option :for" do
|
68
|
+
expect { subject.another_improper_save }.to raise_exception(ArgumentError, "Must have an option called :for")
|
69
|
+
end
|
70
|
+
|
71
|
+
it "throws an error when you call run_observers with an option :for which represents a method that is not observed" do
|
72
|
+
expect { subject.unobserved_save }.to raise_exception(ArgumentError, "Method is not being observed")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "throws an error when the observer is not found" do
|
76
|
+
expect { subject.attach_observer(:baz) }.to raise_exception("baz is not registered as an observer")
|
77
|
+
end
|
78
|
+
|
79
|
+
it "throws an error when registering an observer for which a class does not exist" do
|
80
|
+
expect { SpotterTest.register_observer(:baz) }.to raise_exception(ArgumentError, "baz is not valid. If you have an observer SpotterTest::FooBar, pass :foo_bar")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'rspec'
|
6
|
+
require 'spotter'
|
7
|
+
require 'coveralls'
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.mock_with :rspec
|
11
|
+
config.order = 'random'
|
12
|
+
|
13
|
+
# Use color in STDOUT
|
14
|
+
config.color_enabled = true
|
15
|
+
|
16
|
+
# Use color not only in STDOUT but also in pagers and files
|
17
|
+
config.tty = true
|
18
|
+
end
|
19
|
+
|
20
|
+
Coveralls.wear!
|
data/spotter.gemspec
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "spotter"
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Suman Mukherjee"]
|
12
|
+
s.date = "2013-06-09"
|
13
|
+
s.description = "Gem that provides a simple interface for adding observers to your ruby classes"
|
14
|
+
s.email = "sumanmukherjee03@gmail.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.md"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".travis.yml",
|
22
|
+
"Gemfile",
|
23
|
+
"LICENSE.txt",
|
24
|
+
"README.md",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"lib/spotter.rb",
|
28
|
+
"spec/lib/spotter_spec.rb",
|
29
|
+
"spec/spec_helper.rb",
|
30
|
+
"spotter.gemspec"
|
31
|
+
]
|
32
|
+
s.homepage = "http://github.com/sumanmukherjee03/spotter"
|
33
|
+
s.licenses = ["MIT"]
|
34
|
+
s.require_paths = ["lib"]
|
35
|
+
s.rubygems_version = "1.8.25"
|
36
|
+
s.summary = "A gem that implements a simple interface for adding observers to your classes"
|
37
|
+
|
38
|
+
if s.respond_to? :specification_version then
|
39
|
+
s.specification_version = 3
|
40
|
+
|
41
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
42
|
+
s.add_runtime_dependency(%q<spotter>, [">= 0"])
|
43
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
44
|
+
s.add_development_dependency(%q<travis-lint>, [">= 0"])
|
45
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
46
|
+
s.add_development_dependency(%q<coveralls>, [">= 0"])
|
47
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
48
|
+
s.add_development_dependency(%q<travis-lint>, [">= 0"])
|
49
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
50
|
+
s.add_development_dependency(%q<coveralls>, [">= 0"])
|
51
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
52
|
+
s.add_development_dependency(%q<travis-lint>, [">= 0"])
|
53
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
54
|
+
s.add_development_dependency(%q<coveralls>, [">= 0"])
|
55
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
56
|
+
s.add_development_dependency(%q<travis-lint>, [">= 0"])
|
57
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
58
|
+
s.add_development_dependency(%q<coveralls>, [">= 0"])
|
59
|
+
else
|
60
|
+
s.add_dependency(%q<spotter>, [">= 0"])
|
61
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
62
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
63
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
64
|
+
s.add_dependency(%q<coveralls>, [">= 0"])
|
65
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
66
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
67
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
68
|
+
s.add_dependency(%q<coveralls>, [">= 0"])
|
69
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
70
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
71
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
72
|
+
s.add_dependency(%q<coveralls>, [">= 0"])
|
73
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
74
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
75
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
76
|
+
s.add_dependency(%q<coveralls>, [">= 0"])
|
77
|
+
end
|
78
|
+
else
|
79
|
+
s.add_dependency(%q<spotter>, [">= 0"])
|
80
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
81
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
82
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
83
|
+
s.add_dependency(%q<coveralls>, [">= 0"])
|
84
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
85
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
86
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
87
|
+
s.add_dependency(%q<coveralls>, [">= 0"])
|
88
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
89
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
90
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
91
|
+
s.add_dependency(%q<coveralls>, [">= 0"])
|
92
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
93
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
94
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
95
|
+
s.add_dependency(%q<coveralls>, [">= 0"])
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
metadata
ADDED
@@ -0,0 +1,334 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spotter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Suman Mukherjee
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-06-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: spotter
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activesupport
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: travis-lint
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: coveralls
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: jeweler
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: travis-lint
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
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
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rspec
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: coveralls
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: jeweler
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
- !ruby/object:Gem::Dependency
|
175
|
+
name: travis-lint
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
178
|
+
requirements:
|
179
|
+
- - ! '>='
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
type: :development
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ! '>='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: rspec
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
194
|
+
requirements:
|
195
|
+
- - ! '>='
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '0'
|
198
|
+
type: :development
|
199
|
+
prerelease: false
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - ! '>='
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: '0'
|
206
|
+
- !ruby/object:Gem::Dependency
|
207
|
+
name: coveralls
|
208
|
+
requirement: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
210
|
+
requirements:
|
211
|
+
- - ! '>='
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: '0'
|
214
|
+
type: :development
|
215
|
+
prerelease: false
|
216
|
+
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
218
|
+
requirements:
|
219
|
+
- - ! '>='
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '0'
|
222
|
+
- !ruby/object:Gem::Dependency
|
223
|
+
name: jeweler
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
225
|
+
none: false
|
226
|
+
requirements:
|
227
|
+
- - ! '>='
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
none: false
|
234
|
+
requirements:
|
235
|
+
- - ! '>='
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: '0'
|
238
|
+
- !ruby/object:Gem::Dependency
|
239
|
+
name: travis-lint
|
240
|
+
requirement: !ruby/object:Gem::Requirement
|
241
|
+
none: false
|
242
|
+
requirements:
|
243
|
+
- - ! '>='
|
244
|
+
- !ruby/object:Gem::Version
|
245
|
+
version: '0'
|
246
|
+
type: :development
|
247
|
+
prerelease: false
|
248
|
+
version_requirements: !ruby/object:Gem::Requirement
|
249
|
+
none: false
|
250
|
+
requirements:
|
251
|
+
- - ! '>='
|
252
|
+
- !ruby/object:Gem::Version
|
253
|
+
version: '0'
|
254
|
+
- !ruby/object:Gem::Dependency
|
255
|
+
name: rspec
|
256
|
+
requirement: !ruby/object:Gem::Requirement
|
257
|
+
none: false
|
258
|
+
requirements:
|
259
|
+
- - ! '>='
|
260
|
+
- !ruby/object:Gem::Version
|
261
|
+
version: '0'
|
262
|
+
type: :development
|
263
|
+
prerelease: false
|
264
|
+
version_requirements: !ruby/object:Gem::Requirement
|
265
|
+
none: false
|
266
|
+
requirements:
|
267
|
+
- - ! '>='
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: '0'
|
270
|
+
- !ruby/object:Gem::Dependency
|
271
|
+
name: coveralls
|
272
|
+
requirement: !ruby/object:Gem::Requirement
|
273
|
+
none: false
|
274
|
+
requirements:
|
275
|
+
- - ! '>='
|
276
|
+
- !ruby/object:Gem::Version
|
277
|
+
version: '0'
|
278
|
+
type: :development
|
279
|
+
prerelease: false
|
280
|
+
version_requirements: !ruby/object:Gem::Requirement
|
281
|
+
none: false
|
282
|
+
requirements:
|
283
|
+
- - ! '>='
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: '0'
|
286
|
+
description: Gem that provides a simple interface for adding observers to your ruby
|
287
|
+
classes
|
288
|
+
email: sumanmukherjee03@gmail.com
|
289
|
+
executables: []
|
290
|
+
extensions: []
|
291
|
+
extra_rdoc_files:
|
292
|
+
- LICENSE.txt
|
293
|
+
- README.md
|
294
|
+
files:
|
295
|
+
- .document
|
296
|
+
- .travis.yml
|
297
|
+
- Gemfile
|
298
|
+
- LICENSE.txt
|
299
|
+
- README.md
|
300
|
+
- Rakefile
|
301
|
+
- VERSION
|
302
|
+
- lib/spotter.rb
|
303
|
+
- spec/lib/spotter_spec.rb
|
304
|
+
- spec/spec_helper.rb
|
305
|
+
- spotter.gemspec
|
306
|
+
homepage: http://github.com/sumanmukherjee03/spotter
|
307
|
+
licenses:
|
308
|
+
- MIT
|
309
|
+
post_install_message:
|
310
|
+
rdoc_options: []
|
311
|
+
require_paths:
|
312
|
+
- lib
|
313
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
314
|
+
none: false
|
315
|
+
requirements:
|
316
|
+
- - ! '>='
|
317
|
+
- !ruby/object:Gem::Version
|
318
|
+
version: '0'
|
319
|
+
segments:
|
320
|
+
- 0
|
321
|
+
hash: -4484668270835940003
|
322
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
323
|
+
none: false
|
324
|
+
requirements:
|
325
|
+
- - ! '>='
|
326
|
+
- !ruby/object:Gem::Version
|
327
|
+
version: '0'
|
328
|
+
requirements: []
|
329
|
+
rubyforge_project:
|
330
|
+
rubygems_version: 1.8.25
|
331
|
+
signing_key:
|
332
|
+
specification_version: 3
|
333
|
+
summary: A gem that implements a simple interface for adding observers to your classes
|
334
|
+
test_files: []
|