validates_overlap 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -21,3 +21,7 @@ without scope
21
21
 
22
22
  with scope
23
23
  validates :starts_at, :ends_at, :overlap => {:scope => "user_id"}
24
+
25
+ exclude edges
26
+ validates :starts_at, :ends_at, :overlap => {:exclude_edges => "starts_at"}
27
+ validates :starts_at, :ends_at, :overlap => {:exclude_edges => ["starts_at", "ends_at"]}
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
@@ -62,10 +62,11 @@ class OverlapValidator < ActiveModel::EachValidator
62
62
  # Generate sql condition for time range cross
63
63
  def generate_overlap_sql_conditions(record)
64
64
  starts_at_attr, ends_at_attr = attributes_to_sql(record)
65
+ main_condition = condition_string(starts_at_attr, ends_at_attr)
65
66
  if record.new_record?
66
- self.sql_conditions = "#{ends_at_attr} >= :starts_at_value AND #{starts_at_attr} <= :ends_at_value"
67
+ self.sql_conditions = main_condition
67
68
  else
68
- self.sql_conditions = "#{ends_at_attr} >= :starts_at_value AND #{starts_at_attr} <= :ends_at_value AND #{record_table_name(record)}.id != #{record.id}"
69
+ self.sql_conditions = "#{main_condition} AND #{record_table_name(record)}.id != #{record.id}"
69
70
  end
70
71
  end
71
72
 
@@ -75,6 +76,14 @@ class OverlapValidator < ActiveModel::EachValidator
75
76
  starts_at_value, ends_at_value = resolve_values_from_attributes(record)
76
77
  self.sql_values = {:starts_at_value => starts_at_value, :ends_at_value => ends_at_value}
77
78
  end
79
+
80
+ # Return the condition string depend on exclude_edges option.
81
+ def condition_string(starts_at_attr, ends_at_attr)
82
+ 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) ? ">" : ">="
85
+ "#{ends_at_attr} #{ends_at_sign} :starts_at_value AND #{starts_at_attr} #{starts_at_sign} :ends_at_value"
86
+ end
78
87
 
79
88
 
80
89
  # Add attributes and values to sql conditions.
@@ -0,0 +1,3 @@
1
+ class EndOverlapMeeting < ActiveRecord::Base
2
+ validates :starts_at, :ends_at, :overlap => {:exclude_edges => :ends_at}
3
+ end
@@ -0,0 +1,3 @@
1
+ class StartEndOverlapMeeting < ActiveRecord::Base
2
+ validates :starts_at, :ends_at, :overlap => {:exclude_edges => [:starts_at, :ends_at]}
3
+ end
@@ -0,0 +1,3 @@
1
+ class StartOverlapMeeting < ActiveRecord::Base
2
+ validates :starts_at, :ends_at, :overlap => {:exclude_edges => :starts_at}
3
+ end
@@ -0,0 +1,13 @@
1
+ class CreateEndOverlapMeetings < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :end_overlap_meetings do |t|
4
+ t.date :starts_at
5
+ t.date :ends_at
6
+ t.timestamps
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ drop_table :end_overlap_meetings
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class CreateStartOverlapMeetings < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :start_overlap_meetings do |t|
4
+ t.date :starts_at
5
+ t.date :ends_at
6
+ t.timestamps
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ drop_table :start_overlap_meetings
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class CreateStartEndOverlapMeetings < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :start_end_overlap_meetings do |t|
4
+ t.date :starts_at
5
+ t.date :ends_at
6
+ t.timestamps
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ drop_table :start_end_overlap_meetings
12
+ end
13
+ end
@@ -11,7 +11,14 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20110407060725) do
14
+ ActiveRecord::Schema.define(:version => 20120509131032) do
15
+
16
+ create_table "end_overlap_meetings", :force => true do |t|
17
+ t.date "starts_at"
18
+ t.date "ends_at"
19
+ t.datetime "created_at", :null => false
20
+ t.datetime "updated_at", :null => false
21
+ end
15
22
 
16
23
  create_table "meetings", :force => true do |t|
17
24
  t.date "starts_at"
@@ -20,6 +27,20 @@ ActiveRecord::Schema.define(:version => 20110407060725) do
20
27
  t.datetime "updated_at", :null => false
