acts_as_span 0.0.5 → 0.0.6

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.
@@ -1,49 +1,36 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "Span" do
4
- before(:each) do
5
- build_model :span_model do
6
- date :start_date
7
- date :end_date
8
-
9
- acts_as_span
10
- end
11
- end
12
-
13
- let(:span_model) { SpanModel.new(:start_date => Date.today, :end_date => nil) }
3
+ RSpec.describe "Span" do
4
+ let(:span_model) { SpanModel.new(:start_date => Date.current, :end_date => nil) }
14
5
  let(:span) { span_model.span }
15
-
16
- context "#span_status & #span_status_to_s" do
6
+
7
+ context "#span_status" do
17
8
  before(:each) do
18
- span.stub!(:current?).and_return(false)
19
- span.stub!(:future?).and_return(false)
20
- span.stub!(:expired?).and_return(false)
9
+ allow(span).to receive(:current?).and_return(false)
10
+ allow(span).to receive(:future?).and_return(false)
11
+ allow(span).to receive(:expired?).and_return(false)
21
12
  end
22
-
13
+
23
14
  it "should return :unknown when all_conditions == false" do
24
- span.span_status.should == :unknown
25
- span.span_status_to_s.should == 'Unknown'
15
+ expect(span.span_status).to eq(:unknown)
26
16
  end
27
-
17
+
28
18
  it "should return :current when current? == true" do
29
- span.should_receive(:current?).twice.and_return(true)
30
-
31
- span.span_status.should == :current
32
- span.span_status_to_s.should == 'Current'
19
+ expect(span).to receive(:current?).once.and_return(true)
20
+
21
+ expect(span.span_status).to eq(:current)
33
22
  end
34
-
23
+
35
24
  it "should return :current when future? == true" do
36
- span.should_receive(:future?).twice.and_return(true)
37
-
38
- span.span_status.should == :future
39
- span.span_status_to_s.should == 'Future'
25
+ expect(span).to receive(:future?).once.and_return(true)
26
+
27
+ expect(span.span_status).to eq(:future)
40
28
  end
41
-
29
+
42
30
  it "should return :current when expired? == true" do
43
- span.should_receive(:expired?).twice.and_return(true)
44
-
45
- span.span_status.should == :expired
46
- span.span_status_to_s.should == 'Expired'
31
+ expect(span).to receive(:expired?).once.and_return(true)
32
+
33
+ expect(span.span_status).to eq(:expired)
47
34
  end
48
35
  end
49
- end
36
+ end
@@ -1,54 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "Span" do
4
- before(:each) do
5
- build_model :span_model do
6
- date :start_date
7
- date :end_date
8
- end
9
- end
10
-
11
- #let(:span_model) { SpanModel.new(:start_date => Date.today, :end_date => Date.today + 1) }
12
- #let(:span) { span_model.span }
13
-
3
+ RSpec.describe "Span" do
14
4
  it "should be valid" do
15
5
  SpanModel.acts_as_span
16
6
  span_model = SpanModel.new(:start_date => nil, :end_date => nil)
17
-
18
- span_model.should be_valid
19
- end
20
-
21
- context ":start_date_field_required => true" do
22
- before do
23
- SpanModel.acts_as_span :start_date_field_required => true
24
- end
25
-
26
- it "should require a start_date" do
27
- span_model = SpanModel.new(:start_date => nil, :end_date => Date.today + 1)
28
-
29
- span_model.should_not be_valid
30
- span_model.errors[:start_date].should have(1).error
31
- end
32
- end
33
-
34
- context ":end_date_field_required => true" do
35
- before do
36
- SpanModel.acts_as_span :end_date_field_required => true
37
- end
38
-
39
- it "should require an end_date" do
40
- span_model = SpanModel.new(:start_date => Date.today, :end_date => nil)
41
-
42
- span_model.should_not be_valid
43
- span_model.errors[:end_date].should have(1).error
44
- end
7
+
8
+ expect(span_model).to be_valid
45
9
  end
46
-
10
+
47
11
  it "should require a start_date before the end_date" do
48
12
  SpanModel.acts_as_span
49
- span_model = SpanModel.new(:start_date => Date.today, :end_date => Date.today - 1)
50
-
51
- span_model.should_not be_valid
52
- span_model.errors[:end_date].should have(1).error
13
+ span_model = SpanModel.new(:start_date => Date.current, :end_date => Date.current - 1)
14
+
15
+ expect(span_model).not_to be_valid
16
+ expect(span_model.errors[:end_date].size).to eq(1)
53
17
  end
54
18
  end
