alarm_it 0.0.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.
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/CHANGELOG +0 -0
- data/Gemfile +3 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +33 -0
- data/Rakefile +18 -0
- data/VERSION +1 -0
- data/alarm_it.gemspec +25 -0
- data/alarm_it.sqlite3 +0 -0
- data/generators/alarm_it_migration/alarm_it_migration_generator.rb +7 -0
- data/generators/alarm_it_migration/templates/migration.rb +21 -0
- data/lib/alarm_it.rb +20 -0
- data/lib/alarm_it/alarm.rb +62 -0
- data/lib/alarm_it/alarmable.rb +13 -0
- data/lib/alarm_it/alarmer.rb +21 -0
- data/lib/alarm_it/alarms_helper.rb +17 -0
- data/lib/alarm_it/version.rb +3 -0
- data/lib/generators/alarm_it/migration/migration_generator.rb +32 -0
- data/lib/generators/alarm_it/migration/templates/active_record/migration.rb +21 -0
- data/rails/init.rb +1 -0
- data/spec/alarm_it/alarm_spec.rb +76 -0
- data/spec/alarm_it/alarmable_spec.rb +8 -0
- data/spec/alarm_it/alarmer_spec.rb +24 -0
- data/spec/database.yml.sample +17 -0
- data/spec/debug.log +8246 -0
- data/spec/models.rb +35 -0
- data/spec/schema.rb +25 -0
- data/spec/spec_helper.rb +60 -0
- data/uninstall.rb +1 -0
- metadata +188 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/CHANGELOG
ADDED
File without changes
|
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2007 Michael Bleigh and Intridea Inc.
|
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.rdoc
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
= AlarmIt
|
2
|
+
|
3
|
+
This plugin is a work in progress.
|
4
|
+
it allows the attachment of alarms to any kind of models.
|
5
|
+
|
6
|
+
=== Rails 3.0
|
7
|
+
|
8
|
+
To use it, add it to your Gemfile:
|
9
|
+
|
10
|
+
gem 'alarm_it'
|
11
|
+
|
12
|
+
==== Post Installation
|
13
|
+
|
14
|
+
1. rails generate alarm_it:migration
|
15
|
+
2. rake db:migrate
|
16
|
+
|
17
|
+
== Testing
|
18
|
+
|
19
|
+
Acts As Alarmable On uses RSpec for its test coverage. Inside the plugin
|
20
|
+
directory, you can run the specs for RoR 3.0.0 with:
|
21
|
+
|
22
|
+
rake spec
|
23
|
+
|
24
|
+
|
25
|
+
== Usage
|
26
|
+
|
27
|
+
class User < ActiveRecord::Base
|
28
|
+
acts_as_alarmer
|
29
|
+
end
|
30
|
+
|
31
|
+
class AModel < ActiveRecord::Base
|
32
|
+
acts_as_alarmable
|
33
|
+
end
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
desc 'Default: run specs'
|
5
|
+
task :default => :spec
|
6
|
+
RSpec::Core::RakeTask.new do |t|
|
7
|
+
t.pattern = "spec/**/*_spec.rb"
|
8
|
+
end
|
9
|
+
|
10
|
+
RSpec::Core::RakeTask.new('rcov') do |t|
|
11
|
+
t.pattern = "spec/**/*_spec.rb"
|
12
|
+
t.rcov = true
|
13
|
+
t.rcov_opts = ['--exclude', 'spec']
|
14
|
+
end
|
15
|
+
|
16
|
+
rescue LoadError
|
17
|
+
puts "Rspec not available. Install it with: gem install rspec"
|
18
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
data/alarm_it.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "alarm_it"
|
3
|
+
s.version = '0.0.0'
|
4
|
+
# s.platform = Gem::Platform::RUBY
|
5
|
+
|
6
|
+
s.authors = ["Yannis Jaquet"]
|
7
|
+
s.date = %q{2011-05-24}
|
8
|
+
s.description = %q{Associate alarms to any model}
|
9
|
+
s.summary = %q{Associate alarms to any model}
|
10
|
+
s.email = %q{suvar3_7@mac.com}
|
11
|
+
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
14
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
15
|
+
s.require_paths = ["lib"]
|
16
|
+
|
17
|
+
s.add_dependency "rails", "~> 3.1.0.rc1"
|
18
|
+
s.add_dependency "mysql2", "~> 0.3.2"
|
19
|
+
s.add_dependency "will_paginate", "~>3.0.pre2"
|
20
|
+
|
21
|
+
s.add_development_dependency "rspec", "~> 2.6.0"
|
22
|
+
s.add_development_dependency 'shoulda-matchers'
|
23
|
+
s.add_development_dependency 'factory_girl'
|
24
|
+
end
|
25
|
+
|
data/alarm_it.sqlite3
ADDED
File without changes
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class AlarmItMigration < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :alarms do |t|
|
4
|
+
t.string :name
|
5
|
+
t.text :description
|
6
|
+
t.reference :alarmable, :polymorphic => true
|
7
|
+
t.datetime :set_at
|
8
|
+
t.datetime :repeat_at
|
9
|
+
t.datetime :inactivated_at
|
10
|
+
t.reference :alarmer, :polymorphic => true
|
11
|
+
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
add_index :alarms, [:alarmable_type, :alarmable_id]
|
15
|
+
add_index :alarms, [:alarmer_type, :alarmer_id]
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.down
|
19
|
+
drop_table :alarms
|
20
|
+
end
|
21
|
+
end
|
data/lib/alarm_it.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "active_record"
|
2
|
+
require "action_view"
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
+
|
6
|
+
require "alarm_it/alarmable"
|
7
|
+
require "alarm_it/alarmer"
|
8
|
+
require "alarm_it/alarm"
|
9
|
+
require "alarm_it/alarms_helper"
|
10
|
+
|
11
|
+
$LOAD_PATH.shift
|
12
|
+
|
13
|
+
if defined?(ActiveRecord::Base)
|
14
|
+
ActiveRecord::Base.send :include, AlarmIt::Alarmer
|
15
|
+
ActiveRecord::Base.send :include, AlarmIt::Alarmable
|
16
|
+
end
|
17
|
+
|
18
|
+
if defined?(ActionView::Base)
|
19
|
+
ActionView::Base.send :include, AlarmIt::AlarmsHelper
|
20
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module AlarmIt
|
2
|
+
class Alarm < ::ActiveRecord::Base
|
3
|
+
|
4
|
+
attr_accessible :name, :set_at, :repeat_at, :alarmable, :alarmable_type, :alarmable_id, :alarmer, :alarmer_type, :alarmer_id, :inactivated_at
|
5
|
+
|
6
|
+
belongs_to :alarmable, :polymorphic => true
|
7
|
+
belongs_to :alarmer, :polymorphic => true
|
8
|
+
|
9
|
+
validates_presence_of :name, :alarmable_type, :alarmable_id, :alarmer_type, :alarmer_id, :set_at
|
10
|
+
|
11
|
+
validates_each :repeat_at do |alarmable, attr, value|
|
12
|
+
if !alarmable.set_at.blank? and !alarmable.repeat_at.blank? and alarmable.repeat_at < alarmable.set_at
|
13
|
+
alarmable.errors[:repeat_at] < ": anterior to set time!"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
before_validation :set_set_at
|
18
|
+
|
19
|
+
default_scope order("alarms.set_at ASC")
|
20
|
+
scope :inactivated, order("set_at DESC, repeat_at DESC").where("inactivated_at IS NOT NULL")
|
21
|
+
scope :pending, order("set_at DESC, repeat_at DESC").where("inactivated_at IS NULL")
|
22
|
+
scope :ringing, order("set_at DESC, repeat_at DESC").where("inactivated_at IS NULL AND (set_at < UTC_TIMESTAMP() OR (repeat_at IS NOT NULL AND repeat_at < UTC_TIMESTAMP()))")
|
23
|
+
|
24
|
+
def symbols
|
25
|
+
"⚠" if ringing?
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def inactivate!
|
30
|
+
update_attributes(:inactivated_at => Time.current)
|
31
|
+
end
|
32
|
+
|
33
|
+
def is_pending?
|
34
|
+
inactivated_at.blank? and (set_at > Time.current or (repeat_at.present? and repeat_at > Time.current))
|
35
|
+
end
|
36
|
+
|
37
|
+
def is_inactivated?
|
38
|
+
inactivated_at.present? and inactivated_at < Time.current
|
39
|
+
end
|
40
|
+
|
41
|
+
def is_ringing?
|
42
|
+
inactivated_at.blank? and (set_at < Time.current or (repeat_at.present? and repeat_at < Time.current))
|
43
|
+
end
|
44
|
+
|
45
|
+
def inactivated_at_bool=(inactivated_at_bool)
|
46
|
+
if inactivated_at_bool.nil?
|
47
|
+
self.inactivated_at = ''
|
48
|
+
elsif self.inactivated_at.blank?
|
49
|
+
self.inactivated_at = Time.current
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def set_set_at
|
56
|
+
if self.set_at.blank? and !self.repeat_at.blank?
|
57
|
+
self.set_at = self.repeat_at
|
58
|
+
self.repeat_at = nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module AlarmIt
|
2
|
+
module Alarmable
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def acts_as_alarmable
|
9
|
+
has_many :alarms, :as => :alarmable, :dependent => :destroy, :include => :alarmer, :class_name => "AlarmIt::Alarm"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module AlarmIt
|
2
|
+
module Alarmer
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def acts_as_alarmer
|
9
|
+
has_many :alarms, :as => :alarmer, :dependent => :destroy, :include => :alarmable, :class_name => "AlarmIt::Alarm"
|
10
|
+
|
11
|
+
include AlarmIt::Alarmer::InstanceMethods
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module InstanceMethods
|
16
|
+
def set_alarm(name, alarmable, datetime)
|
17
|
+
alarms.create!(:name => name, :alarmable => alarmable, :set_at => datetime)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module AlarmIt
|
2
|
+
module AlarmsHelper
|
3
|
+
# See the README for an example using tag_cloud.
|
4
|
+
# def tag_cloud(tags, classes)
|
5
|
+
# tags = tags.all if tags.respond_to?(:all)
|
6
|
+
#
|
7
|
+
# return [] if tags.empty?
|
8
|
+
#
|
9
|
+
# max_count = tags.sort_by(&:count).last.count.to_f
|
10
|
+
#
|
11
|
+
# tags.each do |tag|
|
12
|
+
# index = ((tag.count / max_count) * (classes.size - 1)).round
|
13
|
+
# yield tag, classes[index]
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
|
3
|
+
module AlarmIt
|
4
|
+
class MigrationGenerator < Rails::Generators::Base
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
|
7
|
+
desc "Generates migration for Alarm"
|
8
|
+
|
9
|
+
def self.orm
|
10
|
+
Rails::Generators.options[:rails][:orm]
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.source_root
|
14
|
+
File.join(File.dirname(__FILE__), 'templates', (orm.to_s unless orm.class.eql?(String)) )
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.orm_has_migration?
|
18
|
+
[:active_record].include? orm
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.next_migration_number(path)
|
22
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
23
|
+
end
|
24
|
+
|
25
|
+
def url(/assets/
|
26
|
+
if self.class.orm_has_migration?
|
27
|
+
migration_template 'migration.rb', 'db/migrate/alarm_it_migration'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class AlarmItMigration < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :alarms do |t|
|
4
|
+
t.string :name
|
5
|
+
t.text :description
|
6
|
+
t.reference :alarmable, :polymorphic => true
|
7
|
+
t.datetime :set_at
|
8
|
+
t.datetime :repeat_at
|
9
|
+
t.datetime :inactivated_at
|
10
|
+
t.reference :alarmer, :polymorphic => true
|
11
|
+
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
add_index :alarms, [:alarmable_type, :alarmable_id]
|
15
|
+
add_index :alarms, [:alarmer_type, :alarmer_id]
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.down
|
19
|
+
drop_table :alarms
|
20
|
+
end
|
21
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'alarm_it'
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe AlarmIt::Alarm do
|
3
|
+
before(:each) do
|
4
|
+
clean_database!
|
5
|
+
@alarmer = Alarmer.create(:name => 'pablo')
|
6
|
+
@alarmable = Alarmable.create(:name => 'thiz_obzect')
|
7
|
+
end
|
8
|
+
|
9
|
+
it { should belong_to(:alarmable) }
|
10
|
+
it { should belong_to(:alarmer) }
|
11
|
+
it { should validate_presence_of :alarmable_type }
|
12
|
+
it { should validate_presence_of :alarmable_id }
|
13
|
+
it { should validate_presence_of :set_at }
|
14
|
+
it { should validate_presence_of :alarmer_id }
|
15
|
+
it { should validate_presence_of :alarmer_type }
|
16
|
+
|
17
|
+
describe "an alarm" do
|
18
|
+
let(:alarm){AlarmIt::Alarm.create(:name => 'alarm', :alarmer => @alarmer, :alarmable => @alarmable, :set_at => 2.days.from_now)}
|
19
|
+
specify {alarm.alarmer.should eql(@alarmer)}
|
20
|
+
specify {alarm.alarmable.should eql(@alarmable)}
|
21
|
+
specify {alarm.should(be_valid, alarm.errors.full_messages.to_sentence)}
|
22
|
+
specify {alarm.should be_an_instance_of(AlarmIt::Alarm)}
|
23
|
+
specify {alarm.should respond_to(:alarmer)}
|
24
|
+
specify {alarm.should respond_to(:alarmable)}
|
25
|
+
it "should be among the pending alarms" do
|
26
|
+
AlarmIt::Alarm.pending.include?(alarm)
|
27
|
+
end
|
28
|
+
it "should be pending" do
|
29
|
+
alarm.is_pending?.should be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should not be inactivated" do
|
33
|
+
alarm.is_inactivated?.should_not be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should not be ringing" do
|
37
|
+
alarm.is_ringing?.should_not be_true
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "when it's inactivated" do
|
41
|
+
before :each do
|
42
|
+
alarm.inactivate!
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be among the inactivated alarms" do
|
46
|
+
AlarmIt::Alarm.inactivated.include?(alarm)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be inactivated" do
|
50
|
+
alarm.is_inactivated?.should be_true
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should not be pending" do
|
54
|
+
alarm.is_pending?.should_not be_true
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should not be ringing" do
|
58
|
+
alarm.is_ringing?.should_not be_true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "with set_at time in the past" do
|
63
|
+
before :each do
|
64
|
+
alarm.update_attributes(:set_at => 2.hours.ago)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should be among the ringing alarms" do
|
68
|
+
AlarmIt::Alarm.ringing.include?(alarm)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should be ringing" do
|
72
|
+
alarm.is_ringing?.should be_true
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|