typero 0.5.2 → 0.9.3
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 +4 -4
- data/.version +1 -1
- data/lib/adapters/sequel.rb +11 -33
- data/lib/typero.rb +8 -189
- data/lib/typero/params.rb +126 -0
- data/lib/typero/schema.rb +154 -0
- data/lib/typero/type/type.rb +125 -0
- data/lib/typero/type/types/boolean_type.rb +26 -0
- data/lib/typero/type/types/currency_type.rb +21 -0
- data/lib/typero/type/types/date_type.rb +35 -0
- data/lib/typero/type/types/datetime_type.rb +16 -0
- data/lib/typero/type/types/email_type.rb +20 -0
- data/lib/typero/type/types/float_type.rb +24 -0
- data/lib/typero/type/types/hash_type.rb +31 -0
- data/lib/typero/type/types/image_type.rb +22 -0
- data/lib/typero/type/types/integer_type.rb +16 -0
- data/lib/typero/type/types/label_type.rb +20 -0
- data/lib/typero/type/types/locale_type.rb +13 -0
- data/lib/typero/type/types/model_type.rb +23 -0
- data/lib/typero/type/{oib.rb → types/oib_type.rb} +16 -18
- data/lib/typero/type/types/point_type.rb +25 -0
- data/lib/typero/type/types/string_type.rb +20 -0
- data/lib/typero/type/types/text_type.rb +10 -0
- data/lib/typero/type/types/time_type.rb +5 -0
- data/lib/typero/type/types/timezone_type.rb +15 -0
- data/lib/typero/type/types/url_type.rb +13 -0
- data/lib/typero/typero.rb +98 -0
- metadata +33 -27
- data/lib/typero/type.rb +0 -32
- data/lib/typero/type/array.rb +0 -55
- data/lib/typero/type/boolean.rb +0 -16
- data/lib/typero/type/currency.rb +0 -17
- data/lib/typero/type/date.rb +0 -6
- data/lib/typero/type/datetime.rb +0 -6
- data/lib/typero/type/email.rb +0 -27
- data/lib/typero/type/float.rb +0 -27
- data/lib/typero/type/geography.rb +0 -13
- data/lib/typero/type/hash.rb +0 -18
- data/lib/typero/type/integer.rb +0 -25
- data/lib/typero/type/label.rb +0 -20
- data/lib/typero/type/point.rb +0 -25
- data/lib/typero/type/string.rb +0 -29
- data/lib/typero/type/text.rb +0 -7
- data/lib/typero/type/url.rb +0 -20
@@ -0,0 +1,25 @@
|
|
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
|
+
|
4
|
+
class Typero::PointType < Typero::Type
|
5
|
+
def set
|
6
|
+
if value.include?('/@')
|
7
|
+
point = value.split('/@', 2).last.split(',')
|
8
|
+
value { [point[0], point[1]].join(',') }
|
9
|
+
end
|
10
|
+
|
11
|
+
if !value.include?('POINT') && value.include?(',')
|
12
|
+
point = value.sub(/,\s*/, ' ')
|
13
|
+
value { 'SRID=4326;POINT(%s)' % point }
|
14
|
+
end
|
15
|
+
|
16
|
+
if value && value.include?(',') && !value =~ /^SRID=4326;POINT\(/
|
17
|
+
error_for(:unallowed_characters_error)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def db_schema
|
22
|
+
[:geography, {}]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Typero::StringType < Typero::Type
|
2
|
+
opts :min, 'Minimun string length'
|
3
|
+
opts :max, 'Maximun string length'
|
4
|
+
opts :downcase, 'is the string in downcase?'
|
5
|
+
|
6
|
+
def set
|
7
|
+
value(&:to_s)
|
8
|
+
value(&:downcase) if opts[:downcase]
|
9
|
+
|
10
|
+
error_for(:min_length_error, opts[:min], value.length) if opts[:min] && value.length < opts[:min]
|
11
|
+
error_for(:max_length_error, opts[:max], value.length) if opts[:max] && value.length > opts[:max]
|
12
|
+
end
|
13
|
+
|
14
|
+
def db_schema
|
15
|
+
[:string, {
|
16
|
+
limit: @opts[:max] || 255
|
17
|
+
}]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Typero::TimezoneType < Typero::Type
|
2
|
+
error :en, :invalid_time_zone, 'Invalid time zone'
|
3
|
+
|
4
|
+
def set
|
5
|
+
TZInfo::Timezone.get(value)
|
6
|
+
rescue TZInfo::InvalidTimezoneIdentifier
|
7
|
+
error_for :invalid_time_zone
|
8
|
+
end
|
9
|
+
|
10
|
+
def db_schema
|
11
|
+
[:string, { length: 50 }]
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Typero::UrlType < Typero::Type
|
2
|
+
error :en, :url_not_starting_error, 'URL is not starting with http or https'
|
3
|
+
|
4
|
+
def set
|
5
|
+
parts = value.split('://')
|
6
|
+
error_for(:url_not_starting_error) unless parts[1]
|
7
|
+
end
|
8
|
+
|
9
|
+
def db_schema
|
10
|
+
[:string, {}]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# rules = Typero.schema 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.schema 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
|
+
module Typero
|
20
|
+
extend self
|
21
|
+
|
22
|
+
VERSION = File.read File.expand_path "../../.version", File.dirname(__FILE__)
|
23
|
+
|
24
|
+
# check and coerce value
|
25
|
+
# Typero.set(:label, 'Foo bar') -> "foo-bar"
|
26
|
+
def set type, value, opts = {}, &block
|
27
|
+
check = Typero::Type.load(type).new value, opts
|
28
|
+
check.get
|
29
|
+
rescue TypeError => error
|
30
|
+
if block
|
31
|
+
block.call error
|
32
|
+
false
|
33
|
+
else
|
34
|
+
raise error
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# load or set type schema
|
39
|
+
# Typero.schema(:blog) { ... }
|
40
|
+
# Typero.schema(:blog, type: :model) { ... }
|
41
|
+
# Typero.schema(:blog)
|
42
|
+
# Typero.schema(type: :model)
|
43
|
+
def schema name=nil, opts=nil, &block
|
44
|
+
klass = name.to_s.classify if name && !name.is_a?(Hash)
|
45
|
+
|
46
|
+
if block_given?
|
47
|
+
Typero::Schema.new(&block).tap do |schema|
|
48
|
+
if klass
|
49
|
+
Typero::Schema::SCHEMAS[klass] = schema
|
50
|
+
|
51
|
+
if opts && opts[:type]
|
52
|
+
Typero::Schema::TYPES[opts[:type]] ||= []
|
53
|
+
Typero::Schema::TYPES[opts[:type]].push klass unless Typero::Schema::TYPES[opts[:type]].include?(klass)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
else
|
58
|
+
# Schema not given, get schema
|
59
|
+
if name.is_a?(Hash)
|
60
|
+
# Typero.schema type: :model
|
61
|
+
if type = name[:type]
|
62
|
+
Typero::Schema::TYPES[type]
|
63
|
+
end
|
64
|
+
elsif klass
|
65
|
+
# Typero.schema :user
|
66
|
+
schema = Typero::Schema::SCHEMAS[klass]
|
67
|
+
schema ||= class_finder klass, :schema
|
68
|
+
schema || nil
|
69
|
+
else
|
70
|
+
raise ArgumentError, 'Schema type not defined.'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def defined? name
|
76
|
+
Typero::Type.load name
|
77
|
+
true
|
78
|
+
rescue ArgumentError
|
79
|
+
false
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
# class_finder :user, :exporter, :representer
|
85
|
+
# find first UserExporter, User::Exporter, User::Representer, UserRepresenter
|
86
|
+
def class_finder *args
|
87
|
+
name = args.shift.to_s.classify
|
88
|
+
|
89
|
+
for el in args
|
90
|
+
for separator in ['_','/']
|
91
|
+
klass = [name, el].join(separator).classify
|
92
|
+
return klass.constantize if const_defined? klass
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
nil
|
97
|
+
end
|
98
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typero
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dino Reic
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fast_blank
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
description: Simple and fast ruby type system. Enforce types as Array, Email, Boolean
|
28
28
|
for ruby class instances
|
29
29
|
email: reic.dino@gmail.com
|
@@ -34,28 +34,34 @@ files:
|
|
34
34
|
- "./.version"
|
35
35
|
- "./lib/adapters/sequel.rb"
|
36
36
|
- "./lib/typero.rb"
|
37
|
-
- "./lib/typero/
|
38
|
-
- "./lib/typero/
|
39
|
-
- "./lib/typero/type/
|
40
|
-
- "./lib/typero/type/
|
41
|
-
- "./lib/typero/type/
|
42
|
-
- "./lib/typero/type/
|
43
|
-
- "./lib/typero/type/
|
44
|
-
- "./lib/typero/type/
|
45
|
-
- "./lib/typero/type/
|
46
|
-
- "./lib/typero/type/
|
47
|
-
- "./lib/typero/type/
|
48
|
-
- "./lib/typero/type/
|
49
|
-
- "./lib/typero/type/
|
50
|
-
- "./lib/typero/type/
|
51
|
-
- "./lib/typero/type/
|
52
|
-
- "./lib/typero/type/
|
53
|
-
- "./lib/typero/type/
|
37
|
+
- "./lib/typero/params.rb"
|
38
|
+
- "./lib/typero/schema.rb"
|
39
|
+
- "./lib/typero/type/type.rb"
|
40
|
+
- "./lib/typero/type/types/boolean_type.rb"
|
41
|
+
- "./lib/typero/type/types/currency_type.rb"
|
42
|
+
- "./lib/typero/type/types/date_type.rb"
|
43
|
+
- "./lib/typero/type/types/datetime_type.rb"
|
44
|
+
- "./lib/typero/type/types/email_type.rb"
|
45
|
+
- "./lib/typero/type/types/float_type.rb"
|
46
|
+
- "./lib/typero/type/types/hash_type.rb"
|
47
|
+
- "./lib/typero/type/types/image_type.rb"
|
48
|
+
- "./lib/typero/type/types/integer_type.rb"
|
49
|
+
- "./lib/typero/type/types/label_type.rb"
|
50
|
+
- "./lib/typero/type/types/locale_type.rb"
|
51
|
+
- "./lib/typero/type/types/model_type.rb"
|
52
|
+
- "./lib/typero/type/types/oib_type.rb"
|
53
|
+
- "./lib/typero/type/types/point_type.rb"
|
54
|
+
- "./lib/typero/type/types/string_type.rb"
|
55
|
+
- "./lib/typero/type/types/text_type.rb"
|
56
|
+
- "./lib/typero/type/types/time_type.rb"
|
57
|
+
- "./lib/typero/type/types/timezone_type.rb"
|
58
|
+
- "./lib/typero/type/types/url_type.rb"
|
59
|
+
- "./lib/typero/typero.rb"
|
54
60
|
homepage: https://github.com/dux/typero
|
55
61
|
licenses:
|
56
62
|
- MIT
|
57
63
|
metadata: {}
|
58
|
-
post_install_message:
|
64
|
+
post_install_message:
|
59
65
|
rdoc_options: []
|
60
66
|
require_paths:
|
61
67
|
- lib
|
@@ -70,8 +76,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
76
|
- !ruby/object:Gem::Version
|
71
77
|
version: '0'
|
72
78
|
requirements: []
|
73
|
-
rubygems_version: 3.0.
|
74
|
-
signing_key:
|
79
|
+
rubygems_version: 3.0.6
|
80
|
+
signing_key:
|
75
81
|
specification_version: 4
|
76
82
|
summary: Ruby type system
|
77
83
|
test_files: []
|
data/lib/typero/type.rb
DELETED
@@ -1,32 +0,0 @@
|
|
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
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
|
data/lib/typero/type/array.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
class Typero::ArrayType < Typero::Type
|
2
|
-
def default
|
3
|
-
[]
|
4
|
-
end
|
5
|
-
|
6
|
-
def set
|
7
|
-
unless @value.class.to_s.index('Array')
|
8
|
-
@value = @value.to_s.sub(/^\{/,'').sub(/\}$/,'')
|
9
|
-
|
10
|
-
# split on new line and comma by default
|
11
|
-
@value = @value.split(/\s*[,\n]\s*/)
|
12
|
-
end
|
13
|
-
|
14
|
-
@value.uniq!
|
15
|
-
@value.compact!
|
16
|
-
|
17
|
-
if type = @opts[:array_type]
|
18
|
-
@value.map! { |el|
|
19
|
-
Typero.validate(type, el) { |msg|
|
20
|
-
raise TypeError.new "'%s' %s (%s)" % [el, msg, value_in_list_error]
|
21
|
-
}
|
22
|
-
}
|
23
|
-
end
|
24
|
-
|
25
|
-
# this converts Sequel::Postgres::PGArray to Array and fixes many problems
|
26
|
-
@value = @value.to_a if @value.class != Array
|
27
|
-
end
|
28
|
-
|
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]
|
32
|
-
true
|
33
|
-
end
|
34
|
-
|
35
|
-
def min_error
|
36
|
-
'min array lenght is %s elements'
|
37
|
-
end
|
38
|
-
|
39
|
-
def max_error
|
40
|
-
'max array lenght is %s elements'
|
41
|
-
end
|
42
|
-
|
43
|
-
def value_in_list_error
|
44
|
-
'value in list'
|
45
|
-
end
|
46
|
-
|
47
|
-
def db_field
|
48
|
-
check = Typero::Type.load(@opts[:array_type]).new nil, {}
|
49
|
-
schema = check.db_field
|
50
|
-
schema[1] ||= {}
|
51
|
-
schema[1].merge! array: true
|
52
|
-
schema
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
data/lib/typero/type/boolean.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
class Typero::BooleanType < Typero::Type
|
2
|
-
def default
|
3
|
-
false
|
4
|
-
end
|
5
|
-
|
6
|
-
def set
|
7
|
-
@value = [true, 1, '1', 'true', 'on'].include?(@value) ? true : false
|
8
|
-
end
|
9
|
-
|
10
|
-
def db_field
|
11
|
-
opts = {}
|
12
|
-
opts[:default] = @opts[:default] || false
|
13
|
-
[:boolean, opts]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
data/lib/typero/type/currency.rb
DELETED
data/lib/typero/type/date.rb
DELETED
data/lib/typero/type/datetime.rb
DELETED
data/lib/typero/type/email.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
class Typero::EmailType < Typero::Type
|
2
|
-
|
3
|
-
def set
|
4
|
-
@value = @value.downcase.gsub(/\s+/,'+')
|
5
|
-
end
|
6
|
-
|
7
|
-
def validate
|
8
|
-
raise TypeError, error_for(:not_8_chars_error) unless @value.to_s.length > 7
|
9
|
-
raise TypeError, error_for(:missing_monkey_error) unless @value.include?('@')
|
10
|
-
end
|
11
|
-
|
12
|
-
def not_8_chars_error
|
13
|
-
'is not having at least 8 characters'
|
14
|
-
end
|
15
|
-
|
16
|
-
def missing_monkey_error
|
17
|
-
'is missing @'
|
18
|
-
end
|
19
|
-
|
20
|
-
def db_field
|
21
|
-
opts = {}
|
22
|
-
opts[:limit] = @opts[:max] || 120
|
23
|
-
opts[:null] = false if @opts[:req]
|
24
|
-
[:string, opts]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|