validates_overlap 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.6
1
+ 0.1.0
@@ -5,6 +5,7 @@ class OverlapValidator < ActiveModel::EachValidator
5
5
 
6
6
  attr_accessor :sql_conditions
7
7
  attr_accessor :sql_values
8
+ attr_accessor :scoped_model
8
9
 
9
10
  def initialize(args)
10
11
  attributes_are_range(args[:attributes])
@@ -12,7 +13,13 @@ class OverlapValidator < ActiveModel::EachValidator
12
13
  end
13
14
 
14
15
  def validate(record)
15
- record.errors.add(attributes.first, :overlap) if self.find_crossed(record)
16
+ if self.find_crossed(record)
17
+ if record.respond_to? attributes.first
18
+ record.errors.add(attributes.first, :overlap)
19
+ else
20
+ record.errors.add(:base, :overlap)
21
+ end
22
+ end
16
23
  end
17
24
 
18
25
 
@@ -20,20 +27,34 @@ class OverlapValidator < ActiveModel::EachValidator
20
27
 
21
28
  # Check if exists at least one record in DB which is crossed with current record
22
29
  def find_crossed(record)
30
+ self.scoped_model = record.class
23
31
  self.generate_overlap_sql_conditions(record)
24
32
  self.generate_overlap_sql_values(record)
25
- self.add_attributes(record, options[:scope]) if options && !(scope = options[:scope]).blank?
33
+ self.add_attributes(record, options[:scope]) if options && options[:scope].present?
34
+ self.add_query_options(options[:query_options]) if options && options[:query_options].present?
26
35
 
27
- return record.class.exists?([sql_conditions, sql_values])
36
+ return self.scoped_model.exists?([sql_conditions, sql_values])
28
37
  end
29
38
 
30
39
 
31
40
  # Resolve attributes values from record to use in sql conditions
32
41
  # return array in form ['2011-01-10', '2011-02-20']
33
42
  def resolve_values_from_attributes(record)
34
- attributes.map { |attr| record.send(attr.to_sym) }
43
+ attributes.map do |attr|
44
+ if attr.to_s.include?(".")
45
+ self.get_assoc_value(record, attr)
46
+ else
47
+ record.send(attr.to_sym)
48
+ end
49
+ end
35
50
  end
36
51
 
52
+ def get_assoc_value(record, attr)
53
+ assoc, attr_name = attr.to_s.split(".")
54
+ assoc_name = assoc.singularize.to_sym
55
+ assoc_obj = record.send(assoc_name) if record.respond_to?(assoc_name)
56
+ (assoc_obj || record).send(attr_name.to_sym)
57
+ end
37
58
  # Prepare attribute names to use in sql conditions
38
59
  # return array in form ['meetings.starts_at', 'meetings.ends_at']
39
60
  def attributes_to_sql(record)
@@ -43,7 +64,11 @@ class OverlapValidator < ActiveModel::EachValidator
43
64
 
44
65
  # Prepare attribute name to use in sql conditions created in form 'table_name.attribute_name'
45
66
  def attribute_to_sql(attr, record)
46
- "#{record_table_name(record)}.#{attr}"
67
+ if attr.to_s.include?(".")
68
+ attr
69
+ else
70
+ "#{record_table_name(record)}.#{attr}"
71
+ end
47
72
  end
48
73
 
49
74
 
@@ -76,12 +101,12 @@ class OverlapValidator < ActiveModel::EachValidator
76
101
  starts_at_value, ends_at_value = resolve_values_from_attributes(record)
77
102
  self.sql_values = {:starts_at_value => starts_at_value, :ends_at_value => ends_at_value}
78
103
  end
79
-
104
+
80
105
  # Return the condition string depend on exclude_edges option.
81
106
  def condition_string(starts_at_attr, ends_at_attr)
82
107
  except_option = Array(options[:exclude_edges]).map(&:to_s)
83
- starts_at_sign = except_option.include?(starts_at_attr.split(".").last) ? "<" : "<="
84
- ends_at_sign = except_option.include?(ends_at_attr.split(".").last) ? ">" : ">="
108
+ starts_at_sign = except_option.include?(starts_at_attr.to_s.split(".").last) ? "<" : "<="
109
+ ends_at_sign = except_option.include?(ends_at_attr.to_s.split(".").last) ? ">" : ">="
85
110
  "#{ends_at_attr} #{ends_at_sign} :starts_at_value AND #{starts_at_attr} #{starts_at_sign} :ends_at_value"
