arel_extensions 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/README.md +10 -1
- data/gemfiles/rails5_1_4.gemfile +4 -4
- data/lib/arel_extensions.rb +7 -8
- data/lib/arel_extensions/math.rb +3 -0
- data/lib/arel_extensions/math_functions.rb +40 -0
- data/lib/arel_extensions/nodes/case.rb +8 -3
- data/lib/arel_extensions/nodes/cast.rb +52 -0
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/concat.rb +4 -0
- data/lib/arel_extensions/nodes/format.rb +1 -1
- data/lib/arel_extensions/nodes/formatted_number.rb +56 -0
- data/lib/arel_extensions/nodes/function.rb +9 -2
- data/lib/arel_extensions/nodes/log10.rb +8 -0
- data/lib/arel_extensions/nodes/matches.rb +0 -1
- data/lib/arel_extensions/nodes/power.rb +11 -0
- data/lib/arel_extensions/nodes/repeat.rb +20 -0
- data/lib/arel_extensions/nodes/soundex.rb +16 -5
- data/lib/arel_extensions/predications.rb +18 -0
- data/lib/arel_extensions/set_functions.rb +3 -0
- data/lib/arel_extensions/string_functions.rb +7 -0
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +31 -0
- data/lib/arel_extensions/visitors/mysql.rb +41 -1
- data/lib/arel_extensions/visitors/oracle.rb +31 -0
- data/lib/arel_extensions/visitors/postgresql.rb +31 -0
- data/lib/arel_extensions/visitors/to_sql.rb +88 -2
- data/test/visitors/test_to_sql.rb +67 -10
- data/test/with_ar/all_agnostic_test.rb +20 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8aa9a662954d3fc3157f1275991e4bf04e13ea63
|
4
|
+
data.tar.gz: ff96c79a38ce3a7f9f675ac3af7596caf689f7f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 741e88fb943d9482ff4e7966747f56bf94d0aed909ed6f838e084eef53f89b74a55a90ad22daeaed1a53ee7d05192b52a7c03ca3c9988d32e2e511052821411e
|
7
|
+
data.tar.gz: 75dcbf19327872a9d6b7eab78c334f9875e56ba3ef5f6c2d571c10c6acc2d2eb91254cd757ef97590ea4770689db59e9a9775869f6d7345e8a4eb00572c388d0
|
data/.travis.yml
CHANGED
@@ -54,6 +54,7 @@ rvm:
|
|
54
54
|
- 2.2.5
|
55
55
|
- 2.3.1
|
56
56
|
- 2.4.0
|
57
|
+
- 2.5.0
|
57
58
|
- rbx-2
|
58
59
|
- jruby-9.0.5.0
|
59
60
|
- jruby-head
|
@@ -77,6 +78,8 @@ matrix:
|
|
77
78
|
jdk: openjdk7
|
78
79
|
- rvm: 2.4.0
|
79
80
|
jdk: openjdk7
|
81
|
+
- rvm: 2.5.0
|
82
|
+
jdk: openjdk7
|
80
83
|
- rvm: ruby-head
|
81
84
|
jdk: openjdk7
|
82
85
|
- rvm: rbx-2
|
@@ -91,6 +94,8 @@ matrix:
|
|
91
94
|
jdk: oraclejdk8
|
92
95
|
- rvm: 2.4.0
|
93
96
|
jdk: oraclejdk8
|
97
|
+
- rvm: 2.5.0
|
98
|
+
jdk: oraclejdk8
|
94
99
|
- rvm: ruby-head
|
95
100
|
jdk: oraclejdk8
|
96
101
|
- rvm: jruby-head
|
data/README.md
CHANGED
@@ -138,10 +138,19 @@ t[:birthdate].format('%Y-%m-%d').to_sql
|
|
138
138
|
Arel-extensions allows to use functions on case clause
|
139
139
|
|
140
140
|
```ruby
|
141
|
-
|
141
|
+
t[:name].when("smith").then(1).when("doe").then(2).else(0).sum.to_sql
|
142
142
|
# => SUM(CASE "my_table"."name" WHEN 'smith' THEN 1 WHEN 'doe' THEN 2 ELSE 0 END)
|
143
143
|
```
|
144
144
|
|
145
|
+
## Cast Function
|
146
|
+
|
147
|
+
Arel-extensions allows to cast type on constants and attributes
|
148
|
+
|
149
|
+
```ruby
|
150
|
+
t[:id].cast('char').to_sql
|
151
|
+
# => CAST("my_table"."id" AS char)
|
152
|
+
```
|
153
|
+
|
145
154
|
|
146
155
|
## Stored Procedures and User-defined functions
|
147
156
|
|
data/gemfiles/rails5_1_4.gemfile
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
-
gem 'rails', '
|
3
|
+
gem 'rails', '5.1.4'
|
4
4
|
gem 'arel', '~> 8'
|
5
5
|
|
6
6
|
group :development, :test do
|
7
|
-
gem 'activesupport', '
|
8
|
-
gem 'activemodel', '
|
9
|
-
gem 'activerecord', '
|
7
|
+
gem 'activesupport', '5.1.4'
|
8
|
+
gem 'activemodel', '5.1.4'
|
9
|
+
gem 'activerecord', '5.1.4'
|
10
10
|
|
11
11
|
gem "sqlite3", :platforms => [:mri, :mswin, :mingw]
|
12
12
|
gem "mysql2", :platforms => [:mri, :mswin, :mingw]
|
data/lib/arel_extensions.rb
CHANGED
@@ -57,6 +57,8 @@ require 'arel_extensions/nodes/union'
|
|
57
57
|
require 'arel_extensions/nodes/union_all'
|
58
58
|
require 'arel_extensions/nodes/as'
|
59
59
|
require 'arel_extensions/nodes/case'
|
60
|
+
require 'arel_extensions/nodes/soundex'
|
61
|
+
require 'arel_extensions/nodes/cast'
|
60
62
|
require 'arel_extensions/predications'
|
61
63
|
|
62
64
|
|
@@ -116,18 +118,15 @@ Arel::SelectManager.class_eval do
|
|
116
118
|
include ArelExtensions::Nodes
|
117
119
|
end
|
118
120
|
|
119
|
-
Arel::Nodes::
|
120
|
-
include ArelExtensions::SetFunctions
|
121
|
+
Arel::Nodes::As.class_eval do
|
121
122
|
include ArelExtensions::Nodes
|
122
123
|
end
|
123
124
|
|
124
|
-
Arel::Nodes::UnionAll.class_eval do
|
125
|
-
include ArelExtensions::SetFunctions
|
126
|
-
include ArelExtensions::Nodes
|
127
|
-
end
|
128
125
|
|
129
|
-
Arel::
|
130
|
-
|
126
|
+
if Arel::VERSION.to_i >= 7
|
127
|
+
Arel::Nodes::Case.class_eval do
|
128
|
+
include ArelExtensions::Predications
|
129
|
+
end
|
131
130
|
end
|
132
131
|
|
133
132
|
|
data/lib/arel_extensions/math.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'arel_extensions/nodes'
|
2
2
|
require 'arel_extensions/nodes/concat'
|
3
|
+
require 'arel_extensions/nodes/cast'
|
3
4
|
|
4
5
|
require 'arel_extensions/nodes/date_diff'
|
5
6
|
require 'arel_extensions/nodes/duration'
|
@@ -14,6 +15,7 @@ module ArelExtensions
|
|
14
15
|
#Date and integer adds or subtracts a specified time interval from a date.
|
15
16
|
def +(other)
|
16
17
|
return ArelExtensions::Nodes::Concat.new [self, other] if self.is_a?(Arel::Nodes::Quoted)
|
18
|
+
|
17
19
|
if self.is_a?(Arel::Nodes::Grouping)
|
18
20
|
if self.expr.left.is_a?(String) || self.expr.right.is_a?(String)
|
19
21
|
return ArelExtensions::Nodes::Concat.new [self, other]
|
@@ -21,6 +23,7 @@ module ArelExtensions
|
|
21
23
|
return Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
|
22
24
|
end
|
23
25
|
end
|
26
|
+
|
24
27
|
return case self.class.return_type
|
25
28
|
when :string, :text
|
26
29
|
ArelExtensions::Nodes::Concat.new [self, other]
|
@@ -3,6 +3,9 @@ require 'arel_extensions/nodes/ceil'
|
|
3
3
|
require 'arel_extensions/nodes/floor'
|
4
4
|
require 'arel_extensions/nodes/round'
|
5
5
|
require 'arel_extensions/nodes/rand'
|
6
|
+
require 'arel_extensions/nodes/formatted_number'
|
7
|
+
require 'arel_extensions/nodes/log10'
|
8
|
+
require 'arel_extensions/nodes/power'
|
6
9
|
|
7
10
|
module ArelExtensions
|
8
11
|
module MathFunctions
|
@@ -21,6 +24,22 @@ module ArelExtensions
|
|
21
24
|
def floor
|
22
25
|
ArelExtensions::Nodes::Floor.new [self]
|
23
26
|
end
|
27
|
+
|
28
|
+
# function gives the base 10 log
|
29
|
+
def log10
|
30
|
+
ArelExtensions::Nodes::Log10.new [self]
|
31
|
+
end
|
32
|
+
|
33
|
+
# function gives the power of a number
|
34
|
+
def pow exposant = 0
|
35
|
+
ArelExtensions::Nodes::Power.new [self,exposant]
|
36
|
+
end
|
37
|
+
|
38
|
+
# function gives the power of a number
|
39
|
+
def power exposant = 0
|
40
|
+
ArelExtensions::Nodes::Power.new [self,exposant]
|
41
|
+
end
|
42
|
+
|
24
43
|
|
25
44
|
#function that can be invoked to produce random numbers between 0 and 1
|
26
45
|
# def rand seed = nil
|
@@ -36,6 +55,27 @@ module ArelExtensions
|
|
36
55
|
ArelExtensions::Nodes::Round.new [self]
|
37
56
|
end
|
38
57
|
end
|
58
|
+
|
59
|
+
# function returning a number at a specific format
|
60
|
+
def format_number format_string, locale=nil
|
61
|
+
begin
|
62
|
+
sprintf(format_string,0) # this line is to get the right error message if the format_string is not correct
|
63
|
+
m = /^(.*)%([ #+\-0]*)([1-9][0-9]+|[1-9]?)[.]?([0-9]*)([a-zA-Z])(.*)$/.match(format_string)
|
64
|
+
opts = {
|
65
|
+
:prefix => m[1],
|
66
|
+
:flags => m[2].split(//).uniq.join,
|
67
|
+
:width => m[3].to_i,
|
68
|
+
:precision => m[4] != '' ? m[4].to_i : 6,
|
69
|
+
:type => m[5],
|
70
|
+
:suffix => m[6],
|
71
|
+
:locale => locale
|
72
|
+
}
|
73
|
+
# opts = {:locale => 'fr_FR', :type => "e"/"f"/"d", :prefix => "$ ", :suffix => " %", :flags => " +-#0", :width => 5, :precision => 6}
|
74
|
+
ArelExtensions::Nodes::FormattedNumber.new [self,opts]
|
75
|
+
rescue
|
76
|
+
Arel::Nodes.build_quoted('Wrong Format')
|
77
|
+
end
|
78
|
+
end
|
39
79
|
|
40
80
|
end
|
41
81
|
end
|
@@ -2,8 +2,9 @@ module ArelExtensions
|
|
2
2
|
module Nodes
|
3
3
|
if Arel::VERSION.to_i < 7
|
4
4
|
class Case < Arel::Nodes::Node
|
5
|
-
include ArelExtensions::Predications
|
6
5
|
include Arel::Expressions
|
6
|
+
include ArelExtensions::Comparators
|
7
|
+
include ArelExtensions::Predications
|
7
8
|
|
8
9
|
attr_accessor :case, :conditions, :default
|
9
10
|
|
@@ -56,11 +57,15 @@ module ArelExtensions
|
|
56
57
|
end
|
57
58
|
|
58
59
|
class Else < Arel::Nodes::Unary # :nodoc:
|
59
|
-
end
|
60
|
+
end
|
60
61
|
|
61
62
|
else
|
62
63
|
|
63
|
-
class Case < Arel::Nodes::Case
|
64
|
+
class Case < Arel::Nodes::Case
|
65
|
+
include Arel::Expressions
|
66
|
+
include ArelExtensions::Comparators
|
67
|
+
include ArelExtensions::Predications
|
68
|
+
|
64
69
|
end
|
65
70
|
|
66
71
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Cast < Function
|
4
|
+
@@return_type= :string
|
5
|
+
|
6
|
+
def initialize expr
|
7
|
+
as_attr = expr[1]
|
8
|
+
case expr[1]
|
9
|
+
when 'bigint', 'int', 'smallint', 'tinyint', 'bit', 'decimal', 'numeric', 'money', 'smallmoney', 'float', 'real'
|
10
|
+
@@return_type= :number
|
11
|
+
when 'datetime', 'smalldatetime'
|
12
|
+
@@return_type= :ruby_time
|
13
|
+
when 'char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext'
|
14
|
+
@@return_type= :string
|
15
|
+
when 'binary', 'varbinary', 'image'
|
16
|
+
@@return_type= :binary
|
17
|
+
when :number
|
18
|
+
@@return_type= :number
|
19
|
+
as_attr = 'int'
|
20
|
+
when :datetime
|
21
|
+
@@return_type= :ruby_time
|
22
|
+
as_attr = 'datetime'
|
23
|
+
when :string
|
24
|
+
@@return_type= :string
|
25
|
+
as_attr = 'char'
|
26
|
+
when :binary
|
27
|
+
@@return_type= :binary
|
28
|
+
as_attr = 'binary'
|
29
|
+
else
|
30
|
+
@@return_type= :string
|
31
|
+
as_attr = 'char'
|
32
|
+
end
|
33
|
+
tab = [convert_to_node(expr.first), Arel::Nodes::SqlLiteral.new(as_attr)]
|
34
|
+
return super(tab)
|
35
|
+
end
|
36
|
+
|
37
|
+
def +(other)
|
38
|
+
case @@return_type
|
39
|
+
when :string
|
40
|
+
return ArelExtensions::Nodes::Concat.new [self, other]
|
41
|
+
when :ruby_time
|
42
|
+
ArelExtensions::Nodes::DateAdd.new [self, other]
|
43
|
+
else
|
44
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -2,9 +2,10 @@ module ArelExtensions
|
|
2
2
|
module Nodes
|
3
3
|
class Coalesce < Function
|
4
4
|
include ArelExtensions::Math
|
5
|
+
include ArelExtensions::Comparators
|
6
|
+
|
5
7
|
attr_accessor :left_node_type
|
6
8
|
|
7
|
-
|
8
9
|
def initialize expr
|
9
10
|
tab = expr.map { |arg|
|
10
11
|
convert_to_node(arg)
|
@@ -15,7 +16,7 @@ module ArelExtensions
|
|
15
16
|
when Integer, Float
|
16
17
|
@left_node_type = :number
|
17
18
|
when ArelExtensions::Nodes::Coalesce, ArelExtensions::Nodes::Function
|
18
|
-
@left_node_type = expr.first.
|
19
|
+
@left_node_type = expr.first.respond_to?(:left_node_type) ? expr.first.left_node_type : nil
|
19
20
|
when Arel::Nodes::Node, Arel::Attributes::Attribute
|
20
21
|
@left_node_type = type_of_attribute(expr.first)
|
21
22
|
when Date
|
@@ -25,7 +26,7 @@ module ArelExtensions
|
|
25
26
|
end
|
26
27
|
return super(tab)
|
27
28
|
end
|
28
|
-
|
29
|
+
|
29
30
|
end
|
30
31
|
end
|
31
32
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class FormattedNumber < Function
|
4
|
+
@@return_type = :string
|
5
|
+
|
6
|
+
attr_accessor :locale, :prefix, :suffix, :flags, :scientific_notation, :width,:precision, :type
|
7
|
+
|
8
|
+
def initialize expr
|
9
|
+
# expr[1] = {:locale => 'fr_FR', :type => "e"/"f"/"d", :prefix => "$ ", :suffix => " %", :flags => " +-#0", :width => 5, :precision => 6}
|
10
|
+
col = expr.first
|
11
|
+
@locale = expr[1][:locale]
|
12
|
+
@prefix = expr[1][:prefix]
|
13
|
+
@suffix = expr[1][:suffix]
|
14
|
+
@width = expr[1][:width]
|
15
|
+
@precision = expr[1][:precision]
|
16
|
+
@type = expr[1][:type]
|
17
|
+
@flags = expr[1][:flags]
|
18
|
+
@scientific_notation = /[eE]/.match(expr[1][:type]) || false
|
19
|
+
super [col]
|
20
|
+
end
|
21
|
+
|
22
|
+
def locale
|
23
|
+
@locale
|
24
|
+
end
|
25
|
+
|
26
|
+
def prefix
|
27
|
+
@prefix
|
28
|
+
end
|
29
|
+
|
30
|
+
def suffix
|
31
|
+
@suffix
|
32
|
+
end
|
33
|
+
|
34
|
+
def width
|
35
|
+
@width
|
36
|
+
end
|
37
|
+
|
38
|
+
def precision
|
39
|
+
@precision
|
40
|
+
end
|
41
|
+
|
42
|
+
def type
|
43
|
+
@type
|
44
|
+
end
|
45
|
+
|
46
|
+
def flags
|
47
|
+
@flags
|
48
|
+
end
|
49
|
+
|
50
|
+
def scientific_notation
|
51
|
+
@scientific_notation
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -1,8 +1,11 @@
|
|
1
|
+
require 'arel_extensions/predications'
|
2
|
+
|
1
3
|
module ArelExtensions
|
2
4
|
module Nodes
|
3
5
|
class Function < Arel::Nodes::Function
|
4
6
|
include Arel::Math
|
5
7
|
include Arel::Expressions
|
8
|
+
include ArelExtensions::Predications
|
6
9
|
|
7
10
|
cattr_accessor :return_type
|
8
11
|
|
@@ -25,10 +28,14 @@ module ArelExtensions
|
|
25
28
|
@expressions[1]
|
26
29
|
end
|
27
30
|
|
28
|
-
def type_of_attribute(att)
|
31
|
+
def type_of_attribute(att)
|
29
32
|
case att
|
30
33
|
when Arel::Attributes::Attribute
|
31
|
-
|
34
|
+
begin
|
35
|
+
Arel::Table.engine.connection.schema_cache.columns_hash(att.relation.table_name)[att.name.to_s].type
|
36
|
+
rescue
|
37
|
+
att
|
38
|
+
end
|
32
39
|
when ArelExtensions::Nodes::Function
|
33
40
|
att.class.return_type
|
34
41
|
# else
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Repeat < Function
|
4
|
+
@@return_type = :string
|
5
|
+
|
6
|
+
def initialize expr
|
7
|
+
tab = expr.map { |arg|
|
8
|
+
convert_to_node(arg)
|
9
|
+
}
|
10
|
+
return super(tab)
|
11
|
+
end
|
12
|
+
|
13
|
+
def +(other)
|
14
|
+
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -1,7 +1,18 @@
|
|
1
1
|
module ArelExtensions
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
module Nodes
|
3
|
+
class Soundex < Function
|
4
|
+
include Arel::Expressions
|
5
|
+
include ArelExtensions::Comparators
|
6
|
+
|
7
|
+
@@return_type = :string
|
8
|
+
|
9
|
+
def ==(other)
|
10
|
+
Arel::Nodes::Equality.new self, Arel::Nodes.build_quoted(other, self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def !=(other)
|
14
|
+
Arel::Nodes::NotEqual.new self, Arel::Nodes.build_quoted(other, self)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
7
18
|
end
|
@@ -5,5 +5,23 @@ module ArelExtensions
|
|
5
5
|
ArelExtensions::Nodes::Case.new(self).when(right)
|
6
6
|
end
|
7
7
|
end
|
8
|
+
|
9
|
+
def matches(other, escape=nil)
|
10
|
+
Arel::Nodes::Matches.new(self, Arel::Nodes.build_quoted(other), escape)
|
11
|
+
end
|
12
|
+
|
13
|
+
def imatches(other, escape=nil)
|
14
|
+
ArelExtensions::Nodes::IMatches.new(self, other, escape)
|
15
|
+
end
|
16
|
+
|
17
|
+
def cast_as_char
|
18
|
+
ArelExtensions::Nodes::Cast.new([self,'char'])
|
19
|
+
end
|
20
|
+
|
21
|
+
def cast right
|
22
|
+
ArelExtensions::Nodes::Cast.new([self,right])
|
23
|
+
end
|
24
|
+
|
25
|
+
|
8
26
|
end
|
9
27
|
end
|
@@ -10,6 +10,9 @@ require 'arel_extensions/nodes/trim'
|
|
10
10
|
require 'arel_extensions/nodes/change_case'
|
11
11
|
require 'arel_extensions/nodes/blank'
|
12
12
|
require 'arel_extensions/nodes/format'
|
13
|
+
require 'arel_extensions/nodes/repeat'
|
14
|
+
require 'arel_extensions/nodes/cast'
|
15
|
+
|
13
16
|
|
14
17
|
module ArelExtensions
|
15
18
|
module StringFunctions
|
@@ -110,6 +113,10 @@ module ArelExtensions
|
|
110
113
|
def not_blank
|
111
114
|
ArelExtensions::Nodes::NotBlank.new [self]
|
112
115
|
end
|
116
|
+
|
117
|
+
def repeat other = 1
|
118
|
+
ArelExtensions::Nodes::Repeat.new [self, other]
|
119
|
+
end
|
113
120
|
|
114
121
|
end
|
115
122
|
end
|
@@ -28,6 +28,26 @@ module ArelExtensions
|
|
28
28
|
collector << ")"
|
29
29
|
collector
|
30
30
|
end
|
31
|
+
|
32
|
+
def visit_ArelExtensions_Nodes_Log10 o, collector
|
33
|
+
collector << "LOG10("
|
34
|
+
o.expressions.each_with_index { |arg, i|
|
35
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
36
|
+
collector = visit arg, collector
|
37
|
+
}
|
38
|
+
collector << ")"
|
39
|
+
collector
|
40
|
+
end
|
41
|
+
|
42
|
+
def visit_ArelExtensions_Nodes_Power o, collector
|
43
|
+
collector << "POWER("
|
44
|
+
o.expressions.each_with_index { |arg, i|
|
45
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
46
|
+
collector = visit arg, collector
|
47
|
+
}
|
48
|
+
collector << ")"
|
49
|
+
collector
|
50
|
+
end
|
31
51
|
|
32
52
|
def visit_ArelExtensions_Nodes_IsNull o, collector
|
33
53
|
collector << "("
|
@@ -69,6 +89,17 @@ module ArelExtensions
|
|
69
89
|
collector << ")"
|
70
90
|
collector
|
71
91
|
end
|
92
|
+
|
93
|
+
def visit_ArelExtensions_Nodes_Repeat o, collector
|
94
|
+
collector << "REPLICATE("
|
95
|
+
o.expressions.each_with_index { |arg, i|
|
96
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
97
|
+
collector = visit arg, collector
|
98
|
+
}
|
99
|
+
collector << ")"
|
100
|
+
collector
|
101
|
+
end
|
102
|
+
|
72
103
|
|
73
104
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
74
105
|
collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
@@ -9,6 +9,28 @@ module ArelExtensions
|
|
9
9
|
'%M' => '%i', '%S' => '%S', '%L' => '', '%N' => '%f', '%z' => ''
|
10
10
|
}
|
11
11
|
|
12
|
+
|
13
|
+
#Math functions
|
14
|
+
def visit_ArelExtensions_Nodes_Log10 o, collector
|
15
|
+
collector << "LOG10("
|
16
|
+
o.expressions.each_with_index { |arg, i|
|
17
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
18
|
+
collector = visit arg, collector
|
19
|
+
}
|
20
|
+
collector << ")"
|
21
|
+
collector
|
22
|
+
end
|
23
|
+
|
24
|
+
def visit_ArelExtensions_Nodes_Power o, collector
|
25
|
+
collector << "POW("
|
26
|
+
o.expressions.each_with_index { |arg, i|
|
27
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
28
|
+
collector = visit arg, collector
|
29
|
+
}
|
30
|
+
collector << ")"
|
31
|
+
collector
|
32
|
+
end
|
33
|
+
|
12
34
|
#String functions
|
13
35
|
def visit_ArelExtensions_Nodes_IMatches o, collector # insensitive on ASCII
|
14
36
|
collector = visit o.left, collector
|
@@ -38,7 +60,13 @@ module ArelExtensions
|
|
38
60
|
collector << "CONCAT("
|
39
61
|
o.expressions.each_with_index { |arg, i|
|
40
62
|
collector << Arel::Visitors::MySQL::COMMA unless i == 0
|
41
|
-
|
63
|
+
if (arg.is_a?(Numeric)) || (arg.is_a?(Arel::Attributes::Attribute))
|
64
|
+
collector << "CAST("
|
65
|
+
collector = visit arg, collector
|
66
|
+
collector << " AS char)"
|
67
|
+
else
|
68
|
+
collector = visit arg, collector
|
69
|
+
end
|
42
70
|
}
|
43
71
|
collector << ")"
|
44
72
|
collector
|
@@ -81,6 +109,16 @@ module ArelExtensions
|
|
81
109
|
collector << ")"
|
82
110
|
collector
|
83
111
|
end
|
112
|
+
|
113
|
+
def visit_ArelExtensions_Nodes_Repeat o, collector
|
114
|
+
collector << "REPEAT("
|
115
|
+
o.expressions.each_with_index { |arg, i|
|
116
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
117
|
+
collector = visit arg, collector
|
118
|
+
}
|
119
|
+
collector << ")"
|
120
|
+
collector
|
121
|
+
end
|
84
122
|
|
85
123
|
def visit_ArelExtensions_Nodes_Format o, collector
|
86
124
|
case o.col_type
|
@@ -95,6 +133,8 @@ module ArelExtensions
|
|
95
133
|
when :integer, :float, :decimal
|
96
134
|
collector << "FORMAT("
|
97
135
|
collector = visit o.left, collector
|
136
|
+
collector << Arel::Visitors::ToSql::COMMA
|
137
|
+
collector << '2'
|
98
138
|
collector << Arel::Visitors::ToSql::COMMA
|
99
139
|
collector = visit o.right, collector
|
100
140
|
collector << ")"
|
@@ -9,6 +9,28 @@ module ArelExtensions
|
|
9
9
|
'%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
|
10
10
|
'%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz' # seconds, subseconds
|
11
11
|
}
|
12
|
+
|
13
|
+
def visit_ArelExtensions_Nodes_Log10 o, collector
|
14
|
+
collector << "LOG("
|
15
|
+
o.expressions.each_with_index { |arg, i|
|
16
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
17
|
+
collector = visit arg, collector
|
18
|
+
}
|
19
|
+
collector << ",10)"
|
20
|
+
collector
|
21
|
+
end
|
22
|
+
|
23
|
+
def visit_ArelExtensions_Nodes_Power o, collector
|
24
|
+
collector << "POWER("
|
25
|
+
o.expressions.each_with_index { |arg, i|
|
26
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
27
|
+
collector = visit arg, collector
|
28
|
+
}
|
29
|
+
collector << ")"
|
30
|
+
collector
|
31
|
+
end
|
32
|
+
|
33
|
+
|
12
34
|
|
13
35
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
14
36
|
collector << '('
|
@@ -265,6 +287,15 @@ module ArelExtensions
|
|
265
287
|
collector << ")"
|
266
288
|
collector
|
267
289
|
end
|
290
|
+
|
291
|
+
def visit_ArelExtensions_Nodes_Repeat o, collector
|
292
|
+
collector << "LPAD('',"
|
293
|
+
collector = visit o.expressions[1], collector
|
294
|
+
collector << Arel::Visitors::ToSql::COMMA
|
295
|
+
collector = visit o.expressions[0], collector
|
296
|
+
collector << ")"
|
297
|
+
collector
|
298
|
+
end
|
268
299
|
|
269
300
|
# add primary_key if not present, avoid zip
|
270
301
|
if Arel::VERSION.to_i < 7
|
@@ -19,6 +19,27 @@ module ArelExtensions
|
|
19
19
|
collector << ")"
|
20
20
|
collector
|
21
21
|
end
|
22
|
+
|
23
|
+
def visit_ArelExtensions_Nodes_Power o, collector
|
24
|
+
collector << "POWER("
|
25
|
+
o.expressions.each_with_index { |arg, i|
|
26
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
27
|
+
collector = visit arg, collector
|
28
|
+
}
|
29
|
+
collector << ")"
|
30
|
+
collector
|
31
|
+
end
|
32
|
+
|
33
|
+
def visit_ArelExtensions_Nodes_Log10 o, collector
|
34
|
+
collector << "LOG("
|
35
|
+
o.expressions.each_with_index { |arg, i|
|
36
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
37
|
+
collector = visit arg, collector
|
38
|
+
}
|
39
|
+
collector << ")"
|
40
|
+
collector
|
41
|
+
end
|
42
|
+
|
22
43
|
|
23
44
|
remove_method(:visit_Arel_Nodes_Regexp) rescue nil
|
24
45
|
def visit_Arel_Nodes_Regexp o, collector
|
@@ -100,6 +121,16 @@ module ArelExtensions
|
|
100
121
|
collector << ")"
|
101
122
|
collector
|
102
123
|
end
|
124
|
+
|
125
|
+
def visit_ArelExtensions_Nodes_Repeat o, collector
|
126
|
+
collector << "REPEAT("
|
127
|
+
o.expressions.each_with_index { |arg, i|
|
128
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
129
|
+
collector = visit arg, collector
|
130
|
+
}
|
131
|
+
collector << ")"
|
132
|
+
collector
|
133
|
+
end
|
103
134
|
|
104
135
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
105
136
|
collector = visit o.left, collector
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
|
-
Arel::Visitors::ToSql.class_eval do
|
3
|
+
Arel::Visitors::ToSql.class_eval do
|
4
|
+
|
4
5
|
|
5
6
|
# Math Functions
|
6
7
|
def visit_ArelExtensions_Nodes_Abs o, collector
|
@@ -52,6 +53,23 @@ module ArelExtensions
|
|
52
53
|
collector << ")"
|
53
54
|
collector
|
54
55
|
end
|
56
|
+
|
57
|
+
def visit_ArelExtensions_Nodes_Log10 o, collector
|
58
|
+
collector << "LOG10("
|
59
|
+
collector = visit o.left, collector
|
60
|
+
collector << ")"
|
61
|
+
collector
|
62
|
+
end
|
63
|
+
|
64
|
+
def visit_ArelExtensions_Nodes_Power o, collector
|
65
|
+
collector << "POW("
|
66
|
+
o.expressions.each_with_index { |arg, i|
|
67
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
68
|
+
collector = visit arg, collector
|
69
|
+
}
|
70
|
+
collector << ")"
|
71
|
+
collector
|
72
|
+
end
|
55
73
|
|
56
74
|
# String functions
|
57
75
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
@@ -110,6 +128,16 @@ module ArelExtensions
|
|
110
128
|
collector << ")"
|
111
129
|
collector
|
112
130
|
end
|
131
|
+
|
132
|
+
def visit_ArelExtensions_Nodes_Repeat o, collector
|
133
|
+
collector << "REPEAT("
|
134
|
+
o.expressions.each_with_index { |arg, i|
|
135
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
136
|
+
collector = visit arg, collector
|
137
|
+
}
|
138
|
+
collector << ")"
|
139
|
+
collector
|
140
|
+
end
|
113
141
|
|
114
142
|
def visit_ArelExtensions_Nodes_FindInSet o, collector
|
115
143
|
collector << "FIND_IN_SET("
|
@@ -223,6 +251,15 @@ module ArelExtensions
|
|
223
251
|
|
224
252
|
#comparators
|
225
253
|
|
254
|
+
def visit_ArelExtensions_Nodes_Cast o, collector
|
255
|
+
collector << "CAST("
|
256
|
+
collector = visit o.left, collector
|
257
|
+
collector << " AS "
|
258
|
+
collector = visit o.right, collector
|
259
|
+
collector << ")"
|
260
|
+
collector
|
261
|
+
end
|
262
|
+
|
226
263
|
def visit_ArelExtensions_Nodes_Coalesce o, collector
|
227
264
|
collector << "COALESCE("
|
228
265
|
o.expressions.each_with_index { |arg, i|
|
@@ -434,7 +471,56 @@ module ArelExtensions
|
|
434
471
|
collector << "ELSE "
|
435
472
|
visit o.expr, collector
|
436
473
|
end
|
437
|
-
|
474
|
+
|
475
|
+
|
476
|
+
|
477
|
+
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
478
|
+
col = o.left
|
479
|
+
params = o.locale ? [o.precision,Arel::Nodes.build_quoted(o.locale)] : [o.precision]
|
480
|
+
sign = ArelExtensions::Nodes::Case.new.when(col<0).
|
481
|
+
then('-').
|
482
|
+
else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
|
483
|
+
sign_length = ArelExtensions::Nodes::Length.new([sign])
|
484
|
+
|
485
|
+
if o.scientific_notation
|
486
|
+
number = ArelExtensions::Nodes::Concat.new([
|
487
|
+
Arel::Nodes::NamedFunction.new('FORMAT',[
|
488
|
+
col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor)
|
489
|
+
]+params),
|
490
|
+
o.type,
|
491
|
+
Arel::Nodes::NamedFunction.new('FORMAT',[
|
492
|
+
col.abs.log10.floor,
|
493
|
+
0
|
494
|
+
])
|
495
|
+
])
|
496
|
+
else
|
497
|
+
number = Arel::Nodes::NamedFunction.new('FORMAT',[col.abs]+params)
|
498
|
+
end
|
499
|
+
|
500
|
+
repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
|
501
|
+
when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
|
502
|
+
then(Arel::Nodes.build_quoted(
|
503
|
+
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
504
|
+
).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
|
505
|
+
).
|
506
|
+
else('')
|
507
|
+
before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
508
|
+
middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
509
|
+
after = o.flags.include?('-') ? repeated_char : ''
|
510
|
+
full_number = col.when(0).then(0).else(
|
511
|
+
ArelExtensions::Nodes::Concat.new([
|
512
|
+
before,
|
513
|
+
sign,
|
514
|
+
middle,
|
515
|
+
number,
|
516
|
+
after
|
517
|
+
])
|
518
|
+
)
|
519
|
+
collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
|
520
|
+
|
521
|
+
collector
|
522
|
+
end
|
523
|
+
|
438
524
|
end
|
439
525
|
end
|
440
526
|
end
|
@@ -43,6 +43,9 @@ module ArelExtensions
|
|
43
43
|
compile(@price.abs + 42).must_be_like %{(ABS("products"."price") + 42)}
|
44
44
|
compile(@price.ceil + 42).must_be_like %{(CEIL("products"."price") + 42)}
|
45
45
|
compile(@price.floor + 42).must_be_like %{(FLOOR("products"."price") + 42)}
|
46
|
+
compile(@price.log10 + 42).must_be_like %{(LOG10("products"."price") + 42)}
|
47
|
+
compile(@price.power(42) + 42).must_be_like %{(POW("products"."price", 42) + 42)}
|
48
|
+
compile(@price.pow(42) + 42).must_be_like %{(POW("products"."price", 42) + 42)}
|
46
49
|
compile(@price.ceil + @price.floor).must_be_like %{(CEIL("products"."price") + FLOOR("products"."price"))}
|
47
50
|
compile((@price.ceil + @price.floor).abs).must_be_like %{ABS((CEIL("products"."price") + FLOOR("products"."price")))}
|
48
51
|
compile(@price.round + 42).must_be_like %{(ROUND("products"."price") + 42)}
|
@@ -110,11 +113,6 @@ module ArelExtensions
|
|
110
113
|
compile(c.idoes_not_match('%test%')).must_be_like %{"users"."name" NOT ILIKE '%test%'}
|
111
114
|
end
|
112
115
|
|
113
|
-
it "should accept comparators on functions" do
|
114
|
-
c = @table[:name]
|
115
|
-
#compile(c.soundex == 'test').must_be_like %{SOUNDEX("users"."name") = 'test'}
|
116
|
-
end
|
117
|
-
|
118
116
|
# Maths
|
119
117
|
# DateDiff
|
120
118
|
it "should diff date col and date" do
|
@@ -219,9 +217,6 @@ module ArelExtensions
|
|
219
217
|
|
220
218
|
end
|
221
219
|
|
222
|
-
|
223
|
-
puts "AREL VERSION : " + Arel::VERSION.to_s
|
224
|
-
|
225
220
|
# Case
|
226
221
|
it "should accept case clause" do
|
227
222
|
@table[:name].when("smith").then("cool").when("doe").then("fine").else("uncool").to_sql
|
@@ -233,9 +228,71 @@ module ArelExtensions
|
|
233
228
|
ArelExtensions::Nodes::Case.new(@table[:name]).when("smith").then(1).when("doe").then(2).else(0).to_sql
|
234
229
|
.must_be_like %{CASE "users"."name" WHEN 'smith' THEN 1 WHEN 'doe' THEN 2 ELSE 0 END}
|
235
230
|
@table[:name].when("smith").then(1).when("doe").then(2).else(0).sum.to_sql
|
236
|
-
.must_be_like %{SUM(CASE "users"."name" WHEN 'smith' THEN 1 WHEN 'doe' THEN 2 ELSE 0 END)}
|
231
|
+
.must_be_like %{SUM(CASE "users"."name" WHEN 'smith' THEN 1 WHEN 'doe' THEN 2 ELSE 0 END)}
|
232
|
+
@table[:name].when("smith").then("cool").else("uncool").matches('value',false).to_sql
|
233
|
+
.must_be_like %{CASE "users"."name" WHEN 'smith' THEN 'cool' ELSE 'uncool' END LIKE 'value'}
|
234
|
+
@table[:name].when("smith").then("cool").else("uncool").imatches('value',false).to_sql
|
235
|
+
.must_be_like %{CASE "users"."name" WHEN 'smith' THEN 'cool' ELSE 'uncool' END ILIKE 'value'}
|
237
236
|
end
|
238
|
-
|
237
|
+
|
238
|
+
|
239
|
+
it "should accept comparators on functions" do
|
240
|
+
c = @table[:name]
|
241
|
+
compile(c.soundex == 'test').must_be_like %{SOUNDEX("users"."name") = 'test'}
|
242
|
+
end
|
243
|
+
|
244
|
+
|
245
|
+
it "should accept in on select statement" do
|
246
|
+
c = @table[:name]
|
247
|
+
compile(c.in(@table.project(@table[:name])))
|
248
|
+
.must_be_like %{"users"."name" IN (SELECT "users"."name" FROM "users")}
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should accept coalesce function properly even on none actual tables and attributes" do
|
252
|
+
fake_at = Arel::Table.new('fake_table')
|
253
|
+
compile(fake_at['fake_attribute'].coalesce('other_value'))
|
254
|
+
.must_be_like %{COALESCE("fake_table"."fake_attribute", 'other_value')}
|
255
|
+
compile(fake_at['fake_attribute'].coalesce('other_value1','other_value2'))
|
256
|
+
.must_be_like %{COALESCE("fake_table"."fake_attribute", 'other_value1', 'other_value2')}
|
257
|
+
compile(fake_at['fake_attribute'].coalesce('other_value1').coalesce('other_value2'))
|
258
|
+
.must_be_like %{COALESCE(COALESCE("fake_table"."fake_attribute", 'other_value1'), 'other_value2')}
|
259
|
+
compile(fake_at['fake_attribute'].coalesce('other_value').matches('truc'))
|
260
|
+
.must_be_like %{COALESCE("fake_table"."fake_attribute", 'other_value') LIKE 'truc'}
|
261
|
+
compile(fake_at['fake_attribute'].coalesce('other_value').imatches('truc'))
|
262
|
+
.must_be_like %{COALESCE("fake_table"."fake_attribute", 'other_value') ILIKE 'truc'}
|
263
|
+
end
|
264
|
+
|
265
|
+
it "should be possible to cast nodes types" do
|
266
|
+
|
267
|
+
|
268
|
+
compile(@table[:id].cast_as_char)
|
269
|
+
.must_be_like %{CAST("users"."id" AS char)}
|
270
|
+
|
271
|
+
compile(@table[:id].cast('char'))
|
272
|
+
.must_be_like %{CAST("users"."id" AS char)}
|
273
|
+
|
274
|
+
compile(@table[:id].coalesce(' ').cast('char'))
|
275
|
+
.must_be_like %{CAST(COALESCE("users"."id", ' ') AS char)}
|
276
|
+
|
277
|
+
compile(@table[:id].coalesce(' ').cast(:string))
|
278
|
+
.must_be_like %{CAST(COALESCE("users"."id", ' ') AS char)}
|
279
|
+
|
280
|
+
compile(@table[:id].cast('char') + ' ')
|
281
|
+
.must_be_like %{CONCAT(CAST("users"."id" AS char), ' ')}
|
282
|
+
|
283
|
+
compile(@table[:id].cast('int') + 2)
|
284
|
+
.must_be_like %{(CAST("users"."id" AS int) + 2)}
|
285
|
+
|
286
|
+
end
|
287
|
+
|
288
|
+
|
289
|
+
it "should be possible to specify a cool format on number" do
|
290
|
+
#puts @price.format_number("$$ %+030.2e €€","fr_FR").to_sql
|
291
|
+
# compile(@price.format_number("$$ %+030.2e €€","fr_FR"))
|
292
|
+
# .must_be_like %{CONCAT('$$ ', CASE \"products\".\"price\" WHEN 0 THEN 0 ELSE CONCAT('', CASE WHEN \"products\".\"price\" < 0 THEN '-' ELSE '+' END, CASE WHEN (ABS(30) - (LENGTH(CONCAT(FORMAT(ABS(\"products\".\"price\") / POW(10, FLOOR(LOG10(ABS(\"products\".\"price\")))), 2, 'fr_FR'), 'e', FORMAT(FLOOR(LOG10(ABS(\"products\".\"price\"))), 0))) + LENGTH(CASE WHEN \"products\".\"price\" < 0 THEN '-' ELSE '+' END))) > 0 THEN REPEAT('0', (ABS(30) - (LENGTH(CONCAT(FORMAT(ABS(\"products\".\"price\") / POW(10, FLOOR(LOG10(ABS(\"products\".\"price\")))), 2, 'fr_FR'), 'e', FORMAT(FLOOR(LOG10(ABS(\"products\".\"price\"))), 0))) + LENGTH(CASE WHEN \"products\".\"price\" < 0 THEN '-' ELSE '+' END)))) ELSE '' END, CONCAT(FORMAT(ABS(\"products\".\"price\") / POW(10, FLOOR(LOG10(ABS(\"products\".\"price\")))), 2, 'fr_FR'), 'e', FORMAT(FLOOR(LOG10(ABS(\"products\".\"price\"))), 0)), '') END, ' €€')}
|
293
|
+
end
|
294
|
+
|
295
|
+
puts "AREL VERSION : " + Arel::VERSION.to_s
|
239
296
|
end
|
240
297
|
end
|
241
298
|
end
|
@@ -249,6 +249,7 @@ module ArelExtensions
|
|
249
249
|
skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
|
250
250
|
assert_equal "C540", t(@camille, @name.soundex)
|
251
251
|
assert_equal 8, User.where(@name.soundex.eq(@name.soundex)).count
|
252
|
+
assert_equal 8, User.where(@name.soundex == @name.soundex).count
|
252
253
|
end
|
253
254
|
|
254
255
|
def test_change_case
|
@@ -458,6 +459,25 @@ module ArelExtensions
|
|
458
459
|
def test_case
|
459
460
|
assert_equal 4, User.find_by_sql(@ut.project(@score.when(20.16).then(1).else(0).as('score_bin')).to_sql).sum(&:score_bin)
|
460
461
|
end
|
462
|
+
|
463
|
+
def test_format_numbers
|
464
|
+
#score of Arthur = 65.62
|
465
|
+
if @env_db == 'mysql'
|
466
|
+
assert_equal "AZERTY65,62" , t(@arthur, @score.format_number("AZERTY%.2f","fr_FR"))
|
467
|
+
assert_equal "65,62AZERTY" , t(@arthur, @score.format_number("%.2fAZERTY","fr_FR"))
|
468
|
+
assert_equal "$ 65.62 €" , t(@arthur, @score.format_number("$ %.2f €","en_EN"))
|
469
|
+
assert_equal "$ 0065,62 €" , t(@arthur, @score.format_number("$ %07.2f €","fr_FR"))
|
470
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-07.2f €","fr_FR"))
|
471
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-7.2f €","fr_FR"))
|
472
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ % 7.2f €","fr_FR"))
|
473
|
+
assert_equal "$ +65,62 €" , t(@arthur, @score.format_number("$ % +7.2f €","fr_FR"))
|
474
|
+
assert_equal "$ +065,62 €" , t(@arthur, @score.format_number("$ %0+7.2f €","fr_FR"))
|
475
|
+
assert_equal "$ 6,56e1 €" , t(@arthur, @score.format_number("$ %.2e €","fr_FR"))
|
476
|
+
assert_equal "$ 6,56E1 €" , t(@arthur, @score.format_number("$ %.2E €","fr_FR"))
|
477
|
+
assert_equal "Wrong Format" , t(@arthur, @score.format_number("$ %...234.6F €","fr_FR"))
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
461
481
|
|
462
482
|
end
|
463
483
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arel_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yann Azoury
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2018-
|
13
|
+
date: 2018-03-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: arel
|
@@ -123,6 +123,7 @@ files:
|
|
123
123
|
- lib/arel_extensions/nodes/as.rb
|
124
124
|
- lib/arel_extensions/nodes/blank.rb
|
125
125
|
- lib/arel_extensions/nodes/case.rb
|
126
|
+
- lib/arel_extensions/nodes/cast.rb
|
126
127
|
- lib/arel_extensions/nodes/ceil.rb
|
127
128
|
- lib/arel_extensions/nodes/change_case.rb
|
128
129
|
- lib/arel_extensions/nodes/coalesce.rb
|
@@ -132,12 +133,16 @@ files:
|
|
132
133
|
- lib/arel_extensions/nodes/find_in_set.rb
|
133
134
|
- lib/arel_extensions/nodes/floor.rb
|
134
135
|
- lib/arel_extensions/nodes/format.rb
|
136
|
+
- lib/arel_extensions/nodes/formatted_number.rb
|
135
137
|
- lib/arel_extensions/nodes/function.rb
|
136
138
|
- lib/arel_extensions/nodes/is_null.rb
|
137
139
|
- lib/arel_extensions/nodes/length.rb
|
138
140
|
- lib/arel_extensions/nodes/locate.rb
|
141
|
+
- lib/arel_extensions/nodes/log10.rb
|
139
142
|
- lib/arel_extensions/nodes/matches.rb
|
143
|
+
- lib/arel_extensions/nodes/power.rb
|
140
144
|
- lib/arel_extensions/nodes/rand.rb
|
145
|
+
- lib/arel_extensions/nodes/repeat.rb
|
141
146
|
- lib/arel_extensions/nodes/replace.rb
|
142
147
|
- lib/arel_extensions/nodes/round.rb
|
143
148
|
- lib/arel_extensions/nodes/soundex.rb
|