typero 0.5.2 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3abfc7ee1372098804789576ac4fb36dbfb33a2cce2e48cd2dda70b975a2a1f6
4
- data.tar.gz: 9ed9618bde6dd268b39f516428c63c07a3aa86006323a0dd0b231a421e6a4c68
3
+ metadata.gz: 448ffb9631eeb66159f13e45da0e28e600f91f3ed58684789740f2ad351a317b
4
+ data.tar.gz: 41feafdf4c139e47c02dc71c0c5dbdea154b6e75e0b8a746e1b7f41c6beb89d6
5
5
  SHA512:
6
- metadata.gz: 3ab235a93802052f17166cf1bda8a3cd75ee20def1c669c9b5ccf7bb4d7633ae2ddffec6cc01f57e3bf2c98aaf652731a1deb7c2450e658da76ae8092e3790a1
7
- data.tar.gz: 4430507594bdecbb95aff494ed0e8dc1a71d22111abecafec19a801d3d4445d1a32dfe5fd861b330515d7b63ba0a9867d53e088e1c2a3d206b13cf9147a09cd1
6
+ metadata.gz: 28c28657d7a0c7c5e71b5cfac08eb314a857c9b4e01337666ab38f65c64aa99f1c07a56d3276f8446e0134bc28968b7b34fb13232769c97ed01c6847cdab657e
7
+ data.tar.gz: 65f56f37df4731adad738862fdb79ed540bdd22a3a85744f519370e4ae5d905bafa74ab4720d17d6916c068a4f9508225d20cde64a6735c29a9f9e978a9ef145
data/.version CHANGED
@@ -1 +1 @@
1
- 0.5.2
1
+ 0.7.0
@@ -1,19 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'typero'
4
-
5
3
  module Sequel::Plugins::TyperoAttributes
6
4
  module ClassMethods
7
- def attributes opts={}, &block
8
- instance_variable_set :@typero, Typero.new(&block)
9
-
10
- # attributes migrate: true do ...
11
- AutoMigrate.typero to_s.tableize.to_sym if opts[:migrate] && Lux.config.migrate
12
- end
13
-
14
- def typero
15
- instance_variable_get :@typero
16
- end
5
+ attr_accessor :typero
17
6
  end
18
7
 
19
8
  module InstanceMethods
@@ -27,6 +16,8 @@ module Sequel::Plugins::TyperoAttributes
27
16
 
28
17
  # this are rules unique to database, so we check them here
29
18
  typero.rules.each do |field, rule|
19
+ self[field] ||= {} if rule[:type] == 'hash'
20
+
30
21
  # check uniqe fields
31
22
  if rule[:unique]
32
23
  id = self[:id] || 0