86
111
  end
87
112
 
@@ -91,6 +116,10 @@ class OverlapValidator < ActiveModel::EachValidator
91
116
  def add_attributes(record, attrs)
92
117
  if attrs.is_a?(Array)
93
118
  attrs.each { |attr| self.add_attribute(record, attr) }
119
+ elsif attrs.is_a?(Hash)
120
+ attrs.each do |attr_name, value|
121
+ self.add_attribute(record, attr_name, value)
122
+ end
94
123
  else
95
124
  self.add_attribute(record, attrs)
96
125
  end
@@ -98,9 +127,31 @@ class OverlapValidator < ActiveModel::EachValidator
98
127
 
99
128
 
100
129
  # Add attribute and his value to sql condition
101
- def add_attribute(record, attr)
102
- self.sql_conditions += " AND #{attribute_to_sql(attr, record)} = :#{attr}_value"
103
- self.sql_values.merge!({:"#{attr}_value" => record.send(:"#{attr}")})
130
+ def add_attribute(record, attr_name, value = nil)
131
+ self.sql_conditions += " AND #{attribute_to_sql(attr_name, record)} = :#{value_attribute_name(attr_name)}"
132
+ self.sql_values.merge!({:"#{value_attribute_name(attr_name)}" => resolve_scope_value(record, attr_name, value)})
133
+ end
134
+
135
+ def value_attribute_name(attr_name)
136
+ name = attr_name.to_s.include?(".") ? attr_name.to_s.gsub(".", "_") : attr_name
137
+ name + "_value"
138
+ end
139
+
140
+ def resolve_scope_value(record, attr_name, value = nil)
141
+ if value
142
+ value.is_a?(Proc) ? value.call(record) : value
143
+ else
144
+ record.send(:"#{attr_name}")
145
+ end
146
+ end
147
+
148
+ # Allow to use scope, joins, includes methods before querying
149
+ # == Example:
150
+ # validates_overlap :date_from, :date_to, :query_options => {:includes => "visits"}
151
+ def add_query_options(methods)
152
+ methods.each do |method_name, params|
153
+ self.scoped_model = self.scoped_model.send(method_name.to_sym, *params)
154
+ end
104
155
  end
105
156
 
106
157
  end
@@ -0,0 +1,9 @@
1
+ class Position < ActiveRecord::Base
2
+ belongs_to :time_slot
3
+ belongs_to :user
4
+ validates "time_slots.starts_at", "time_slots.ends_at",
5
+ :overlap => {
6
+ :query_options => {:includes => :time_slot},
7
+ :scope => { "positions.user_id" => proc{|position| position.user_id} }
8
+ }
9
+ end
@@ -1,3 +1,3 @@
1
1
  class StartOverlapMeeting < ActiveRecord::Base
2
2
  validates :starts_at, :ends_at, :overlap => {:exclude_edges => :starts_at}
3
- end
3
+ end
@@ -0,0 +1,8 @@
1
+ class TimeSlot < ActiveRecord::Base
2
+ has_many :positions
3
+ validates "time_slots.starts_at", "time_slots.ends_at",
4
+ :overlap => {
5
+ :query_options => {:includes => :positions},
6
+ :scope => {"positions.user_id" => proc{|time_slot| time_slot.positions.map(&:user_id)} }
7
+ }
8
+ end
@@ -0,0 +1,20 @@
1
+ class CreateTimeSlot < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :time_slots do |t|
4
+ t.date :starts_at
5
+ t.date :ends_at
6
+ t.timestamps
7
+ end
8
+
9
+ create_table :positions do |t|
10
+ t.belongs_to :user
11
+ t.belongs_to :time_slot
12
+ t.timestamps
13
+ end
14
+ end
15
+
16
+ def self.down
17
+ drop_table :time_slots
18
+ drop_table :positions
19
+ end
20
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20120509131032) do
14
+ ActiveRecord::Schema.define(:version => 20121207162212) do
15
15
 
16
16
  create_table "end_overlap_meetings", :force => true do |t|
17
17
  t.date "starts_at"
@@ -27,6 +27,13 @@ ActiveRecord::Schema.define(:version => 20120509131032) do
27
27
  t.datetime "updated_at", :null => false
28
28
  end
29
29
 