@@ -1,41 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
- #NOTE: we're also testing :start_date_field & :end_date_field options work
4
-
5
- describe "Span" do
6
- before(:each) do
7
- build_model :span_model do
8
- date :start_date_x
9
- date :end_date_x
10
-
11
- acts_as_span :start_date_field => :start_date_x,
12
- :end_date_field => :end_date_x
13
- end
14
- end
15
-
16
- context "#close!" do
17
- let(:span_model) { SpanModel.new(:start_date_x => Date.today, :end_date_x => nil) }
18
- let(:span) { span_model.span }
19
-
20
- it "should set end_date? to today" do
21
- lambda { span.close! }.should change(span_model, :end_date_x).from(nil).to(Date.today)
22
- end
23
-
24
- it "should set end_date? to the parameter" do
25
- lambda { span.close_on!(Date.today + 1.day) }.should change(span_model, :end_date_x).from(nil).to(Date.today + 1.day)
26
- end
27
- end
28
-
3
+ RSpec.describe "Span" do
29
4
  context "start_date & end_date" do
30
- let(:span_model) { SpanModel.new(:start_date_x => Date.today, :end_date_x => Date.today + 1) }
5
+ let(:span_model) { SpanModel.new(:start_date => Date.current, :end_date => Date.current + 1) }
31
6
  let(:span) { span_model.span }
32
7
 
33
8
  it "should return the start_date" do
34
- span.start_date.should == span_model.start_date_x
9
+ expect(span.start_date).to eq(span_model.start_date)
35
10
  end
36
11
 
37
12
  it "should return the end_date" do
38
- span.end_date.should == span_model.end_date_x
13
+ expect(span.end_date).to eq(span_model.end_date)
39
14
  end
40
15
  end
41
- end
16
+ end
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe ActsAsSpan::WithinParentDateSpanValidator do
4
+ let(:new_child) do
5
+ child_class.new(
6
+ start_date: new_child_start_date,
7
+ end_date: new_child_end_date,
8
+ mama: mama)
9
+ end
10
+
11
+ let!(:mama) { Mama.create(start_date: mama_start_date, end_date: mama_end_date) }
12
+ let!(:papa) { Papa.create(start_date: papa_start_date, end_date: papa_end_date) }
13
+
14
+ let(:thirty_years_ago) { Date.current - 30.years }
15
+ let(:seventy_years_in_the_future) { Date.current + 70.years }
16
+
17
+ let(:mama_start_date) { thirty_years_ago }
18
+ let(:mama_end_date) { seventy_years_in_the_future }
19
+
20
+ let(:papa_start_date) { thirty_years_ago + 1.year }
21
+ let(:papa_end_date) { seventy_years_in_the_future - 1.year }
22
+
23
+ describe 'an object that validates against a single parent' do
24
+ let(:child_class) { OneParentChild }
25
+
26
+ context 'inside parent date span' do
27
+ let(:new_child_start_date) { mama_start_date }
28
+ let(:new_child_end_date) { mama_end_date }
29
+
30
+ it do
31
+ expect(new_child).to be_valid
32
+ end
33
+ end
34
+
35
+ context 'child_record_without_start_date' do
36
+ let(:new_child_start_date) { nil }
37
+ let(:new_child_end_date) { mama_end_date }
38
+
39
+ it do
40
+ expect(new_child).to be_invalid
41
+ end
42
+ end
43
+
44
+ context 'child_record_without_start_date' do
45
+ let(:new_child_start_date) { mama_start_date }
46
+ let(:new_child_end_date) { nil }
47
+
48
+ it do
49
+ expect(new_child).to be_invalid
50
+ end
51
+ end
52
+
53
+ context 'child_record_started_before_parent_record' do
54
+ let(:new_child_start_date) { mama_start_date - 1 }
55
+ let(:new_child_end_date) { mama_end_date }
56
+
57
+ it do
58
+ expect(new_child).to be_invalid
59
+ end
60
+ end
61
+
62
+ context 'child_record_ended_after_parent_record' do
63
+ let(:new_child_start_date) { mama_start_date }
64
+ let(:new_child_end_date) { mama_end_date + 1 }
65
+
66
+ it do
67
+ expect(new_child).to be_invalid
68
+ end
69
+ end
70
+
71
+ context 'with unassigned parent start_date' do
72
+ let(:new_child_start_date) { thirty_years_ago }
73
+ let(:new_child_end_date) { mama_end_date }
74
+ let(:mama_start_date) { nil }
75
+
76
+ it do
77
+ expect(new_child).to be_valid
78
+ end
79
+ end
80
+
81
+ context 'with unassigned parent end_date' do
82
+ let(:new_child_start_date) { mama_start_date }
83
+ let(:new_child_end_date) { seventy_years_in_the_future }
84
+ let(:mama_end_date) { nil }
85
+
86
+ it do
87
+ expect(new_child).to be_valid
88
+ end
89
+ end
90
+ end
91
+
92
+ describe 'an object with multiple parents' do
93
+ let(:child_class) { TwoParentChild }
94
+
95
+ before { new_child.papa = papa }
96
+
97
+ context 'valid cases' do
98
+ let(:new_child_start_date) { papa_start_date }
99
+ let(:new_child_end_date) { papa_end_date }
100
+
101
+ it 'allows date spans that lie within all respective parental date spans' do
102
+ expect(new_child).to be_valid
103
+ end
104
+ end
105
+
106
+ context 'invalid cases' do
107
+ let(:new_child_start_date) { papa_start_date - 1 }
108
+ let(:new_child_end_date) { papa_end_date + 1 }
109
+
110
+ it 'does not allow date spans that lie outside of respective parental date spans' do
111
+ expect(new_child).not_to be_valid
112
+ end
113
+ end
114
+ end
115
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,23 @@
1
- require 'rubygems'
2
1
  require 'bundler/setup'