@@ -1,193 +1,9 @@
1
- # rules = Typero.new do
2
- # set :name, String, req: true
3
- # set :email, :email, req: true
4
- # set :skills, [:email], min: 2
5
- # end
6
- #
7
- # or
8
- #
9
- # rules = Typero.new do
10
- # string :name, req: true
11
- # email :email, req: true
12
- # email [:skills], min: 2
13
- # end
14
- #
15
- # errors = rules.validate @object
16
- # rules.valid?
17
- # rules.validate(@object) { |errors| ... }
18
-
19
- class Typero
20
- attr_reader :rules
21
-
22
- VERSION = File.read File.expand_path '../.version', File.dirname(__FILE__)
23
-
24
- class << self
25
- # validate single value in type
26
- def validate type, value, opts={}
27
- field = type.to_s.tableize.singularize.to_sym
28
-
29
- # we need to have pointer to hash, so value can be changed (coerced) if needed
30
- h = { field => value }
31
-
32
- rule = new
33
- rule.set field, type, opts
34
-
35
- if error = rule.validate(h)[field]
36
- block_given? ? yield(error) : raise(TypeError.new(error))
37
- end
38
-
39
- h[field]
40
- end
41
-
42
- # check and coerce value
43
- # Typero.set(:label, 'Foo bar') -> "foo-bar"
44
- def set type, value, opts={}
45
- check = Typero::Type.load(type).new value, opts
46
- check.value
47
- end
48
- end
49
-
50
- ###
51
-
52
- # accepts dsl block to
53
- def initialize hash={}, &block
54
- @rules = {}
55
- @db = []
56
- hash.each { |k, v| set(k, v) }
57
- instance_exec &block if block
58
- end
59
-
60
- # validates any instance object or object with hash variable interface
61
- # it also coarces values
62
- def validate instance
63
- @errors = {}
64
-
65
- @rules.each do |field, opts|
66
- # set value to default if value is blank and default given
67
- instance[field] = opts[:default] if opts[:default] && instance[field].blank?
68
-
69
- # get field value
70
- value = instance[field]
71
-
72
- if value.present?
73
- klass = 'Typero::%sType' % safe_type(opts[:type])
74
- check = klass.constantize.new value, opts
75
- check.value = check.default if check.value.nil?
76
-
77
- unless check.value.nil?
78
- begin
79
- check.set
80
- check.validate
81
- instance[field] = check.value
82
- rescue TypeError => e
83
- add_error field, e.message
84
- end
85
- end
86
- elsif opts[:required]
87
- msg = opts[:required].class == TrueClass ? 'is required' : opts[:req]
88
- add_error field, msg
89
- end
90
- end
91
-
92
- if @errors.keys.length > 0 && block_given?
93
- @errors.each { |k,v| yield(k, v) }
94
- end
95
-
96
- @errors
97
- end
98
-
99
- def valid? instance
100
- errors = validate instance
101
- errors.keys.length == 0
102
- end
103
-
104
- # returns field, db_type, db_opts
105
- def db_schema
106
- out = @rules.inject([]) do |total, (field, opts)|
107
- type, opts = Typero::Type.load(opts[:type]).new(nil, opts).db_field
108
- total << [type, field, opts]
109
- end
110
-
111
- out += @db if @db[0]
112
-
113
- out
114
- end
115
-
116
- private
117
-
118
- # adds error to array or prefixes with field name
119
- def add_error field, msg
120
- if @errors[field]
121
- @errors[field] += ', %s' % msg
122
- else
123
- if msg[0,1].downcase == msg[0,1]
124
- field_name = field.to_s.sub(/_id$/,'').humanize
125
- msg = '%s %s' % [field_name, msg]
126
- end
127
-
128
- @errors[field] = msg
129
- end
130
- end
131
-
132
- # used in dsl to define value
133
- def set field, type=String, opts={}
134
- opts = type.is_a?(Hash) ? type : opts.merge(type: type)
135
- opts[:type] ||= :string
136
- opts[:req] = true if opts[:null].class == FalseClass
137
- klass = Typero::Type.load opts[:type]
138
- @rules[field] = parse_option opts
139
- end
140
-
141
- def safe_type type
142
- type.to_s.gsub(/[^\w]/,'').classify
143
- end
144
-
145
- # coerce opts values
146
- def parse_option opts
147
- opts[:type] ||= 'string'
148
-
149
- if opts[:type].is_a?(Array)
150
- opts[:array_type] = opts[:type][0] if opts[:type][0]
151
- opts[:type] = 'array'
152
- end
153
-
154
- opts[:type] = opts[:type].to_s.downcase
155
-
156
- opts[:required] = opts.delete(:req) unless opts[:req].nil?
157
- opts[:unique] = opts.delete(:uniq) unless opts[:uniq].nil?
158
- opts[:description] = opts.delete(:desc) unless opts[:desc].nil?
159
-
160
- opts
161
- end
162
-
163
-
164
- # pass values for db_schema only
165
- # db :timestamps
166
- # db :add_index, :code -> t.add_index :code
167
- def db *args
168
- @db.push args
169
- end
170
-
171
- # set :age, type: :integer -> integer :age
172
- # email :email
173
- # set :email, [:emails]
174
- # email [:emails]
175
- def method_missing name, *args, &block
176
- field = args.shift
177
-
178
- if field.class == Array
179
- field = field.first
180
- name = [name]
181
- end
182
-
183
- name = args.shift if name == :set
184
-
185
- set field, type=name, *args
186
- end
187
- end
188
-
1
+ # base libs
2
+ require_relative 'typero/typero'
3
+ require_relative 'typero/schema'
189
4
  require_relative 'typero/type'