30
+ create_table "positions", :force => true do |t|
31
+ t.integer "user_id"
32
+ t.integer "time_slot_id"
33
+ t.datetime "created_at", :null => false
34
+ t.datetime "updated_at", :null => false
35
+ end
36
+
30
37
  create_table "start_end_overlap_meetings", :force => true do |t|
31
38
  t.date "starts_at"
32
39
  t.date "ends_at"
@@ -41,6 +48,13 @@ ActiveRecord::Schema.define(:version => 20120509131032) do
41
48
  t.datetime "updated_at", :null => false
42
49
  end
43
50
 
51
+ create_table "time_slots", :force => true do |t|
52
+ t.date "starts_at"
53
+ t.date "ends_at"
54
+ t.datetime "created_at", :null => false
55
+ t.datetime "updated_at", :null => false
56
+ end
57
+
44
58
  create_table "user_meetings", :force => true do |t|
45
59
  t.integer "user_id"
46
60
  t.date "starts_at"
@@ -0,0 +1,4 @@
1
+ Factory.define :position do |u|
2
+ u.association(:user, :factory => :user)
3
+ u.association(:time_slot, :factory => :time_slot)
4
+ end
@@ -0,0 +1,4 @@
1
+ Factory.define :time_slot do |u|
2
+ u.starts_at '2011-01-05'.to_date
3
+ u.ends_at '2011-01-08'.to_date
4
+ end
@@ -1,3 +1,3 @@
1
1
  Factory.define :user do |u|
2
- u.name 'John'
3
- end
2
+ u.name 'John'
3
+ end
@@ -0,0 +1,44 @@
1
+ require_relative '../../../spec_helper'
2
+ require_relative '../factories/position'
3
+ require_relative '../factories/time_slot'
4
+ require_relative '../factories/user'
5
+
6
+ describe Position do
7
+
8
+ before(:all) do
9
+ Position.delete_all
10
+ TimeSlot.delete_all
11
+ User.delete_all
12
+ end
13
+
14
+ it "create position" do
15
+ lambda {
16
+ Factory(:position)
17
+ }.should change(Position, :count).by(1)
18
+ end
19
+
20
+ context "Validation with scope and association" do
21
+
22
+ it "is not valid if exists time slot which have position with same person" do
23
+ time_slot1 = Factory.create(:time_slot, :starts_at => "2012-10-11".to_date, :ends_at => "2012-10-13".to_date)
24
+ time_slot2 = Factory.create(:time_slot, :starts_at => "2012-10-12".to_date, :ends_at => "2012-10-13".to_date)
25
+ user = Factory.create(:user)
26
+ position1 = Factory.create(:position, :time_slot => time_slot1, :user => user)
27
+ position2 = Factory.build(:position, :time_slot => time_slot2, :user => user)
28
+ position2.should_not be_valid
29
+ position2.errors[:base].should_not be_empty
30
+ end
31
+
32
+ it "is be valid if exists time slot which have position with same person" do
33
+ time_slot1 = Factory.create(:time_slot, :starts_at => "2012-10-11".to_date, :ends_at => "2012-10-13".to_date)
34
+ time_slot2 = Factory.create(:time_slot, :starts_at => "2012-10-14".to_date, :ends_at => "2012-10-15".to_date)
35
+ user = Factory.create(:user)
36
+ position1 = Factory.create(:position, :time_slot => time_slot1, :user => user)
37
+ position2 = Factory.build(:position, :time_slot => time_slot2, :user => user)
38
+ position2.should be_valid
39
+ position2.errors[:base].should be_empty
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../../../spec_helper'
2
+ require_relative '../factories/position'
3
+ require_relative '../factories/time_slot'
4
+ require_relative '../factories/user'
5
+
6
+ describe TimeSlot do
7
+
8
+ before(:all) do
9
+ Position.delete_all
10
+ TimeSlot.delete_all
11
+ User.delete_all
12
+ end
13
+
14
+ it "create time_slot" do
15
+ lambda {
16
+ Factory(:time_slot)
17
+ }.should change(TimeSlot, :count).by(1)
18
+ end
19
+
20
+ context "Validation with scope and association" do
21
+
22
+ it "is not valid if exists time slot which have position with same person" do
23
+ time_slot1 = Factory.create(:time_slot, :starts_at => "2012-10-11".to_date, :ends_at => "2012-10-13".to_date)
24
+ time_slot2 = Factory.create(:time_slot, :starts_at => "2012-10-15".to_date, :ends_at => "2012-10-16".to_date)
25
+ user = Factory.create(:user)
26
+ position1 = Factory.create(:position, :time_slot => time_slot1, :user => user)
27
+ position2 = Factory.create(:position, :time_slot => time_slot2, :user => user)
28
+ time_slot2.reload
29
+ time_slot2.starts_at = "2012-10-12".to_date
30
+ time_slot2.should_not be_valid
31
+ time_slot2.errors[:base].should_not be_empty
32
+ end
33
+
34
+ it "is be valid if exists time slot which have position with same person" do
35
+ time_slot1 = Factory.create(:time_slot, :starts_at => "2012-10-11".to_date, :ends_at => "2012-10-13".to_date)
36
+ time_slot2 = Factory.create(:time_slot, :starts_at => "2012-10-14".to_date, :ends_at => "2012-10-16".to_date)
37
+ user = Factory.create(:user)
38
+ position1 = Factory.create(:position, :time_slot => time_slot1, :user => user)
39
+ position2 = Factory.build(:position, :time_slot => time_slot2, :user => user)
40
+ time_slot2.starts_at = "2012-10-15".to_date
41
+ time_slot2.should be_valid
42
+ time_slot2.errors[:base].should be_empty
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "validates_overlap"
8
- s.version = "0.0.6"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Robin Bortlik"]
12
- s.date = "2012-05-13"
12
+ s.date = "2012-12-07"
13
13
  s.description = "It can be useful when you you are developing some app where you will work with meetings, events etc."
