boundy 0.3.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 +7 -0
- data/lib/boundy.rb +19 -0
- data/lib/boundy/bound.rb +65 -0
- data/lib/boundy/bound/comparator.rb +67 -0
- data/lib/boundy/bound/constrainer.rb +29 -0
- data/lib/boundy/bound/infinite.rb +46 -0
- data/lib/boundy/bound/infinite/above.rb +12 -0
- data/lib/boundy/bound/infinite/below.rb +13 -0
- data/lib/boundy/comparator.rb +19 -0
- data/lib/boundy/comparators.rb +28 -0
- data/lib/boundy/domain.rb +115 -0
- data/lib/boundy/domain/anterior.rb +45 -0
- data/lib/boundy/domain/builder.rb +31 -0
- data/lib/boundy/domain/comparator.rb +26 -0
- data/lib/boundy/domain/constrainer.rb +21 -0
- data/lib/boundy/domain/finite.rb +64 -0
- data/lib/boundy/domain/posterior.rb +43 -0
- data/lib/boundy/formatter.rb +9 -0
- data/lib/boundy/formatter/sql.rb +26 -0
- data/lib/boundy/formatter/sql/domain.rb +20 -0
- data/lib/boundy/formatter/sql/domain/plugin.rb +22 -0
- data/lib/boundy/formatter/sql/factory.rb +14 -0
- data/lib/boundy/formatter/sql/plugin.rb +38 -0
- data/lib/boundy/formatters/bound.rb +16 -0
- data/lib/boundy/formatters/domain.rb +12 -0
- data/lib/boundy/formatters/fixnum.rb +20 -0
- data/lib/boundy/formatters/sql/bound.rb +22 -0
- data/lib/boundy/formatters/sql/domain.rb +28 -0
- data/lib/boundy/formatters/sql/domain/anterior.rb +23 -0
- data/lib/boundy/formatters/sql/domain/finite.rb +24 -0
- data/lib/boundy/formatters/sql/domain/posterior.rb +23 -0
- data/lib/boundy/formatters/time.rb +42 -0
- data/lib/boundy/range/comparator.rb +38 -0
- data/lib/boundy/range/constrainer.rb +17 -0
- data/lib/boundy/time/comparator.rb +37 -0
- data/test/integration/boundy_test.rb +37 -0
- data/test/integration/domain_test.rb +18 -0
- data/test/integration/formatter/sql_test.rb +21 -0
- data/test/integration/test_helper.rb +14 -0
- data/test/unit/boundy/bound/comparator_test.rb +37 -0
- data/test/unit/boundy/bound/constrainer_test.rb +123 -0
- data/test/unit/boundy/bound/infinite/above_test.rb +36 -0
- data/test/unit/boundy/bound/infinite/below_test.rb +36 -0
- data/test/unit/boundy/bound/infinite_test.rb +0 -0
- data/test/unit/boundy/bound_test.rb +86 -0
- data/test/unit/boundy/comparator_test.rb +0 -0
- data/test/unit/boundy/domain/anterior_test.rb +103 -0
- data/test/unit/boundy/domain/comparator_test.rb +75 -0
- data/test/unit/boundy/domain/constrainer_test.rb +11 -0
- data/test/unit/boundy/domain/posterior_test.rb +75 -0
- data/test/unit/boundy/domain_test.rb +50 -0
- data/test/unit/boundy/formatter/sql/domain/plugin_test.rb +16 -0
- data/test/unit/boundy/formatter/sql/plugin_test.rb +50 -0
- data/test/unit/boundy/formatter/sql_test.rb +26 -0
- data/test/unit/boundy/formatters/bound_test.rb +43 -0
- data/test/unit/boundy/formatters/domain_test.rb +12 -0
- data/test/unit/boundy/formatters/sql/domain/anterior_test.rb +29 -0
- data/test/unit/boundy/formatters/sql/domain/finite_test.rb +35 -0
- data/test/unit/boundy/formatters/sql/domain/posterior_test.rb +30 -0
- data/test/unit/boundy/formatters/time_test.rb +27 -0
- data/test/unit/boundy/range/comparator_test.rb +44 -0
- data/test/unit/boundy/range/constrainer_test.rb +11 -0
- data/test/unit/boundy/time/comparator_test.rb +40 -0
- data/test/unit/test_helper.rb +14 -0
- metadata +154 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'boundy/formatter/sql/domain/plugin'
|
2
|
+
require 'boundy/domain/finite'
|
3
|
+
|
4
|
+
module Boundy::Formatters::Sql
|
5
|
+
class Domain
|
6
|
+
class Finite
|
7
|
+
def self.type
|
8
|
+
Boundy::Domain::Finite
|
9
|
+
end
|
10
|
+
|
11
|
+
include Boundy::Formatter::Sql::Domain::Plugin
|
12
|
+
|
13
|
+
def initialize(domain, name)
|
14
|
+
@name = name
|
15
|
+
@from_formatter = Boundy::Formatter::Sql.new(domain.from, name)
|
16
|
+
@to_formatter = Boundy::Formatter::Sql.new(domain.to, name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"#{@name} >= '#{@from_formatter.to_s}' AND #{@name} <= '#{@to_formatter.to_s}'"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'boundy/formatter/sql/domain/plugin'
|
2
|
+
require 'boundy/domain/posterior'
|
3
|
+
|
4
|
+
module Boundy::Formatters::Sql
|
5
|
+
class Domain
|
6
|
+
class Posterior
|
7
|
+
def self.type
|
8
|
+
Boundy::Domain::Posterior
|
9
|
+
end
|
10
|
+
|
11
|
+
include Boundy::Formatter::Sql::Domain::Plugin
|
12
|
+
|
13
|
+
def initialize(domain, name)
|
14
|
+
@name = name
|
15
|
+
@formatter = Boundy::Formatter::Sql.new(domain.to, name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"#{@name} <= '#{@formatter.to_s}'"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'boundy/formatter/sql/plugin'
|
2
|
+
|
3
|
+
require 'boundy/formatters/bound'
|
4
|
+
require 'boundy/formatters/time'
|
5
|
+
|
6
|
+
module Boundy
|
7
|
+
module Formatters
|
8
|
+
class Time
|
9
|
+
class Factory
|
10
|
+
def initialize(format)
|
11
|
+
@format = format
|
12
|
+
end
|
13
|
+
|
14
|
+
def build(time, name)
|
15
|
+
Boundy::Formatters::Time.new(@format, time)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.type
|
20
|
+
::Time
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
class << self
|
25
|
+
def factory
|
26
|
+
@factory = Factory.new("%Y-%m-%d %H:%M:%S")
|
27
|
+
end
|
28
|
+
attr_writer :factory
|
29
|
+
end
|
30
|
+
|
31
|
+
include Boundy::Formatter::Sql::Plugin
|
32
|
+
|
33
|
+
def initialize(format, time)
|
34
|
+
@formatted = time.strftime(format)
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
@formatted
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'boundy/comparator'
|
2
|
+
|
3
|
+
module Boundy
|
4
|
+
class Range
|
5
|
+
class Comparator
|
6
|
+
def self.type
|
7
|
+
::Range
|
8
|
+
end
|
9
|
+
|
10
|
+
include Boundy::Comparator
|
11
|
+
|
12
|
+
def initialize(domain, range)
|
13
|
+
if domain.nil?
|
14
|
+
raise
|
15
|
+
end
|
16
|
+
|
17
|
+
if range.nil?
|
18
|
+
raise
|
19
|
+
end
|
20
|
+
|
21
|
+
other = Boundy::Domain.new(range.begin, range.end)
|
22
|
+
@comparator = Boundy::Domain::Comparator.new(domain, other)
|
23
|
+
end
|
24
|
+
|
25
|
+
def after?
|
26
|
+
@comparator.after?
|
27
|
+
end
|
28
|
+
|
29
|
+
def before?
|
30
|
+
@comparator.before?
|
31
|
+
end
|
32
|
+
|
33
|
+
def within?
|
34
|
+
@comparator.within?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'boundy/domain'
|
2
|
+
require 'boundy/domain/constrainer'
|
3
|
+
|
4
|
+
module Boundy
|
5
|
+
class Range
|
6
|
+
class Constrainer
|
7
|
+
def initialize(domain, range)
|
8
|
+
other = Boundy::Domain.new(range.begin, range.end)
|
9
|
+
@constrainer = Boundy::Domain::Constrainer.new(domain, other)
|
10
|
+
end
|
11
|
+
|
12
|
+
def constrain
|
13
|
+
@constrainer.constrain
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'boundy/comparator'
|
2
|
+
|
3
|
+
module Boundy
|
4
|
+
class Time
|
5
|
+
class Comparator
|
6
|
+
def self.types
|
7
|
+
[::Time, ActiveSupport::TimeWithZone]
|
8
|
+
end
|
9
|
+
|
10
|
+
include Boundy::Comparator
|
11
|
+
|
12
|
+
def initialize(bound, time)
|
13
|
+
if bound.nil?
|
14
|
+
raise
|
15
|
+
end
|
16
|
+
|
17
|
+
if time.nil?
|
18
|
+
raise
|
19
|
+
end
|
20
|
+
other = Boundy::Bound.new(time)
|
21
|
+
@comparator = Boundy::Bound::Comparator.new(bound, other)
|
22
|
+
end
|
23
|
+
|
24
|
+
def after?
|
25
|
+
@comparator.after?
|
26
|
+
end
|
27
|
+
|
28
|
+
def before?
|
29
|
+
@comparator.before?
|
30
|
+
end
|
31
|
+
|
32
|
+
def within?
|
33
|
+
@comparator.within?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'boundy/bound'
|
4
|
+
require 'boundy/domain'
|
5
|
+
|
6
|
+
require 'boundy/formatters/sql/bound'
|
7
|
+
require 'boundy/formatters/time'
|
8
|
+
require 'boundy/formatter/sql'
|
9
|
+
|
10
|
+
class Boundy::Test < Test::Unit::TestCase
|
11
|
+
test "foo" do
|
12
|
+
now = Time.new(2013,9,1)
|
13
|
+
|
14
|
+
from = Boundy::Bound.new(now - 5.day)
|
15
|
+
to = Boundy::Bound.new(now - 1.day)
|
16
|
+
|
17
|
+
domain = Boundy::Domain.new(from,to)
|
18
|
+
|
19
|
+
formatter = Boundy::Formatter::Sql.new(domain, "foo")
|
20
|
+
|
21
|
+
assert_equal "foo >= '2013-08-27 00:00:00' AND foo <= '2013-08-31 00:00:00'", formatter.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'bar' do
|
25
|
+
|
26
|
+
now = Time.new(2013,9,1)
|
27
|
+
|
28
|
+
from = Boundy::Bound.new(now - 5.day)
|
29
|
+
to = Boundy::Bound.new(now - 1.day)
|
30
|
+
|
31
|
+
domain = Boundy::Domain.new(from,to)
|
32
|
+
|
33
|
+
other_from = Boundy::Bound.new(now - 2.day)
|
34
|
+
other_domain = Boundy::Domain::Posterior.new(other_from)
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'boundy/bound'
|
4
|
+
require 'boundy/domain'
|
5
|
+
|
6
|
+
class Boundy::Domain::Test < Test::Unit::TestCase
|
7
|
+
test "domain" do
|
8
|
+
now = Time.new(2013,9,1)
|
9
|
+
|
10
|
+
from = Boundy::Bound.new(now - 5.day)
|
11
|
+
to = Boundy::Bound.new(now - 1.day)
|
12
|
+
|
13
|
+
domain = Boundy::Domain.new(from,to)
|
14
|
+
|
15
|
+
other_from = Boundy::Bound.new(now - 2.day)
|
16
|
+
other_domain = Boundy::Domain::Posterior.new(other_from)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'boundy/bound'
|
4
|
+
require 'boundy/domain'
|
5
|
+
|
6
|
+
require 'boundy/formatters/bound'
|
7
|
+
require 'boundy/formatters/fixnum'
|
8
|
+
require 'boundy/formatters/time'
|
9
|
+
require 'boundy/formatter/sql'
|
10
|
+
|
11
|
+
class Boundy::Formatter::Sql::Test < Test::Unit::TestCase
|
12
|
+
test "foo" do
|
13
|
+
lower = Boundy::Bound.new(1)
|
14
|
+
upper = Boundy::Bound.new(10)
|
15
|
+
domain = Boundy::Domain.new(lower, upper)
|
16
|
+
|
17
|
+
formatter = Boundy::Formatter::Sql.new(domain, "domain")
|
18
|
+
|
19
|
+
assert_equal formatter.to_s, "domain >= '1' AND domain <= '10'"
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
$:.push('lib')
|
2
|
+
|
3
|
+
if ENV["ENABLE_SIMPLE_COV"]
|
4
|
+
require 'simplecov'
|
5
|
+
# require File.expand_path('../simplecov_helper', __FILE__)
|
6
|
+
SimpleCov.start do
|
7
|
+
add_filter "test"
|
8
|
+
add_group 'API', "lib"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'active_support/time'
|
13
|
+
require 'test/unit'
|
14
|
+
require 'mocha/setup'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'boundy/bound/comparator'
|
4
|
+
|
5
|
+
class Boundy::Bound::ComparatorTest < Test::Unit::TestCase
|
6
|
+
time = 5.days.ago
|
7
|
+
bound = Boundy::Bound.new(time)
|
8
|
+
|
9
|
+
bounds = [
|
10
|
+
{:truthiness => :before?, :time => time - 2.days},
|
11
|
+
{:truthiness => :within?, :time => time},
|
12
|
+
{:truthiness => :after?, :time => time + 2.days}
|
13
|
+
]
|
14
|
+
|
15
|
+
methods = [:before?, :after?, :within?]
|
16
|
+
|
17
|
+
cases = bounds.product(methods).map do |p|
|
18
|
+
c = p[0]
|
19
|
+
m = p[1]
|
20
|
+
t = c[:truthiness]
|
21
|
+
|
22
|
+
expected = (c[:truthiness] == m)
|
23
|
+
{:time => c[:time],
|
24
|
+
:method => m,
|
25
|
+
:truthiness => t,
|
26
|
+
:expected => expected
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
cases.each do |c|
|
31
|
+
test "#{c[:method]}_#{c[:truthiness]}" do
|
32
|
+
comp = Boundy::Bound::Comparator.new(bound, Boundy::Bound.new(c[:time]))
|
33
|
+
|
34
|
+
assert_equal c[:expected], comp.method(c[:method]).call
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
|
4
|
+
require 'boundy/bound'
|
5
|
+
require 'boundy/bound/constrainer'
|
6
|
+
require 'boundy/bound/infinite'
|
7
|
+
|
8
|
+
class Boundy::Bound::ConstrainerTest < Test::Unit::TestCase
|
9
|
+
setup do
|
10
|
+
@now = Time.now
|
11
|
+
|
12
|
+
@later = @now - 2.days
|
13
|
+
@earlier = @now - 5.days
|
14
|
+
end
|
15
|
+
|
16
|
+
test '#max right finite' do
|
17
|
+
later = Boundy::Bound.new(@later)
|
18
|
+
earlier = Boundy::Bound.new(@earlier)
|
19
|
+
|
20
|
+
result = Boundy::Bound::Constrainer.new(earlier, later).max
|
21
|
+
|
22
|
+
assert_equal later, result
|
23
|
+
end
|
24
|
+
|
25
|
+
test '#max left finite' do
|
26
|
+
later = Boundy::Bound.new(@later)
|
27
|
+
earlier =Boundy::Bound.new(@earlier)
|
28
|
+
|
29
|
+
result = Boundy::Bound::Constrainer.new(later, earlier).max
|
30
|
+
|
31
|
+
assert_equal later, result
|
32
|
+
end
|
33
|
+
|
34
|
+
test '#max right infinite below' do
|
35
|
+
later = Boundy::Bound.new(@earlier)
|
36
|
+
earlier = Boundy::Bound::Infinite::Below.new
|
37
|
+
|
38
|
+
result = Boundy::Bound::Constrainer.new(earlier,later).max
|
39
|
+
|
40
|
+
assert_equal later, result
|
41
|
+
end
|
42
|
+
|
43
|
+
test '#max left infinite below' do
|
44
|
+
later = Boundy::Bound.new(@earlier)
|
45
|
+
earlier = Boundy::Bound::Infinite::Below.new
|
46
|
+
|
47
|
+
result = Boundy::Bound::Constrainer.new(later, earlier).max
|
48
|
+
|
49
|
+
assert_equal later, result
|
50
|
+
end
|
51
|
+
|
52
|
+
test '#max left infinite above' do
|
53
|
+
earlier = Boundy::Bound.new(@earlier)
|
54
|
+
later = Boundy::Bound::Infinite::Above.new
|
55
|
+
|
56
|
+
result = Boundy::Bound::Constrainer.new(earlier,later).max
|
57
|
+
|
58
|
+
assert_equal later, result
|
59
|
+
end
|
60
|
+
|
61
|
+
test '#max right infinite above' do
|
62
|
+
earlier = Boundy::Bound.new(@earlier)
|
63
|
+
later = Boundy::Bound::Infinite::Above.new
|
64
|
+
|
65
|
+
result = Boundy::Bound::Constrainer.new(later, earlier).max
|
66
|
+
|
67
|
+
assert_equal later, result
|
68
|
+
end
|
69
|
+
|
70
|
+
test '#min right finite' do
|
71
|
+
later = Boundy::Bound.new(@later)
|
72
|
+
earlier =Boundy::Bound.new(@earlier)
|
73
|
+
|
74
|
+
result = Boundy::Bound::Constrainer.new(earlier, later).min
|
75
|
+
|
76
|
+
assert_equal earlier, result
|
77
|
+
end
|
78
|
+
|
79
|
+
test '#min left finite' do
|
80
|
+
later = Boundy::Bound.new(@later)
|
81
|
+
earlier =Boundy::Bound.new(@earlier)
|
82
|
+
|
83
|
+
result = Boundy::Bound::Constrainer.new(later, earlier).min
|
84
|
+
|
85
|
+
assert_equal earlier, result
|
86
|
+
end
|
87
|
+
|
88
|
+
test '#min right infinite below' do
|
89
|
+
later = Boundy::Bound.new(@earlier)
|
90
|
+
earlier = Boundy::Bound::Infinite::Below.new
|
91
|
+
|
92
|
+
result = Boundy::Bound::Constrainer.new(earlier,later).min
|
93
|
+
|
94
|
+
assert_equal earlier, result
|
95
|
+
end
|
96
|
+
|
97
|
+
test '#min left infinite below' do
|
98
|
+
later = Boundy::Bound.new(@earlier)
|
99
|
+
earlier = Boundy::Bound::Infinite::Below.new
|
100
|
+
|
101
|
+
result = Boundy::Bound::Constrainer.new(later, earlier).min
|
102
|
+
|
103
|
+
assert_equal earlier, result
|
104
|
+
end
|
105
|
+
|
106
|
+
test '#min left infinite above' do
|
107
|
+
earlier = Boundy::Bound.new(@earlier)
|
108
|
+
later = Boundy::Bound::Infinite::Above.new
|
109
|
+
|
110
|
+
result = Boundy::Bound::Constrainer.new(earlier,later).min
|
111
|
+
|
112
|
+
assert_equal earlier, result
|
113
|
+
end
|
114
|
+
|
115
|
+
test '#min right infinite above' do
|
116
|
+
earlier = Boundy::Bound.new(@earlier)
|
117
|
+
later = Boundy::Bound::Infinite::Above.new
|
118
|
+
|
119
|
+
result = Boundy::Bound::Constrainer.new(later, earlier).min
|
120
|
+
|
121
|
+
assert_equal earlier, result
|
122
|
+
end
|
123
|
+
end
|