190
5
 
6
+ # checker types
191
7
  Dir['%s/typero/type/*.rb' % __dir__].each do |file|
192
8
  require file
193
9
  end
@@ -0,0 +1,84 @@
1
+ # Base class for schema validation
2
+
3
+ class Typero
4
+ class Schema
5
+ attr_reader :rules, :db_rules
6
+
7
+ def initialize &block
8
+ @db_rules = []
9
+ @rules = {}
10
+ instance_exec &block
11
+ end
12
+
13
+ private
14
+
15
+ # used in dsl to define value
16
+ def set field, type=String, opts={}
17
+ raise "Field name not given (Typero)" unless field
18
+
19
+ field = field.to_sym
20
+ opts = type.is_a?(Hash) ? type : opts.merge(type: type)
21
+ opts[:type] ||= :string
22
+ opts[:required] = true if opts[:null].class == FalseClass
23
+
24
+ db :add_index, field if opts.delete(:index)
25
+
26
+ klass = Typero::Type.load opts[:type]
27
+ @rules[field] = parse_option opts
28
+ end
29
+
30
+ # coerce opts values
31
+ def parse_option opts
32
+ opts[:type] ||= 'string'
33
+
34
+ if opts[:type].is_a?(Array)
35
+ opts[:array_type] = opts[:type][0] if opts[:type][0]
36
+ opts[:type] = 'array'
37
+ end
38
+
39
+ opts[:type] = opts[:type].to_s.downcase
40
+
41
+ opts[:required] = opts.delete(:req) unless opts[:req].nil?
42
+ opts[:unique] = opts.delete(:uniq) unless opts[:uniq].nil?
43
+ opts[:description] = opts.delete(:desc) unless opts[:desc].nil?
44
+
45
+ opts
46
+ end
47
+
48
+ # pass values for db_schema only
49
+ # db :timestamps
50
+ # db :add_index, :code -> t.add_index :code
51
+ def db *args
52
+ @db_rules.push args
53
+ end
54
+
55
+ def link klass, opts={}
56
+ klass.is! Class
57
+
58
+ # TODO: Add can? update check before save
59
+ integer '%s_id' % klass.to_s.tableize.singularize, opts
60
+ end
61
+
62
+ def hash name
63
+ set name, :hash
64
+ end
65
+
66
+ # set :age, type: :integer -> integer :age
67
+ # email :email
68
+ # set :email, [:emails]
69
+ # email [:emails]
70
+ def method_missing name, *args, &block
71
+ field = args.shift
72
+
73
+ if field.class == Array
74
+ field = field.first
75
+ name = [name]
76
+ end
77
+
78
+ name = args.shift if name == :set
79
+
80
+ set field, type=name, *args
81
+ end
82
+
83
+ end
84
+ end
@@ -1,31 +1,42 @@
1
- class Typero::Type
2
- attr_accessor :opts
3
- attr_accessor :value
4
-
5
- def self.load name
6
- klass = 'Typero::%sType' % name.to_s.gsub(/[^\w]/,'').classify
7
- klass.constantize
8
- end
9
-
10
- ###
11
-
12
- def initialize value, opts={}
13
- @value = value
14
- @opts = opts
15
- end
16
-
17
- # default validation for any type
18
- def validate
19
- true
20
- end
21
-
22
- # get error from option or the default one
23
- def error_for name
24
- @opts[name] || send(name)
25
- end
26
-
27
- def default
28
- nil
1
+ # Master class
2
+
3
+ class Typero
4
+ class Type
5
+ attr_accessor :opts
6
+ attr_accessor :value
7
+
8
+ class << self
9
+ def load name
10
+ klass = 'Typero::%sType' % name.to_s.gsub(/[^\w]/,'').classify
11
+
12
+ if const_defined? klass
13
+ klass.constantize
14
+ else
15
+ raise ArgumentError, 'Typero type "%s" is not defined (%s)' % [name, klass]
16
+ end
17
+ end
18
+ end
19
+
20
+ ###
21
+
22
+ def initialize value, opts={}
23
+ @value = value
24
+ @opts = opts
25
+ end
26
+
27
+ # default validation for any type
28
+ def validate
29
+ true
30
+ end
31
+
32
+ # get error from option or the default one
33
+ def error_for name
34
+ @opts[name] || send(name)
35
+ end
36
+
37
+ def default
38
+ nil
39
+ end
29
40
  end