14
14
  s.email = "robinbortlik@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -30,8 +30,10 @@ Gem::Specification.new do |s|
30
30
  "spec/dummy/app/helpers/application_helper.rb",
31
31
  "spec/dummy/app/models/end_overlap_meeting.rb",
32
32
  "spec/dummy/app/models/meeting.rb",
33
+ "spec/dummy/app/models/position.rb",
33
34
  "spec/dummy/app/models/start_end_overlap_meeting.rb",
34
35
  "spec/dummy/app/models/start_overlap_meeting.rb",
36
+ "spec/dummy/app/models/time_slot.rb",
35
37
  "spec/dummy/app/models/user.rb",
36
38
  "spec/dummy/app/models/user_meeting.rb",
37
39
  "spec/dummy/app/views/layouts/application.html.erb",
@@ -56,6 +58,7 @@ Gem::Specification.new do |s|
56
58
  "spec/dummy/db/migrate/20120509130956_create_end_overlap_meetings.rb",
57
59
  "spec/dummy/db/migrate/20120509131012_create_start_overlap_meetings.rb",
58
60
  "spec/dummy/db/migrate/20120509131032_create_start_end_overlap_meetings.rb",
61
+ "spec/dummy/db/migrate/20121207162212_create_time_slot.rb",
59
62
  "spec/dummy/db/schema.rb",
60
63
  "spec/dummy/public/404.html",
61
64
  "spec/dummy/public/422.html",
@@ -71,14 +74,18 @@ Gem::Specification.new do |s|
71
74
  "spec/dummy/script/rails",
72
75
  "spec/dummy/spec/factories/end_overlap_meeting.rb",
73
76
  "spec/dummy/spec/factories/meeting.rb",
77
+ "spec/dummy/spec/factories/position.rb",
74
78
  "spec/dummy/spec/factories/start_end_overlap_meeting.rb",
75
79
  "spec/dummy/spec/factories/start_overlap_meeting.rb",
80
+ "spec/dummy/spec/factories/time_slot.rb",
76
81
  "spec/dummy/spec/factories/user.rb",
77
82
  "spec/dummy/spec/factories/user_meeting.rb",
78
83
  "spec/dummy/spec/models/end_overlap_meeting_spec.rb",
79
84
  "spec/dummy/spec/models/meeting_spec.rb",
85
+ "spec/dummy/spec/models/position_spec.rb",
80
86
  "spec/dummy/spec/models/start_end_overlap_meeting_spec.rb",
81
87
  "spec/dummy/spec/models/start_overlap_meeting_spec.rb",
88
+ "spec/dummy/spec/models/time_slot_spec.rb",
82
89
  "spec/dummy/spec/models/user_meeting_spec.rb",
83
90
  "spec/dummy/spec/models/user_spec.rb",
84
91
  "spec/spec_helper.rb",
@@ -87,7 +94,7 @@ Gem::Specification.new do |s|
87
94
  s.homepage = "http://github.com/robinbortlik/validates_overlap"