21
28
  end
22
29
 
30
+ create_table "start_end_overlap_meetings", :force => true do |t|
31
+ t.date "starts_at"
32
+ t.date "ends_at"
33
+ t.datetime "created_at", :null => false
34
+ t.datetime "updated_at", :null => false
35
+ end
36
+
37
+ create_table "start_overlap_meetings", :force => true do |t|
38
+ t.date "starts_at"
39
+ t.date "ends_at"
40
+ t.datetime "created_at", :null => false
41
+ t.datetime "updated_at", :null => false
42
+ end
43
+
23
44
  create_table "user_meetings", :force => true do |t|
24
45
  t.integer "user_id"
25
46
  t.date "starts_at"
@@ -0,0 +1,4 @@
1
+ Factory.define :end_overlap_meeting do |u|
2
+ u.starts_at '2011-01-05'.to_date
3
+ u.ends_at '2011-01-08'.to_date
4
+ end
@@ -0,0 +1,4 @@
1
+ Factory.define :start_end_overlap_meeting do |u|
2
+ u.starts_at '2011-01-05'.to_date
3
+ u.ends_at '2011-01-08'.to_date
4
+ end
@@ -0,0 +1,4 @@
1
+ Factory.define :start_overlap_meeting do |u|
2
+ u.starts_at '2011-01-05'.to_date
3
+ u.ends_at '2011-01-08'.to_date
4
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../../../spec_helper'
2
+ require_relative '../factories/end_overlap_meeting'
3
+
4
+ describe EndOverlapMeeting do
5
+
6
+ before(:all) do
7
+ EndOverlapMeeting.delete_all
8
+ end
9
+
10
+ it "create meeting" do
11
+ lambda {
12
+ Factory(:end_overlap_meeting)
13
+ }.should change(EndOverlapMeeting, :count).by(1)
14
+ end
15
+
16
+ context "Validation with exclude edges ends_at" do
17
+ @valid_times = {
18
+ "starts at time of end and ends after" => ['2011-01-08'.to_date, '2011-01-19'.to_date]
19
+ }
20
+
21
+ @not_valid_times = {
22
+ "has same starts_at and ends_at" => ['2011-01-05'.to_date, '2011-01-08'.to_date],
23
+ "starts before starts_at and ends after ends_at" => ['2011-01-04'.to_date, '2011-01-09'.to_date],
24
+ "starts before starts_at and ends inside" => ['2011-01-04'.to_date, '2011-01-06'.to_date],
25
+ "starts inside and ends after ends_at" => ['2011-01-06'.to_date, '2011-01-09'.to_date],
26
+ "starts inside and ends inside" => ['2011-01-06'.to_date, '2011-01-07'.to_date],
27
+ "starts at same time and ends inside" => ['2011-01-05'.to_date, '2011-01-07'.to_date],
28
+ "starts inside and ends at same time" => ['2011-01-06'.to_date, '2011-01-08'.to_date],
29
+ "starts before and ends at time of start" => ['2011-01-03'.to_date, '2011-01-05'.to_date],
30
+ }
31
+
32
+ @not_valid_times.each do |description, time_range|
33
+ it "is not valid if exists meeting which #{description}" do
34
+ meeting = Factory.build(:end_overlap_meeting, :starts_at => time_range.first, :ends_at => time_range.last)
35
+ meeting.should_not be_valid
36
+ meeting.errors[:starts_at].should_not be_empty
37
+ meeting.errors[:ends_at].should be_empty
38
+ end
39
+ end
40
+
41
+ @valid_times.each do |description, time_range|
42
+ it "is valid if exists meeting which #{description}" do
43
+ meeting = Factory.build(:end_overlap_meeting, :starts_at => time_range.first, :ends_at => time_range.last)
44
+ meeting.should be_valid
45
+ meeting.errors[:starts_at].should be_empty
46
+ meeting.errors[:ends_at].should be_empty
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../../../spec_helper'
2
+ require_relative '../factories/start_end_overlap_meeting'
3
+
4
+ describe StartEndOverlapMeeting do
5
+
6
+ before(:all) do
7
+ StartEndOverlapMeeting.delete_all
8
+ end
9
+
10
+ it "create meeting" do
11
+ lambda {
12
+ Factory(:start_end_overlap_meeting)
13
+ }.should change(StartEndOverlapMeeting, :count).by(1)
14
+ end
15
+
16
+ context "Validation with exclude edges starts_at, ends_at" do
17
+ @valid_times = {
18
+ "starts before and ends at time of start" => ['2011-01-03'.to_date, '2011-01-05'.to_date],
19
+ "starts at time of end and ends after" => ['2011-01-08'.to_date, '2011-01-19'.to_date]
20
+ }
21
+
22
+ @not_valid_times = {
23
+ "has same starts_at and ends_at" => ['2011-01-05'.to_date, '2011-01-08'.to_date],
24
+ "starts before starts_at and ends after ends_at" => ['2011-01-04'.to_date, '2011-01-09'.to_date],
25
+ "starts before starts_at and ends inside" => ['2011-01-04'.to_date, '2011-01-06'.to_date],
26
+ "starts inside and ends after ends_at" => ['2011-01-06'.to_date, '2011-01-09'.to_date],
27
+ "starts inside and ends inside" => ['2011-01-06'.to_date, '2011-01-07'.to_date],
28
+ "starts at same time and ends inside" => ['2011-01-05'.to_date, '2011-01-07'.to_date],
29
+ "starts inside and ends at same time" => ['2011-01-06'.to_date, '2011-01-08'.to_date],
30
+ }
31
+
32
+ @not_valid_times.each do |description, time_range|
33
+ it "is not valid if exists meeting which #{description}" do
34
+ meeting = Factory.build(:start_end_overlap_meeting, :starts_at => time_range.first, :ends_at => time_range.last)
35
+ meeting.should_not be_valid
36
+ meeting.errors[:starts_at].should_not be_empty
37
+ meeting.errors[:ends_at].should be_empty
38
+ end
39
+ end
40
+
41
+ @valid_times.each do |description, time_range|
42
+ it "is valid if exists meeting which #{description}" do
43
+ meeting = Factory.build(:start_end_overlap_meeting, :starts_at => time_range.first, :ends_at => time_range.last)
44
+ meeting.should be_valid
45
+ meeting.errors[:starts_at].should be_empty
46
+ meeting.errors[:ends_at].should be_empty
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../../../spec_helper'
2
+ require_relative '../factories/start_overlap_meeting'
3
+
4
+ describe StartOverlapMeeting do
5
+
6
+ before(:all) do
7
+ StartOverlapMeeting.delete_all
8
+ end
9
+
10
+ it "create meeting" do
11
+ lambda {
12
+ Factory(:start_overlap_meeting)
13
+ }.should change(StartOverlapMeeting, :count).by(1)
14
+ end
15
+
16
+ context "Validation with exclude edge starts_at" do
17
+ @valid_times = {
18
+ "starts before and ends at time of start" => ['2011-01-03'.to_date, '2011-01-05'.to_date],
19
+ }
20
+
21
+ @not_valid_times = {
22
+ "has same starts_at and ends_at" => ['2011-01-05'.to_date, '2011-01-08'.to_date],
23
+ "starts before starts_at and ends after ends_at" => ['2011-01-04'.to_date, '2011-01-09'.to_date],
24
+ "starts before starts_at and ends inside" => ['2011-01-04'.to_date, '2011-01-06'.to_date],
25
+ "starts inside and ends after ends_at" => ['2011-01-06'.to_date, '2011-01-09'.to_date],
26
+ "starts inside and ends inside" => ['2011-01-06'.to_date, '2011-01-07'.to_date],
27
+ "starts at same time and ends inside" => ['2011-01-05'.to_date, '2011-01-07'.to_date],
28
+ "starts inside and ends at same time" => ['2011-01-06'.to_date, '2011-01-08'.to_date],
29
+ "starts at time of end and ends after" => ['2011-01-08'.to_date, '2011-01-19'.to_date]
30
+ }
31
+
32
+ @not_valid_times.each do |description, time_range|
33
+ it "is not valid if exists meeting which #{description}" do
34
+ meeting = Factory.build(:start_overlap_meeting, :starts_at => time_range.first, :ends_at => time_range.last)
35
+ meeting.should_not be_valid
36
+ meeting.errors[:starts_at].should_not be_empty
37
+ meeting.errors[:ends_at].should be_empty
38
+ end
39
+ end
40
+
41
+ @valid_times.each do |description, time_range|
42
+ it "is valid if exists meeting which #{description}" do
43
+ meeting = Factory.build(:start_overlap_meeting, :starts_at => time_range.first, :ends_at => time_range.last)
44
+ meeting.should be_valid
45
+ meeting.errors[:starts_at].should be_empty
46
+ meeting.errors[:ends_at].should be_empty
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
data/spec/spec_helper.rb CHANGED
@@ -42,4 +42,4 @@ OVERLAP_TIME_RANGES = {
42
42
  "starts inside and ends at same time" => ['2011-01-06'.to_date, '2011-01-08'.to_date],
43
43
  "starts before and ends at time of start" => ['2011-01-03'.to_date, '2011-01-05'.to_date],
44
44
  "starts at time of end and ends after" => ['2011-01-08'.to_date, '2011-01-19'.to_date]
45
- }
45
+ }
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "validates_overlap"
8
- s.version = "0.0.5"
8
+ s.version = "0.0.6"
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-07"
12
+ s.date = "2012-05-13"
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 = [
@@ -28,7 +28,10 @@ Gem::Specification.new do |s|
28
28
  "spec/dummy/Rakefile",
29
29
  "spec/dummy/app/controllers/application_controller.rb",
30
30
  "spec/dummy/app/helpers/application_helper.rb",
31
+ "spec/dummy/app/models/end_overlap_meeting.rb",
31
32
  "spec/dummy/app/models/meeting.rb",
33
+ "spec/dummy/app/models/start_end_overlap_meeting.rb",
34
+ "spec/dummy/app/models/start_overlap_meeting.rb",
32
35
  "spec/dummy/app/models/user.rb",
33
36
  "spec/dummy/app/models/user_meeting.rb",
34
37
  "spec/dummy/app/views/layouts/application.html.erb",
@@ -50,6 +53,9 @@ Gem::Specification.new do |s|
50
53
  "spec/dummy/db/migrate/20110406082020_create_meetings.rb",
51
54
  "spec/dummy/db/migrate/20110406082053_create_users.rb",
52
55
  "spec/dummy/db/migrate/20110407060725_create_user_meetings.rb",
56
+ "spec/dummy/db/migrate/20120509130956_create_end_overlap_meetings.rb",
57
+ "spec/dummy/db/migrate/20120509131012_create_start_overlap_meetings.rb",
58
+ "spec/dummy/db/migrate/20120509131032_create_start_end_overlap_meetings.rb",
53
59
  "spec/dummy/db/schema.rb",
54
60
  "spec/dummy/public/404.html",
55
61
  "spec/dummy/public/422.html",
@@ -63,10 +69,16 @@ Gem::Specification.new do |s|
63
69
  "spec/dummy/public/javascripts/rails.js",
64
70
  "spec/dummy/public/stylesheets/.gitkeep",
65
71
  "spec/dummy/script/rails",
72
+ "spec/dummy/spec/factories/end_overlap_meeting.rb",
66
73
  "spec/dummy/spec/factories/meeting.rb",
74
+ "spec/dummy/spec/factories/start_end_overlap_meeting.rb",
75
+ "spec/dummy/spec/factories/start_overlap_meeting.rb",
67
76
  "spec/dummy/spec/factories/user.rb",
68
77
  "spec/dummy/spec/factories/user_meeting.rb",
78
+ "spec/dummy/spec/models/end_overlap_meeting_spec.rb",
69
79
  "spec/dummy/spec/models/meeting_spec.rb",
80
+ "spec/dummy/spec/models/start_end_overlap_meeting_spec.rb",
81
+ "spec/dummy/spec/models/start_overlap_meeting_spec.rb",
70
82
  "spec/dummy/spec/models/user_meeting_spec.rb",
71
83
  "spec/dummy/spec/models/user_spec.rb",
72
84
  "spec/spec_helper.rb",
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.5
4
+ version: 0.0.6
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-07 00:00:00.000000000 Z
12
+ date: 2012-05-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &70299388963720 !ruby/object:Gem::Requirement
16
+ requirement: &70310037153900 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70299388963720
24
+ version_requirements: *70310037153900
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sqlite3
27
- requirement: &70299388985240 !ruby/object:Gem::Requirement
27
+ requirement: &70310037153420 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70299388985240
35
+ version_requirements: *70310037153420
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec-rails
38
- requirement: &70299388984160 !ruby/object:Gem::Requirement
38
+ requirement: &70310037152920 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.0.0.beta
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70299388984160
46
+ version_requirements: *70310037152920
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: factory_girl_rails
49
- requirement: &70299388983400 !ruby/object:Gem::Requirement
49
+ requirement: &70310037152400 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70299388983400
57
+ version_requirements: *70310037152400
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bundler
60
- requirement: &70299388982260 !ruby/object:Gem::Requirement
60
+ requirement: &70310037151840 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.0.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70299388982260
68
+ version_requirements: *70310037151840
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: jeweler
71
- requirement: &70299388981120 !ruby/object:Gem::Requirement
71
+ requirement: &70310037151340 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: 1.5.2
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70299388981120
79
+ version_requirements: *70310037151340
80
80
  description: It can be useful when you you are developing some app where you will
81
81
  work with meetings, events etc.
82
82
  email: robinbortlik@gmail.com
@@ -97,7 +97,10 @@ files:
97
97
  - spec/dummy/Rakefile
98
98
  - spec/dummy/app/controllers/application_controller.rb
99
99
  - spec/dummy/app/helpers/application_helper.rb
100
+ - spec/dummy/app/models/end_overlap_meeting.rb
100
101
  - spec/dummy/app/models/meeting.rb
102
+ - spec/dummy/app/models/start_end_overlap_meeting.rb
103
+ - spec/dummy/app/models/start_overlap_meeting.rb
101
104
  - spec/dummy/app/models/user.rb
102
105
  - spec/dummy/app/models/user_meeting.rb
103
106
  - spec/dummy/app/views/layouts/application.html.erb
@@ -119,6 +122,9 @@ files:
119
122
  - spec/dummy/db/migrate/20110406082020_create_meetings.rb
120
123
  - spec/dummy/db/migrate/20110406082053_create_users.rb
121
124
  - spec/dummy/db/migrate/20110407060725_create_user_meetings.rb
125
+ - spec/dummy/db/migrate/20120509130956_create_end_overlap_meetings.rb
126
+ - spec/dummy/db/migrate/20120509131012_create_start_overlap_meetings.rb
127
+ - spec/dummy/db/migrate/20120509131032_create_start_end_overlap_meetings.rb
122
128
  - spec/dummy/db/schema.rb
123
129
  - spec/dummy/public/404.html
124
130
  - spec/dummy/public/422.html
@@ -132,10 +138,16 @@ files:
132
138
  - spec/dummy/public/javascripts/rails.js
133
139
  - spec/dummy/public/stylesheets/.gitkeep
134
140
  - spec/dummy/script/rails
141
+ - spec/dummy/spec/factories/end_overlap_meeting.rb
135
142
  - spec/dummy/spec/factories/meeting.rb
143
+ - spec/dummy/spec/factories/start_end_overlap_meeting.rb
144
+ - spec/dummy/spec/factories/start_overlap_meeting.rb
136
145
  - spec/dummy/spec/factories/user.rb
137
146
  - spec/dummy/spec/factories/user_meeting.rb
147
+ - spec/dummy/spec/models/end_overlap_meeting_spec.rb
138
148
  - spec/dummy/spec/models/meeting_spec.rb
149
+ - spec/dummy/spec/models/start_end_overlap_meeting_spec.rb
150
+ - spec/dummy/spec/models/start_overlap_meeting_spec.rb
139
151
  - spec/dummy/spec/models/user_meeting_spec.rb
140
152
  - spec/dummy/spec/models/user_spec.rb
141
153
  - spec/spec_helper.rb
@@ -155,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
167
  version: '0'
156
168
  segments:
157
169
  - 0
158
- hash: 4277930355415785959
170
+ hash: 486938746215204514
159
171
  required_rubygems_version: !ruby/object:Gem::Requirement
160
172
  none: false
161
173
  requirements: