time_frame 0.4.3 → 0.5.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -1
- data/README.md +0 -12
- data/lib/time_frame/collection.rb +13 -21
- data/lib/time_frame/time_frame.rb +1 -1
- data/lib/time_frame/time_frame_handler.rb +16 -0
- data/lib/time_frame/tree_node.rb +0 -20
- data/lib/time_frame/version.rb +1 -1
- data/lib/time_frame.rb +2 -1
- data/spec/models/vogon_poem.rb +23 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/time_frame_handler_spec.rb +14 -0
- data/spec/time_frame_spec.rb +1 -1
- data/time_frame.gemspec +2 -0
- metadata +35 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bff74b0836d124c9e908e78228d6d2d6ce69a5c3
|
4
|
+
data.tar.gz: 2f508be6ca07c0d76e33c09da5491c69ebceed95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e46135147bb82bd9eead8ea48855359068dd1b8788547c57176c46b9791e17b6f7c76bc0ad193947cbfeca41ead41f4f785b598d95b0b4b059f9645084fd0ea5
|
7
|
+
data.tar.gz: fa004da36e99f6b3c0cba0e00e5f713d405013935a37e4b412f765dbeb7d9e1b630695efbffbacc8865486175f4f3b552ae069c17575159c9f06fdff9b5347a4
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -51,18 +51,6 @@ my_time = Time.new(2014, 5, 7, 16)
|
|
51
51
|
time_frame.cover?(my_time)
|
52
52
|
# => true
|
53
53
|
|
54
|
-
# Deviation to another time?
|
55
|
-
earlier_time = time_frame.min - 1.day
|
56
|
-
later_time = time_frame.max + 4.days
|
57
|
-
time_frame.deviation_of(earlier_time)
|
58
|
-
# => -86400.0
|
59
|
-
time_frame.deviation_of(later_time)
|
60
|
-
# => 345600.0
|
61
|
-
# No deviation expected here:
|
62
|
-
time_frame.deviation_of(time_frame.min + 20.minutes)
|
63
|
-
# => 0
|
64
|
-
# ... yay!
|
65
|
-
|
66
54
|
# Shifting to another time... duration remains:
|
67
55
|
time_frame.shift_to(Time.new(2016, 1, 1))
|
68
56
|
# => 2016-01-01 00:00:00 +0100..2016-01-02 00:00:00 +0100
|
@@ -22,19 +22,21 @@ class TimeFrame
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def all_covering(time)
|
25
|
-
|
26
|
-
add_covering(time, @root, result) if any?
|
27
|
-
end
|
25
|
+
all_matching { |element| element.cover? time }
|
28
26
|
end
|
29
27
|
|
30
28
|
def all_intersecting(time_frame)
|
31
|
-
|
32
|
-
add_intersecting(time_frame, @root, result) if any?
|
33
|
-
end
|
29
|
+
all_matching { |element| element.overlaps? time_frame }
|
34
30
|
end
|
35
31
|
|
36
32
|
private
|
37
33
|
|
34
|
+
def all_matching(&matcher)
|
35
|
+
[].tap do |result|
|
36
|
+
add_matching(@root, result, &matcher) if any?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
38
40
|
def sort_nodes
|
39
41
|
@tree_nodes.sort_by! do |item|
|
40
42
|
[item.time_frame.min, item.time_frame.max]
|
@@ -59,22 +61,12 @@ class TimeFrame
|
|
59
61
|
node.update_child_frame(node.child_time_frame) if lower == upper
|
60
62
|
end
|
61
63
|
|
62
|
-
def
|
63
|
-
|
64
|
-
search_right = node.continue_right_side_search_for_time?(time)
|
65
|
-
|
66
|
-
add_covering(time, node.left_child, result) if search_left
|
67
|
-
result << node.item if node.time_frame.cover?(time)
|
68
|
-
add_covering(time, node.right_child, result) if search_right
|
69
|
-
end
|
70
|
-
|
71
|
-
def add_intersecting(time_frame, node, result)
|
72
|
-
search_left = node.continue_left_side_search_for_time_frame?(time_frame)
|
73
|
-
search_right = node.continue_right_side_search_for_time_frame?(time_frame)
|
64
|
+
def add_matching(node, result, &matcher)
|
65
|
+
return unless node && matcher.call(node.child_time_frame)
|
74
66
|
|
75
|
-
|
76
|
-
result << node.item if node.time_frame
|
77
|
-
|
67
|
+
add_matching(node.left_child, result, &matcher)
|
68
|
+
result << node.item if matcher.call(node.time_frame)
|
69
|
+
add_matching(node.right_child, result, &matcher)
|
78
70
|
end
|
79
71
|
end
|
80
72
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class TimeFrame
|
2
|
+
# This class tells the active_record predicate builder how to handle
|
3
|
+
# time_frame classes when passed into a where-clause
|
4
|
+
class Handler
|
5
|
+
def call(column, time_frame)
|
6
|
+
Arel::Nodes::Between.new(
|
7
|
+
column,
|
8
|
+
Arel::Nodes::And.new([time_frame.min, time_frame.max])
|
9
|
+
)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
ActiveRecord::PredicateBuilder.register_handler(
|
15
|
+
TimeFrame, TimeFrame::Handler.new
|
16
|
+
)
|
data/lib/time_frame/tree_node.rb
CHANGED
@@ -30,26 +30,6 @@ class TimeFrame
|
|
30
30
|
@child_time_frame = TimeFrame.new(min: min, max: max)
|
31
31
|
ancestor.update_child_frame(@child_time_frame) if ancestor
|
32
32
|
end
|
33
|
-
|
34
|
-
def continue_left_side_search_for_time?(time)
|
35
|
-
left_child && left_child.child_time_frame.cover?(time)
|
36
|
-
end
|
37
|
-
|
38
|
-
def continue_left_side_search_for_time_frame?(interval)
|
39
|
-
left_child &&
|
40
|
-
left_child.child_time_frame.min <= interval.max &&
|
41
|
-
left_child.child_time_frame.max >= interval.min
|
42
|
-
end
|
43
|
-
|
44
|
-
def continue_right_side_search_for_time?(time)
|
45
|
-
right_child && right_child.child_time_frame.cover?(time)
|
46
|
-
end
|
47
|
-
|
48
|
-
def continue_right_side_search_for_time_frame?(interval)
|
49
|
-
right_child &&
|
50
|
-
right_child.child_time_frame.min <= interval.max &&
|
51
|
-
right_child.child_time_frame.max >= interval.min
|
52
|
-
end
|
53
33
|
end
|
54
34
|
end
|
55
35
|
end
|
data/lib/time_frame/version.rb
CHANGED
data/lib/time_frame.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'active_record'
|
3
3
|
require 'active_support/core_ext'
|
4
4
|
require 'singleton'
|
5
5
|
|
@@ -10,6 +10,7 @@ require 'time_frame/time_frame_overlaps'
|
|
10
10
|
require 'time_frame/time_frame_uniter'
|
11
11
|
|
12
12
|
require 'time_frame/time_frame'
|
13
|
+
require 'time_frame/time_frame_handler'
|
13
14
|
|
14
15
|
require 'time_frame/tree_node'
|
15
16
|
require 'time_frame/collection'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Vogon poetry is of course, the third worst in the universe.
|
2
|
+
class VogonPoem < ActiveRecord::Base
|
3
|
+
def text
|
4
|
+
<<-EOS
|
5
|
+
Oh freddled gruntbuggly,
|
6
|
+
Thy micturitions are to me,
|
7
|
+
As plurdled gabbleblotchits,
|
8
|
+
On a lurgid bee,
|
9
|
+
That mordiously hath blurted out,
|
10
|
+
Its earted jurtles,
|
11
|
+
Into a rancid festering confectious organ squealer. [drowned out by moaning and screaming]
|
12
|
+
Now the jurpling slayjid agrocrustles,
|
13
|
+
Are slurping hagrilly up the axlegrurts,
|
14
|
+
And living glupules frart and slipulate,
|
15
|
+
Like jowling meated liverslime,
|
16
|
+
Groop, I implore thee, my foonting turling dromes,
|
17
|
+
And hooptiously drangle me,
|
18
|
+
With crinkly bindlewurdles,
|
19
|
+
Or else I shall rend thee in the gobberwarts with my blurglecruncheon,
|
20
|
+
See if I don't.
|
21
|
+
EOS
|
22
|
+
end
|
23
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -12,3 +12,16 @@ require 'rspec'
|
|
12
12
|
RSpec.configure do |config|
|
13
13
|
config.order = 'random'
|
14
14
|
end
|
15
|
+
|
16
|
+
# active_record setup for active_record handler specs
|
17
|
+
ActiveRecord::Base.establish_connection(
|
18
|
+
adapter: 'sqlite3', database: ':memory:'
|
19
|
+
)
|
20
|
+
|
21
|
+
ActiveRecord::Schema.define do
|
22
|
+
self.verbose = false
|
23
|
+
|
24
|
+
create_table :vogon_poems, force: true do |t|
|
25
|
+
t.datetime :written_at
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'models/vogon_poem'
|
3
|
+
|
4
|
+
describe TimeFrame::Handler do
|
5
|
+
let(:time_frame) { TimeFrame.new(min: 5.days.ago, duration: 20.days) }
|
6
|
+
let!(:poem_min) { VogonPoem.create(written_at: time_frame.min) }
|
7
|
+
let!(:poem_max) { VogonPoem.create(written_at: time_frame.max) }
|
8
|
+
|
9
|
+
it 'should return all records between min and max' do
|
10
|
+
expect(VogonPoem.where(written_at: time_frame).count).to eq 2
|
11
|
+
expect(VogonPoem.where(written_at: time_frame).first).to eq poem_min
|
12
|
+
expect(VogonPoem.where(written_at: time_frame).last).to eq poem_max
|
13
|
+
end
|
14
|
+
end
|
data/spec/time_frame_spec.rb
CHANGED
@@ -10,7 +10,7 @@ describe TimeFrame do
|
|
10
10
|
I18n.enforce_available_locales = true
|
11
11
|
end
|
12
12
|
|
13
|
-
it
|
13
|
+
it 'should be hashable' do
|
14
14
|
hash = {}
|
15
15
|
time_frame1 = TimeFrame.new(min: time, duration: duration)
|
16
16
|
time_frame2 = TimeFrame.new(min: time, duration: duration)
|
data/time_frame.gemspec
CHANGED
@@ -30,5 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_development_dependency 'rspec', '~> 3.0.0'
|
31
31
|
spec.add_development_dependency 'simplecov', '~> 0.8.2'
|
32
32
|
spec.add_development_dependency 'rubocop', '~> 0.23.0'
|
33
|
+
spec.add_development_dependency 'sqlite3'
|
34
|
+
spec.add_dependency 'activerecord', '~> 4.1.1'
|
33
35
|
spec.add_dependency 'activesupport', '~> 4.1.1'
|
34
36
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: time_frame
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrick Derichs
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-10-
|
13
|
+
date: 2014-10-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -68,6 +68,34 @@ dependencies:
|
|
68
68
|
- - "~>"
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
version: 0.23.0
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: sqlite3
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: activerecord
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 4.1.1
|
92
|
+
type: :runtime
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - "~>"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 4.1.1
|
71
99
|
- !ruby/object:Gem::Dependency
|
72
100
|
name: activesupport
|
73
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -103,13 +131,16 @@ files:
|
|
103
131
|
- lib/time_frame/empty.rb
|
104
132
|
- lib/time_frame/time_frame.rb
|
105
133
|
- lib/time_frame/time_frame_covered.rb
|
134
|
+
- lib/time_frame/time_frame_handler.rb
|
106
135
|
- lib/time_frame/time_frame_overlaps.rb
|
107
136
|
- lib/time_frame/time_frame_splitter.rb
|
108
137
|
- lib/time_frame/time_frame_uniter.rb
|
109
138
|
- lib/time_frame/tree_node.rb
|
110
139
|
- lib/time_frame/version.rb
|
111
140
|
- spec/collection_spec.rb
|
141
|
+
- spec/models/vogon_poem.rb
|
112
142
|
- spec/spec_helper.rb
|
143
|
+
- spec/time_frame_handler_spec.rb
|
113
144
|
- spec/time_frame_spec.rb
|
114
145
|
- time_frame.gemspec
|
115
146
|
homepage: https://github.com/injixo/time_frame
|
@@ -138,5 +169,7 @@ specification_version: 4
|
|
138
169
|
summary: Ruby gem that offers support for time frames
|
139
170
|
test_files:
|
140
171
|
- spec/collection_spec.rb
|
172
|
+
- spec/models/vogon_poem.rb
|
141
173
|
- spec/spec_helper.rb
|
174
|
+
- spec/time_frame_handler_spec.rb
|
142
175
|
- spec/time_frame_spec.rb
|