30
41
  end
31
42
 
@@ -27,8 +27,8 @@ class Typero::ArrayType < Typero::Type
27
27
  end
28
28
 
29
29
  def validate
30
- raise TypeError, error_for(:min_length) % @opts[:min] if @opts[:min] && @value.length < @opts[:min]
31
- raise TypeError, error_for(:max_length) % @opts[:max] if @opts[:max] && @value.length > @opts[:max]
30
+ raise TypeError, error_for(:min_error) % @opts[:min] if @opts[:min] && @value.length < @opts[:min]
31
+ raise TypeError, error_for(:max_error) % @opts[:max] if @opts[:max] && @value.length > @opts[:max]
32
32
  true
33
33
  end
34
34
 
@@ -2,5 +2,9 @@ class Typero::DateType < Typero::Type
2
2
  def set
3
3
  @value = @value.to_s.downcase.gsub(/[^\d\-\.\s]/, '')
4
4
  end
5
+
6
+ def db_field
7
+ [:date, {}]
8
+ end
5
9
  end
6
10
 
@@ -2,5 +2,9 @@ class Typero::DatetimeType < Typero::Type
2
2
  def set
3
3
  @value = @value.to_s.downcase.gsub(/[^\d\-\.\s\:]/, '')
4
4
  end
5
+
6
+ def db_field
7
+ [:datetime, {}]
8
+ end
5
9
  end
6
10
 
@@ -20,7 +20,7 @@ class Typero::EmailType < Typero::Type
20
20
  def db_field
21
21
  opts = {}
22
22
  opts[:limit] = @opts[:max] || 120
23
- opts[:null] = false if @opts[:req]
23
+ opts[:null] = false if @opts[:required]
24
24
  [:string, opts]
25
25
  end
26
26
  end
@@ -19,7 +19,7 @@ class Typero::FloatType < Typero::Type
19
19
 
20
20
  def db_field
21
21
  opts = {}
22
- opts[:null] = false if @opts[:req]
22
+ opts[:null] = false if @opts[:required]
23
23
  [:float, opts]
24
24
  end
25
25
 
@@ -3,6 +3,10 @@ class Typero::HashType < Typero::Type
3
3
  {}
4
4
  end
5
5
 
6
+ def set
7
+ @value = @value.to_h
8
+ end
9
+
6
10
  def validate
7
11
  raise TypeError, error_for(:not_hash_type_error) unless @value.is_a?(Hash)
8
12
  end
@@ -12,7 +16,9 @@ class Typero::HashType < Typero::Type
12
16
  end
13
17
 
14
18
  def db_field
15
- [:jsonb, {}]
19
+ [:jsonb, {
20
+ null: false
21
+ }]
16
22
  end
17
23
  end
18
24
 
@@ -0,0 +1,28 @@
1
+ class Typero::ImageType < Typero::Type
2
+ # FORMATS = %w[jpg jpeg gif png svg]
3
+
4
+ def set
5
+ @value = 'https://%s' % @value unless @value.include?('://')
6
+ end
7
+
8
+ def validate
9
+ raise TypeError, error_for(:not_starting_error) unless @value =~ /^https?:\/\/./
10
+ # ext = @value.split('.').last.downcase
11
+ # raise TypeError, error_for(:not_image_format) unless FORMATS.include?(ext)
12
+ end
13
+
14
+ def not_starting_error
15
+ 'URL is not starting with http'
16
+ end
17
+
18
+ # def not_image_format
19
+ # 'URL is not ending with %s' % FORMATS.join(', ')
20
+ # end
21
+
22
+ def db_field
23
+ opts = {}
24
+ opts[:null] = false if @opts[:required]
25
+ [:string, opts]
26
+ end
27
+ end
28
+
@@ -18,7 +18,8 @@ class Typero::IntegerType < Typero::Type
18
18
 