3
- require 'acts_as_fu'
4
- require 'active_support'
5
-
6
2
  require 'acts_as_span'
3
+ require 'pry'
4
+
5
+ require 'active_record'
6
+ require 'active_support'
7
+ require 'spec_models'
7
8
 
8
9
  RSpec.configure do |config|
9
- config.include ActsAsFu
10
- end
10
+ # Enable flags like --only-failures and --next-failure
11
+ config.example_status_persistence_file_path = ".rspec_status"
12
+
13
+ # Disable RSpec exposing methods globally on `Module` and `main`
14
+ config.disable_monkey_patching!
15
+
16
+ config.expect_with :rspec do |c|
17
+ c.syntax = :expect
18
+ end
19
+
20
+ config.after do
21
+ Temping.cleanup
22
+ end
23
+ end
@@ -0,0 +1,69 @@
1
+ require 'temping'
2
+ require 'has_siblings'
3
+
4
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
5
+ ActiveRecord::Base.logger = Logger.new(STDOUT) if ENV["DEBUG"]
6
+
7
+ Temping.create :span_model do
8
+ with_columns do |t|
9
+ t.date :start_date
10
+ t.date :end_date
11
+ end
12
+
13
+ acts_as_span
14
+ end
15
+
16
+ Temping.create :one_parent_child do
17
+ with_columns do |t|
18
+ t.belongs_to :mama
19
+
20
+ t.date :start_date
21
+ t.date :end_date
22
+ end
23
+
24
+ acts_as_span
25
+
26
+ belongs_to :mama
27
+ has_siblings through: [:mama]
28
+
29
+ validates_with ActsAsSpan::NoOverlapValidator, scope: proc { siblings }
30
+ validates_with ActsAsSpan::WithinParentDateSpanValidator, parents: [:mama]
31
+ end
32
+
33
+ Temping.create :two_parent_child do
34
+ with_columns do |t|
35
+ t.belongs_to :mama
36
+ t.belongs_to :papa
37
+
38
+ t.date :start_date
39
+ t.date :end_date
40
+ end
41
+
42
+ acts_as_span
43
+
44
+ belongs_to :mama
45
+ belongs_to :papa
46
+ has_siblings through: [:mama, :papa]
47
+
48
+ validates_with ActsAsSpan::NoOverlapValidator, scope: proc { siblings }
49
+ validates_with ActsAsSpan::WithinParentDateSpanValidator, parents: [:mama, :papa]
50
+ end
51
+
52
+ Temping.create :mama do
53
+ with_columns do |t|
54
+ t.date :start_date
55
+ t.date :end_date
56
+ end
57
+
58
+ has_many :one_parent_children
59
+ has_many :two_parent_children
60
+ end
61
+
62
+ Temping.create :papa do
63
+ with_columns do |t|
64
+ t.date :start_date
65
+ t.date :end_date
66
+ end
67
+
68
+ has_many :one_parent_children
69
+ end
metadata CHANGED
@@ -1,112 +1,212 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: acts_as_span
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.0.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
6
5
  platform: ruby
7
- authors:
6
+ authors:
8
7
  - Eric Sullivan
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2011-08-28 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: activerecord
11
+ date: 2018-07-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
17
63
  prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: has_siblings
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.2.7
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.2.7
83
+ - !ruby/object:Gem::Dependency
84
+ name: temping
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:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
21
101
  - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "3"
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: activerecord
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 4.2.0
24
118
  type: :runtime
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: activesupport
28
119
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
30
- none: false
31
- requirements:
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
32
122
  - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
