mv-sqlite 2.2.1 → 2.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +95 -0
- data/lib/mv/sqlite/active_record/connection_adapters/sqlite3_adapter_decorator.rb +9 -1
- data/lib/mv/sqlite/loader.rb +16 -0
- data/lib/mv/sqlite/services/create_regexp_function.rb +19 -0
- data/lib/mv/sqlite/validation/active_model_presenter/format.rb +17 -0
- data/lib/mv/sqlite/validation/builder/format.rb +34 -0
- data/lib/mv/sqlite/validation/builder/trigger/absence.rb +2 -2
- data/lib/mv/sqlite/validation/builder/trigger/custom.rb +2 -2
- data/lib/mv/sqlite/validation/builder/trigger/exclusion.rb +3 -3
- data/lib/mv/sqlite/validation/builder/trigger/format.rb +16 -0
- data/lib/mv/sqlite/validation/builder/trigger/inclusion.rb +3 -3
- data/lib/mv/sqlite/validation/builder/trigger/presence.rb +2 -2
- data/lib/mv/sqlite/validation/builder/trigger/{mysql_datetime_values.rb → sqlite_datetime_values.rb} +3 -3
- data/lib/mv/sqlite/validation/builder/trigger/trigger_column.rb +3 -3
- data/lib/mv/sqlite/validation/builder/trigger/uniqueness.rb +2 -2
- data/lib/mv/sqlite/validation/format.rb +23 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c1d336c78c19529b6d63bfcf9e171317a5bcd3f
|
4
|
+
data.tar.gz: ee3c8e102bfb81520190fa0f122f24623fe45752
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdb0c7946a01247e8218ce9b68fcf4f1fb31ec924e20cbd73a82b4c9832d42b631d9c3d125b85b7ac9117c3b4f246b3d7828cee938c12087b965bca6dd3510c9
|
7
|
+
data.tar.gz: f14e20bcb40b4241121a06ba7e5c6bfda7bb8c1b0d2ab1189c6b72d6a30cf717c594fb3edd0d72c7a9f5f9c999cc697c2812aeae8700ba6c30ff0aaf78bcfd36
|
data/README.md
CHANGED
@@ -14,6 +14,7 @@ Define validations directly in DB as SQLite constraints and integrate them into
|
|
14
14
|
* [exclusion](#exclusion)
|
15
15
|
* [presence](#presence)
|
16
16
|
* [absence](#absence)
|
17
|
+
* [format](#format)
|
17
18
|
* [custom](#custom)
|
18
19
|
* [Version History](#version history)
|
19
20
|
* [Contributing](#contributing)
|
@@ -538,6 +539,100 @@ Define validations directly in DB as SQLite constraints and integrate them into
|
|
538
539
|
* `allow_blank` - ignore validation for blank values. Default value: `true`
|
539
540
|
* `as` - defines the way how constraint will be implemented. Possible values: `[:trigger]` Default value: `:trigger`
|
540
541
|
|
542
|
+
### format
|
543
|
+
|
544
|
+
**WARNING** ```SQLite``` does NOT have default ```REGEXP``` implementation. ```mv-sqlite``` contains own implementation that is available with active record connection only. In other words everything should be ok if you access database from withing rails console or rails application or other application that uses ```activerecord``` internally. But not defined function error will be thrown when you access database direclty. You can build ```SQLite``` ```ICU``` extension to enable native ```SQLite``` ```REGEXP```. See details here: http://www.sqlite.org/src/artifact?ci=trunk&filename=ext/icu/README.txt.
|
545
|
+
|
546
|
+
Examples:
|
547
|
+
|
548
|
+
allows only values that contains 'word' inside:
|
549
|
+
|
550
|
+
```ruby
|
551
|
+
def up
|
552
|
+
validates :table_name, :column_name, format: { with: /word/ }
|
553
|
+
end
|
554
|
+
|
555
|
+
def down
|
556
|
+
validates :table_name, :column_name, format: false
|
557
|
+
end
|
558
|
+
```
|
559
|
+
|
560
|
+
with failure message:
|
561
|
+
|
562
|
+
```ruby
|
563
|
+
def up
|
564
|
+
validates :table_name, :column_name,
|
565
|
+
format: { with: /word/,
|
566
|
+
message: 'Column_name value should contain start word' }
|
567
|
+
end
|
568
|
+
|
569
|
+
def down
|
570
|
+
validates :table_name, :column_name, format: false
|
571
|
+
end
|
572
|
+
```
|
573
|
+
|
574
|
+
implemented as trigger:
|
575
|
+
|
576
|
+
```ruby
|
577
|
+
def up
|
578
|
+
validates :table_name, :column_name,
|
579
|
+
format: { with: /word/,
|
580
|
+
message: 'Column_name value should contain start word',
|
581
|
+
as: :trigger }
|
582
|
+
end
|
583
|
+
|
584
|
+
def down
|
585
|
+
validates :table_name, :column_name, format: false
|
586
|
+
end
|
587
|
+
```
|
588
|
+
|
589
|
+
all above are available in a create and change table blocks:
|
590
|
+
|
591
|
+
```ruby
|
592
|
+
def change
|
593
|
+
create_table :table_name do |t|
|
594
|
+
t.string :column_name, validates { format: { with: /word/ } }
|
595
|
+
end
|
596
|
+
end
|
597
|
+
```
|
598
|
+
|
599
|
+
```ruby
|
600
|
+
def up
|
601
|
+
change :table_name do |t|
|
602
|
+
t.change :column_name, :string, validates: { format: { with: /word/ } }
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
def down
|
607
|
+
change :table_name do |t|
|
608
|
+
t.change :column_name, :string, validates: { format: false }
|
609
|
+
end
|
610
|
+
end
|
611
|
+
```
|
612
|
+
|
613
|
+
simplifications (version >= 2.1 is required):
|
614
|
+
|
615
|
+
```ruby
|
616
|
+
def change
|
617
|
+
create_table :table_name do |t|
|
618
|
+
t.string :contains_word, format: /word/
|
619
|
+
t.string :contains_word_in_trigger, format: { with: /word/,
|
620
|
+
as: :trigger }
|
621
|
+
end
|
622
|
+
end
|
623
|
+
```
|
624
|
+
|
625
|
+
Options:
|
626
|
+
|
627
|
+
* `with` - regular expression that column value should be matched to
|
628
|
+
* `message` - message that should be shown if validation failed
|
629
|
+
* `on` - validation event. Possible values `[:save, :update, :create]`. Ignored unless `:as == :trigger`. Default value: `:save`
|
630
|
+
* `create_tigger_name` - Name of the 'before insert' trigger that will be created if `:as == :trigger` && `:on` in `[:save, :create]`
|
631
|
+
* `update_tigger_name` - Name of the 'before update' trigger that will be created if `:as == :trigger` && `:on` in `[:save, :update]`
|
632
|
+
* `allow_nil` - ignore validation for `nil` values. Default value: `false`
|
633
|
+
* `allow_blank` - ignore validation for blank values. Default value: `false`
|
634
|
+
* `as` - defines the way how constraint will be implemented. Possible values: `[:trigger]` Default value: `:trigger`
|
635
|
+
|
541
636
|
### custom
|
542
637
|
|
543
638
|
(version >= 2.1 is required)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'mv/sqlite/services/create_regexp_function'
|
2
|
+
|
1
3
|
module Mv
|
2
4
|
module Sqlite
|
3
5
|
module ActiveRecord
|
@@ -5,6 +7,12 @@ module Mv
|
|
5
7
|
module Sqlite3AdapterDecorator
|
6
8
|
include Mv::Core::ActiveRecord::ConnectionAdapters::AbstractAdapterDecorator
|
7
9
|
|
10
|
+
def initialize(connection, *args)
|
11
|
+
super
|
12
|
+
|
13
|
+
Mv::Sqlite::Services::CreateRegexpFunction.new(connection).execute
|
14
|
+
end
|
15
|
+
|
8
16
|
protected
|
9
17
|
|
10
18
|
def alter_table(table_name, options = {})
|
@@ -16,4 +24,4 @@ module Mv
|
|
16
24
|
end
|
17
25
|
end
|
18
26
|
end
|
19
|
-
end
|
27
|
+
end
|
data/lib/mv/sqlite/loader.rb
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
require 'mv/sqlite/constraint/builder/trigger'
|
2
2
|
|
3
|
+
require 'mv/sqlite/validation/format'
|
4
|
+
|
3
5
|
require 'mv/sqlite/validation/builder/trigger/exclusion'
|
4
6
|
require 'mv/sqlite/validation/builder/trigger/inclusion'
|
5
7
|
require 'mv/sqlite/validation/builder/trigger/length'
|
6
8
|
require 'mv/sqlite/validation/builder/trigger/presence'
|
7
9
|
require 'mv/sqlite/validation/builder/trigger/absence'
|
8
10
|
require 'mv/sqlite/validation/builder/trigger/uniqueness'
|
11
|
+
require 'mv/sqlite/validation/builder/trigger/format'
|
9
12
|
require 'mv/sqlite/validation/builder/trigger/custom'
|
10
13
|
|
14
|
+
require 'mv/sqlite/validation/active_model_presenter/format'
|
15
|
+
|
11
16
|
require 'mv/sqlite/active_record/connection_adapters/sqlite3_adapter_decorator'
|
12
17
|
|
13
18
|
#constraint builders
|
@@ -15,6 +20,11 @@ Mv::Core::Constraint::Builder::Factory.register_builders(
|
|
15
20
|
Mv::Core::Constraint::Trigger => Mv::Sqlite::Constraint::Builder::Trigger,
|
16
21
|
)
|
17
22
|
|
23
|
+
#validations
|
24
|
+
Mv::Core::Validation::Factory.register_validations(
|
25
|
+
format: Mv::Sqlite::Validation::Format
|
26
|
+
)
|
27
|
+
|
18
28
|
#validation builders in trigger
|
19
29
|
Mv::Sqlite::Constraint::Builder::Trigger.validation_builders_factory.register_builders(
|
20
30
|
Mv::Core::Validation::Exclusion => Mv::Sqlite::Validation::Builder::Trigger::Exclusion,
|
@@ -23,9 +33,15 @@ Mv::Sqlite::Constraint::Builder::Trigger.validation_builders_factory.register_bu
|
|
23
33
|
Mv::Core::Validation::Presence => Mv::Sqlite::Validation::Builder::Trigger::Presence,
|
24
34
|
Mv::Core::Validation::Absence => Mv::Sqlite::Validation::Builder::Trigger::Absence,
|
25
35
|
Mv::Core::Validation::Uniqueness => Mv::Sqlite::Validation::Builder::Trigger::Uniqueness,
|
36
|
+
Mv::Sqlite::Validation::Format => Mv::Sqlite::Validation::Builder::Trigger::Format,
|
26
37
|
Mv::Core::Validation::Custom => Mv::Sqlite::Validation::Builder::Trigger::Custom
|
27
38
|
)
|
28
39
|
|
40
|
+
#validation active model presenters
|
41
|
+
Mv::Core::Validation::ActiveModelPresenter::Factory.register_presenters(
|
42
|
+
Mv::Sqlite::Validation::Format => Mv::Sqlite::Validation::ActiveModelPresenter::Format
|
43
|
+
)
|
44
|
+
|
29
45
|
::ActiveRecord::ConnectionAdapters::SQLite3Adapter.send(
|
30
46
|
:prepend,
|
31
47
|
Mv::Sqlite::ActiveRecord::ConnectionAdapters::Sqlite3AdapterDecorator
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Mv
|
2
|
+
module Sqlite
|
3
|
+
module Services
|
4
|
+
class CreateRegexpFunction
|
5
|
+
attr_reader :connection
|
6
|
+
|
7
|
+
def initialize(connection)
|
8
|
+
@connection = connection
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
connection.create_function( 'REGEXP', 2 ) do |func, pattern, expression|
|
13
|
+
func.result = expression =~ Regexp.new(pattern.to_s, Regexp::IGNORECASE) ? 1 : 0
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Mv
|
2
|
+
module Sqlite
|
3
|
+
module Validation
|
4
|
+
module ActiveModelPresenter
|
5
|
+
class Format < Mv::Core::Validation::ActiveModelPresenter::Base
|
6
|
+
def option_names
|
7
|
+
super + [:with]
|
8
|
+
end
|
9
|
+
|
10
|
+
def validation_name
|
11
|
+
:format
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Mv
|
2
|
+
module Sqlite
|
3
|
+
module Validation
|
4
|
+
module Builder
|
5
|
+
class Format < Mv::Core::Validation::Builder::Base
|
6
|
+
delegate :with, to: :validation
|
7
|
+
|
8
|
+
def conditions
|
9
|
+
[{
|
10
|
+
statement: apply_allow_nil_and_blank(apply_with(column_reference)),
|
11
|
+
message: message
|
12
|
+
}]
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def db_value value
|
18
|
+
return "'#{value.source}'" if value.is_a?(Regexp)
|
19
|
+
return "'#{value.to_s}'" if value.is_a?(String)
|
20
|
+
raise Mv::Core::Error.new(table_name: table_name,
|
21
|
+
column_name: column_name,
|
22
|
+
validation_type: :inclusion,
|
23
|
+
options: { in: value },
|
24
|
+
error: "#{value.class} is not supported as :with value")
|
25
|
+
end
|
26
|
+
|
27
|
+
def apply_with stmt
|
28
|
+
"#{stmt} REGEXP #{db_value(with)}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'mv/sqlite/validation/builder/trigger/
|
1
|
+
require 'mv/sqlite/validation/builder/trigger/sqlite_datetime_values'
|
2
2
|
require 'mv/sqlite/validation/builder/trigger/trigger_column'
|
3
3
|
|
4
4
|
module Mv
|
@@ -7,11 +7,11 @@ module Mv
|
|
7
7
|
module Builder
|
8
8
|
module Trigger
|
9
9
|
class Exclusion < Mv::Core::Validation::Builder::Exclusion
|
10
|
-
include
|
10
|
+
include SqliteDatetimeValues
|
11
11
|
include TriggerColumn
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
|
-
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'mv/sqlite/validation/builder/format'
|
2
|
+
require 'mv/sqlite/validation/builder/trigger/trigger_column'
|
3
|
+
|
4
|
+
module Mv
|
5
|
+
module Sqlite
|
6
|
+
module Validation
|
7
|
+
module Builder
|
8
|
+
module Trigger
|
9
|
+
class Format < Mv::Sqlite::Validation::Builder::Format
|
10
|
+
include TriggerColumn
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'mv/sqlite/validation/builder/trigger/
|
1
|
+
require 'mv/sqlite/validation/builder/trigger/sqlite_datetime_values'
|
2
2
|
require 'mv/sqlite/validation/builder/trigger/trigger_column'
|
3
3
|
|
4
4
|
module Mv
|
@@ -7,11 +7,11 @@ module Mv
|
|
7
7
|
module Builder
|
8
8
|
module Trigger
|
9
9
|
class Inclusion < Mv::Core::Validation::Builder::Inclusion
|
10
|
-
include
|
10
|
+
include SqliteDatetimeValues
|
11
11
|
include TriggerColumn
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
|
-
end
|
17
|
+
end
|
data/lib/mv/sqlite/validation/builder/trigger/{mysql_datetime_values.rb → sqlite_datetime_values.rb}
RENAMED
@@ -3,9 +3,9 @@ module Mv
|
|
3
3
|
module Validation
|
4
4
|
module Builder
|
5
5
|
module Trigger
|
6
|
-
module
|
6
|
+
module SqliteDatetimeValues
|
7
7
|
protected
|
8
|
-
|
8
|
+
|
9
9
|
def db_value value
|
10
10
|
return "datetime('#{value.strftime('%Y-%m-%d %H:%M:%S')}')" if value.is_a?(DateTime)
|
11
11
|
return "datetime('#{value.strftime('%Y-%m-%d %H:%M:%S')}')" if value.is_a?(Time)
|
@@ -17,4 +17,4 @@ module Mv
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
|
-
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Mv
|
2
|
+
module Sqlite
|
3
|
+
module Validation
|
4
|
+
class Format < Mv::Core::Validation::Base
|
5
|
+
attr_reader :with
|
6
|
+
|
7
|
+
validates :with, presence: true
|
8
|
+
|
9
|
+
def initialize(table_name, column_name, opts)
|
10
|
+
opts = { with: opts } unless opts.is_a?(Hash)
|
11
|
+
|
12
|
+
super(table_name, column_name, opts)
|
13
|
+
|
14
|
+
@with = opts.with_indifferent_access[:with]
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_a
|
18
|
+
super + [with.to_s]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mv-sqlite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Valeriy Prokopchuk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -123,15 +123,20 @@ files:
|
|
123
123
|
- lib/mv/sqlite/constraint/builder/trigger.rb
|
124
124
|
- lib/mv/sqlite/loader.rb
|
125
125
|
- lib/mv/sqlite/railtie.rb
|
126
|
+
- lib/mv/sqlite/services/create_regexp_function.rb
|
127
|
+
- lib/mv/sqlite/validation/active_model_presenter/format.rb
|
128
|
+
- lib/mv/sqlite/validation/builder/format.rb
|
126
129
|
- lib/mv/sqlite/validation/builder/trigger/absence.rb
|
127
130
|
- lib/mv/sqlite/validation/builder/trigger/custom.rb
|
128
131
|
- lib/mv/sqlite/validation/builder/trigger/exclusion.rb
|
132
|
+
- lib/mv/sqlite/validation/builder/trigger/format.rb
|
129
133
|
- lib/mv/sqlite/validation/builder/trigger/inclusion.rb
|
130
134
|
- lib/mv/sqlite/validation/builder/trigger/length.rb
|
131
|
-
- lib/mv/sqlite/validation/builder/trigger/mysql_datetime_values.rb
|
132
135
|
- lib/mv/sqlite/validation/builder/trigger/presence.rb
|
136
|
+
- lib/mv/sqlite/validation/builder/trigger/sqlite_datetime_values.rb
|
133
137
|
- lib/mv/sqlite/validation/builder/trigger/trigger_column.rb
|
134
138
|
- lib/mv/sqlite/validation/builder/trigger/uniqueness.rb
|
139
|
+
- lib/mv/sqlite/validation/format.rb
|
135
140
|
homepage: http://github.com/vprokopchuk256/mv-sqlite
|
136
141
|
licenses:
|
137
142
|
- MIT
|