19
19
  def db_field
20
20
  opts = {}
21
- opts[:null] = false if @opts[:req]
21
+ opts[:null] = false if @opts[:required]
22
+ opts[:default] = @opts[:default]
22
23
  [:integer, opts]
23
24
  end
24
25
  end
@@ -13,8 +13,7 @@ class Typero::LabelType < Typero::Type
13
13
 
14
14
  def db_field
15
15
  opts = {}
16
- opts[:null] = false if @opts[:req]
17
- opts[:limit] = 30
16
+ opts[:limit] = 30
18
17
  [:string, opts]
19
18
  end
20
19
  end
@@ -33,7 +33,7 @@ class Typero::OibType < Typero::Type
33
33
 
34
34
  def db_field
35
35
  opts = {}
36
- opts[:null] = false if @opts[:req]
36
+ opts[:null] = false if @opts[:required]
37
37
  opts[:limit] = 11
38
38
  [:string, opts]
39
39
  end
@@ -1,12 +1,16 @@
1
+ # for postgres - select st_asewkt(lon_lat) || st_astext(lon_lat)
2
+ # point = @object.class.xselect("ST_AsText(#{field}) as #{field}").where(id: @object.id).first[field.to_sym]
3
+
1
4
  class Typero::PointType < Typero::Type
2
5
  def set
6
+ ap @value
3
7
  if @value.present?
4
8
  if @value.include?('/@')
5
9
  point = @value.split('/@', 2).last.split(',')
6
10
  @value = [point[0], point[1]].join(',')
7
11
  end
8
12
 
9
- unless @value.include?('POINT')
13
+ if !@value.include?('POINT') && @value.include?(',')
10
14
  point = @value.sub(/,\s*/, ' ')
11
15
  @value = 'SRID=4326;POINT(%s)' % point
12
16
  end
@@ -14,7 +18,9 @@ class Typero::PointType < Typero::Type
14
18
  end
15
19
 
16
20
  def validate
