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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 58c1aae3ae3a6a0fc2eaa5a0a6f326598ce9cdb9
4
- data.tar.gz: bc5045b83e88945ace55aab03791cd1997924765
3
+ metadata.gz: 4c1d336c78c19529b6d63bfcf9e171317a5bcd3f
4
+ data.tar.gz: ee3c8e102bfb81520190fa0f122f24623fe45752
5
5
  SHA512:
6
- metadata.gz: e645c998d46403e34b278267fa9eb65e72a572e5a9549e223a4594c53ceb125fc3b083eb2a048376817e7a7f058c3abf73ce5dab7cc5329243985f601a2b68bc
7
- data.tar.gz: 22d240df3c8ac60d22ca2ba57851af9792b2a33e341e1dd07d1c5bcf3ecd601cd3d3f53d9999587466bd90489b35064f98979af6a584bfd368ee44757ebdf00b
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
@@ -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
@@ -6,10 +6,10 @@ module Mv
6
6
  module Builder
7
7
  module Trigger
8
8
  class Absence < Mv::Core::Validation::Builder::Absence
9
- include TriggerColumn
9
+ include TriggerColumn
10
10
  end
11
11
  end
12
12
  end
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -6,10 +6,10 @@ module Mv
6
6
  module Builder
7
7
  module Trigger
8
8
  class Custom < Mv::Core::Validation::Builder::Custom
9
- include TriggerColumn
9
+ include TriggerColumn
10
10
  end
11
11
  end
12
12
  end
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -1,4 +1,4 @@
1
- require 'mv/sqlite/validation/builder/trigger/mysql_datetime_values'
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 MysqlDatetimeValues
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/mysql_datetime_values'
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 MysqlDatetimeValues
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
@@ -6,10 +6,10 @@ module Mv
6
6
  module Builder
7
7
  module Trigger
8
8
  class Presence < Mv::Core::Validation::Builder::Presence
9
- include TriggerColumn
9
+ include TriggerColumn
10
10
  end
11
11
  end
12
12
  end
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -3,9 +3,9 @@ module Mv
3
3
  module Validation
4
4
  module Builder
5
5
  module Trigger
6
- module MysqlDatetimeValues
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
@@ -5,13 +5,13 @@ module Mv
5
5
  module Trigger
6
6
  module TriggerColumn
7
7
  protected
8
-
8
+
9
9
  def column_reference
10
10
  "NEW.#{super}"
11
- end
11
+ end
12
12
  end
13
13
  end
14
14
  end
15
15
  end
16
16
  end
17
- end
17
+ end
@@ -6,10 +6,10 @@ module Mv
6
6
  module Builder
7
7
  module Trigger
8
8
  class Uniqueness < Mv::Core::Validation::Builder::Uniqueness
9
- include TriggerColumn
9
+ include TriggerColumn
10
10
  end
11
11
  end
12
12
  end
13
13
  end
14
14
  end
15
- end
15
+ 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.1
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-05-29 00:00:00.000000000 Z
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