123
+ - !ruby/object:Gem::Version
124
+ version: 4.2.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: activesupport
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 4.2.0
35
132
  type: :runtime
36
- version_requirements: *id002
37
- description: start_date and end_date as a span w/ ActiveRecord
38
- email:
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 4.2.0
139
+ description: ActiveRecord model w/ a start_date and an end_date == ActsAsSpan
140
+ email:
39
141
  - eric.sullivan@annkissam.com
40
142
  executables: []
41
-
42
143
  extensions: []
43
-
44
144
  extra_rdoc_files: []
45
-
46
- files:
47
- - .gitignore
145
+ files:
146
+ - ".gitignore"
147
+ - ".rspec"
148
+ - ".travis.yml"
48
149
  - Gemfile
49
- - Gemfile.lock
50
150
  - LICENSE
51
151
  - README.rdoc
52
152
  - Rakefile
53
153
  - acts_as_span.gemspec
54
154
  - lib/acts_as_span.rb
155
+ - lib/acts_as_span/no_overlap_validator.rb
55
156
  - lib/acts_as_span/span_instance.rb
56
- - lib/acts_as_span/span_instance/overlap.rb
57
157
  - lib/acts_as_span/span_instance/status.rb
58
158
  - lib/acts_as_span/span_instance/validations.rb
59
159
  - lib/acts_as_span/span_klass.rb
60
- - lib/acts_as_span/span_klass/overlap.rb
61
160
  - lib/acts_as_span/span_klass/status.rb
62
161
  - lib/acts_as_span/version.rb
162
+ - lib/acts_as_span/within_parent_date_span_validator.rb
63
163
  - spec/lib/acts_as_span_spec.rb
64
164
  - spec/lib/delegation_spec.rb
65
- - spec/lib/negative_spec.rb
165
+ - spec/lib/no_overlap_validator_spec.rb
66
166
  - spec/lib/span_instance/named_scopes_on_spec.rb
67
167
  - spec/lib/span_instance/named_scopes_spec.rb
68
168
  - spec/lib/span_instance/overlap_spec.rb
69
169
  - spec/lib/span_instance/status_spec.rb
70
170
  - spec/lib/span_instance/validations_spec.rb
71
171
  - spec/lib/span_instance_spec.rb
72
- - spec/spec.opts
172
+ - spec/lib/within_parent_date_span_validator_spec.rb
73
173
  - spec/spec_helper.rb
174
+ - spec/spec_models.rb
74
175
  homepage: https://github.com/annkissam/acts_as_span
75
- licenses: []
76
-
176
+ licenses:
177
+ - MIT
178
+ metadata:
179
+ allowed_push_host: https://rubygems.org
77
180
  post_install_message:
78
181
  rdoc_options: []
79
-
80
- require_paths:
182
+ require_paths:
81
183
  - lib
82
- required_ruby_version: !ruby/object:Gem::Requirement
83
- none: false
84
- requirements:
184
+ required_ruby_version: !ruby/object:Gem::Requirement
185
+ requirements:
85
186
  - - ">="
86
- - !ruby/object:Gem::Version
87
- version: "0"
88
- required_rubygems_version: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
91
191
  - - ">="
92
- - !ruby/object:Gem::Version
93
- version: "0"
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
94
194
  requirements: []
95
-
96
- rubyforge_project: acts_as_span
97
- rubygems_version: 1.8.8
195
+ rubyforge_project:
196
+ rubygems_version: 2.6.14
98
197
  signing_key:
99
- specification_version: 3
100
- summary: acts_as_span 0.0.5
101
- test_files:
198
+ specification_version: 4
199
+ summary: acts_as_span 0.0.6
200
+ test_files:
102
201
  - spec/lib/acts_as_span_spec.rb
103
202
  - spec/lib/delegation_spec.rb
104
- - spec/lib/negative_spec.rb
203
+ - spec/lib/no_overlap_validator_spec.rb
105
204
  - spec/lib/span_instance/named_scopes_on_spec.rb
106
205
  - spec/lib/span_instance/named_scopes_spec.rb
107
206
  - spec/lib/span_instance/overlap_spec.rb
108
207
  - spec/lib/span_instance/status_spec.rb
109
208
  - spec/lib/span_instance/validations_spec.rb
110
209
  - spec/lib/span_instance_spec.rb
111
- - spec/spec.opts
210
+ - spec/lib/within_parent_date_span_validator_spec.rb
112
211
  - spec/spec_helper.rb
212
+ - spec/spec_models.rb