17
- raise TypeError, error_for(:unallowed_characters_error) unless @value =~ /^SRID=4326;POINT\(/
21
+ if @value && @value.include?(',') && !@value =~ /^SRID=4326;POINT\(/
22
+ raise TypeError, error_for(:unallowed_characters_error)
23
+ end
18
24
  end
19
25
 
20
26
  def db_field
@@ -21,8 +21,9 @@ class Typero::StringType < Typero::Type
21
21
 
22
22
  def db_field
23
23
  opts = {}
24
- opts[:limit] = @opts[:max] || 255
25
- opts[:null] = false if @opts[:req]
24
+ opts[:limit] = @opts[:max] || 255
25
+ opts[:null] = false if @opts[:required]
26
+ opts[:default] = @opts[:default]
26
27
  [:string, opts]
27
28
  end
28
29
  end
@@ -1,7 +1,9 @@
1
+ require_relative 'string'
2
+
1
3
  class Typero::TextType < Typero::StringType
2
4
  def db_field
3
5
  opts = {}
4
- opts[:null] = false if @opts[:req]
6
+ opts[:null] = false if @opts[:required]
5
7
  [:text, opts]
6
8
  end
7
9
  end
@@ -13,7 +13,7 @@ class Typero::UrlType < Typero::Type
13
13
 
14
14
  def db_field
15
15
  opts = {}
16
- opts[:null] = false if @opts[:req]
16
+ opts[:null] = false if @opts[:required]
17
17
  [:string, opts]
18
18
  end
19
19
  end
@@ -0,0 +1,191 @@
1
+ # rules = Typero.new do
2
+ # set :name, String, req: true
3
+ # set :email, :email, req: true
4
+ # set :skills, [:email], min: 2
5
+ # end
6
+ #
7
+ # or
8
+ #
9
+ # rules = Typero.new do
10
+ # string :name, req: true
11
+ # email :email, req: true
12
+ # email [:skills], min: 2
13
+ # end
14
+ #
15
+ # errors = rules.validate @object
16
+ # rules.valid?
17
+ # rules.validate(@object) { |errors| ... }
18
+
19
+ class Typero
20
+ SCHEMAS = {}
21
+ VERSION = File.read File.expand_path '../../.version', File.dirname(__FILE__)
22
+
23
+ class << self
24
+ # validate single value in type
25
+ def validate type, value, opts={}
26
+ field = type.to_s.tableize.singularize.to_sym
27
+
28
+ # we need to have pointer to hash, so value can be changed (coerced) if needed
29
+ h = { field => value }
30
+
31
+ rule = new do
32
+ set field, type, opts
33
+ end
34
+
35
+ if error = rule.validate(h)[field]
36
+ block_given? ? yield(error) : raise(TypeError.new(error))
37
+ end
38
+
39
+ h[field]
40
+ end
41
+
42
+ # check and coerce value
43
+ # Typero.set(:label, 'Foo bar') -> "foo-bar"
44
+ def set type, value, opts={}
45
+ check = Typero::Type.load(type).new value, opts
46
+ check.value
47
+ end
48
+
49
+ # list loaded classes
50
+ def list type=nil
51
+ SCHEMAS
52
+ .select { |k, v| type ? v[1] == type : true; }
53
+ .keys
54
+ end
55
+
56
+ # def schema table_name, &block
57
+ # schema = Typero.new(&block)
58
+
59
+ # if Lux.config.migrate
60
+ # AutoMigrate.typero table_name, schema
61
+ # else
62
+ # klass = table_name.to_s.classify.constantize
63
+ # klass.typero = schema
64
+ # end
65
+ # end
66
+ end
67
+
68
+ ###
69
+
70
+ # accepts dsl block to
71
+ def initialize name=nil, &block
72
+ type = :default
73
+
74
+ if name.is_a?(Hash)
75
+ type = name.keys.first
76
+ name = name.values.first
77
+ end
78
+
79
+ if block_given?
80
+ @schema = Schema.new &block
81
+
82
+ if name
83
+ SCHEMAS[name_fix(name)] = [@schema, type]
84
+ end
85
+ elsif name
86
+ schema_name = name_fix(name)
87
+ @schema = SCHEMAS[schema_name][0] || raise(ArgumentError.new('Schema nemed "%s" not found (%s)' % [schema_name, name]))
88
+ else
89
+ raise ArgumentError, 'No block or schema name given'
90
+ end
91
+ end
92
+
93
+ # validates any instance object or object with hash variable interface
94
+ # it also coarces values
95
+ def validate instance
96
+ @errors = {}
97
+
98
+ @schema.rules.each do |field, opts|
99
+ # set value to default if value is blank and default given
100
+ instance[field] = opts[:default] if opts[:default] && instance[field].blank?
101
+
102
+ # get field value
103
+ value = instance[field]
104
+
105
+ if value.present?
106
+ klass = 'Typero::%sType' % safe_type(opts[:type])
107
+ check = klass.constantize.new value, opts
108
+ check.value = check.default if check.value.nil?
109
+
110
+ unless check.value.nil?
111
+ begin
112
+ check.set
113
+ check.validate
114
+ instance[field] = check.value
115
+ rescue TypeError => e
116
+ add_error field, e.message
117
+ end
118
+ end
119
+ elsif opts[:required]
120
+ msg = opts[:required].class == TrueClass ? 'is required' : opts[:required]
121
+ add_error field, msg
122
+ end
123
+ end
124
+
125
+ if @errors.keys.length > 0 && block_given?
126
+ @errors.each { |k,v| yield(k, v) }
127
+ end
128
+
129
+ @errors
130
+ end
131
+
132
+ def valid? instance
133
+ errors = validate instance
134
+ errors.keys.length == 0
135
+ end
136
+
137
+ # returns field, db_type, db_opts
138
+ def db_schema
139
+ out = @schema.rules.inject([]) do |total, (field, opts)|
140
+ type, opts = Typero::Type.load(opts[:type]).new(nil, opts).db_field
141
+ total << [type, field, opts]
142
+ end
143
+
144
+ out += @schema.db_rules
145
+
146
+ out
147
+ end
148
+
149
+ # iterate trough all the ruels via block interface
150
+ # schema.rules do |field, opts|
151
+ # schema.rules(:url) do |field, opts|
152
+ def rules filter=nil, &block
153
+ return @schema.rules unless filter
154
+ out = @schema.rules
155
+ out = out.select { |k,v| v[:type].to_s == filter.to_s || v[:array_type].to_s == filter.to_s } if filter
156
+ return out unless block_given?
157
+
158
+ for k, v in out
159
+ yield k, v
160
+ end
161
+ end
162
+
163
+ private
164
+
165
+ # adds error to array or prefixes with field name
166
+ def add_error field, msg
167
+ if @errors[field]
168
+ @errors[field] += ', %s' % msg
169
+ else
170
+ if msg && msg[0,1].downcase == msg[0,1]
171
+ field_name = field.to_s.sub(/_id$/,'').humanize
172
+ msg = '%s %s' % [field_name, msg]
173
+ end
174
+
175
+ @errors[field] = msg
176
+ end
177
+ end
178
+
179
+ def safe_type type
180
+ type.to_s.gsub(/[^\w]/,'').classify
181
+ end
182
+
183
+ def name_fix name
184
+ if name.is_a?(Symbol)
185
+ name.to_s.classify if name.is_a?(Symbol)
186
+ else
187
+ name.to_s
188
+ end
189
+ end
190
+ end
191
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dino Reic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-30 00:00:00.000000000 Z
11
+ date: 2020-02-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fast_blank
@@ -34,6 +34,7 @@ files:
34
34
  - "./.version"
35
35
  - "./lib/adapters/sequel.rb"
36
36
  - "./lib/typero.rb"
37
+ - "./lib/typero/schema.rb"
37
38
  - "./lib/typero/type.rb"
38
39
  - "./lib/typero/type/array.rb"
39
40
  - "./lib/typero/type/boolean.rb"
@@ -42,8 +43,8 @@ files:
42
43
  - "./lib/typero/type/datetime.rb"
43
44
  - "./lib/typero/type/email.rb"
44
45
  - "./lib/typero/type/float.rb"
45
- - "./lib/typero/type/geography.rb"
46
46
  - "./lib/typero/type/hash.rb"
47
+ - "./lib/typero/type/image.rb"
47
48
  - "./lib/typero/type/integer.rb"
48
49
  - "./lib/typero/type/label.rb"
49
50
  - "./lib/typero/type/oib.rb"
@@ -51,6 +52,7 @@ files:
51
52
  - "./lib/typero/type/string.rb"
52
53
  - "./lib/typero/type/text.rb"
53
54
  - "./lib/typero/type/url.rb"
55
+ - "./lib/typero/typero.rb"
54
56
  homepage: https://github.com/dux/typero
55
57
  licenses:
56
58
  - MIT
@@ -70,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
72
  - !ruby/object:Gem::Version
71
73
  version: '0'
72
74
  requirements: []
73
- rubygems_version: 3.0.3
75
+ rubygems_version: 3.0.6
74
76
  signing_key:
75
77
  specification_version: 4
76
78
  summary: Ruby type system
@@ -1,13 +0,0 @@
1
- # Posrgre geography data type
2
- # covert google loc to field, auto fix other values
3
-
4
- class Typero::GeographyType < Typero::Type
5
- def default
6
- false
7
- end
8
-
9
- def db_field
10
- [:geography]
11
- end
12
- end
13
-