88
95
  s.licenses = ["MIT"]
89
96
  s.require_paths = ["lib"]
90
- s.rubygems_version = "1.8.17"
97
+ s.rubygems_version = "1.8.24"
91
98
  s.summary = "This gem helps validate records with time overlap."
92
99
 
93
100
  if s.respond_to? :specification_version then
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_overlap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-13 00:00:00.000000000 Z
12
+ date: 2012-12-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &70310037153900 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70310037153900
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: sqlite3
27
- requirement: &70310037153420 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70310037153420
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: rspec-rails
38
- requirement: &70310037152920 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: 2.0.0.beta
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70310037152920
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.0.0.beta
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: factory_girl_rails
49
- requirement: &70310037152400 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70310037152400
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: bundler
60
- requirement: &70310037151840 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: 1.0.0
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70310037151840
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: 1.0.0
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: jeweler
71
- requirement: &70310037151340 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,7 +101,12 @@ dependencies:
76
101
  version: 1.5.2
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70310037151340
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 1.5.2
80
110
  description: It can be useful when you you are developing some app where you will
81
111
  work with meetings, events etc.
82
112
  email: robinbortlik@gmail.com
@@ -99,8 +129,10 @@ files:
99
129
  - spec/dummy/app/helpers/application_helper.rb
100
130
  - spec/dummy/app/models/end_overlap_meeting.rb
101
131
  - spec/dummy/app/models/meeting.rb
132
+ - spec/dummy/app/models/position.rb
102
133
  - spec/dummy/app/models/start_end_overlap_meeting.rb
103
134
  - spec/dummy/app/models/start_overlap_meeting.rb
135
+ - spec/dummy/app/models/time_slot.rb
104
136
  - spec/dummy/app/models/user.rb
105
137
  - spec/dummy/app/models/user_meeting.rb
106
138
  - spec/dummy/app/views/layouts/application.html.erb
@@ -125,6 +157,7 @@ files:
125
157
  - spec/dummy/db/migrate/20120509130956_create_end_overlap_meetings.rb
126
158
  - spec/dummy/db/migrate/20120509131012_create_start_overlap_meetings.rb
127
159
  - spec/dummy/db/migrate/20120509131032_create_start_end_overlap_meetings.rb
160
+ - spec/dummy/db/migrate/20121207162212_create_time_slot.rb
128
161
  - spec/dummy/db/schema.rb
129
162
  - spec/dummy/public/404.html
130
163
  - spec/dummy/public/422.html
@@ -140,14 +173,18 @@ files:
140
173
  - spec/dummy/script/rails
141
174
  - spec/dummy/spec/factories/end_overlap_meeting.rb
142
175
  - spec/dummy/spec/factories/meeting.rb
176
+ - spec/dummy/spec/factories/position.rb
143
177
  - spec/dummy/spec/factories/start_end_overlap_meeting.rb
144
178
  - spec/dummy/spec/factories/start_overlap_meeting.rb
179
+ - spec/dummy/spec/factories/time_slot.rb
145
180
  - spec/dummy/spec/factories/user.rb
146
181
  - spec/dummy/spec/factories/user_meeting.rb
147
182
  - spec/dummy/spec/models/end_overlap_meeting_spec.rb
148
183
  - spec/dummy/spec/models/meeting_spec.rb
184
+ - spec/dummy/spec/models/position_spec.rb
149
185
  - spec/dummy/spec/models/start_end_overlap_meeting_spec.rb
150
186
  - spec/dummy/spec/models/start_overlap_meeting_spec.rb
187
+ - spec/dummy/spec/models/time_slot_spec.rb
151
188
  - spec/dummy/spec/models/user_meeting_spec.rb
152
189
  - spec/dummy/spec/models/user_spec.rb
153
190
  - spec/spec_helper.rb
@@ -167,7 +204,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
167
204
  version: '0'
168
205
  segments:
169
206
  - 0
170
- hash: 486938746215204514
207
+ hash: 1024957372964977180
171
208
  required_rubygems_version: !ruby/object:Gem::Requirement
172
209
  none: false
173
210
  requirements:
@@ -176,7 +213,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
213
  version: '0'
177
214
  requirements: []
178
215
  rubyforge_project:
179
- rubygems_version: 1.8.17
216
+ rubygems_version: 1.8.24
180
217
  signing_key:
181
218
  specification_version: 3
182
219
  summary: This gem helps validate records with time overlap.