typero 0.4.0 → 0.9.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 +4 -4
- data/.version +1 -1
- data/lib/adapters/sequel.rb +69 -0
- data/lib/typero.rb +12 -170
- data/lib/typero/exporter.rb +93 -0
- data/lib/typero/params.rb +99 -0
- data/lib/typero/schema.rb +132 -0
- data/lib/typero/type/type.rb +110 -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 +32 -0
- data/lib/typero/type/types/datetime_type.rb +14 -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 +25 -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/model_type.rb +21 -0
- data/lib/typero/type/{oib.rb → types/oib_type.rb} +16 -11
- 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/url_type.rb +13 -0
- data/lib/typero/typero.rb +90 -0
- metadata +29 -19
- data/lib/typero/type.rb +0 -39
- data/lib/typero/type/array.rb +0 -44
- data/lib/typero/type/boolean.rb +0 -10
- data/lib/typero/type/email.rb +0 -21
- data/lib/typero/type/float.rb +0 -21
- data/lib/typero/type/hash.rb +0 -14
- data/lib/typero/type/integer.rb +0 -19
- data/lib/typero/type/label.rb +0 -13
- data/lib/typero/type/string.rb +0 -22
- data/lib/typero/type/url.rb +0 -14
@@ -0,0 +1,20 @@
|
|
1
|
+
class Typero::LabelType < Typero::Type
|
2
|
+
def set
|
3
|
+
value do |data|
|
4
|
+
data
|
5
|
+
.to_s
|
6
|
+
.gsub(/\s+/,'-')
|
7
|
+
.gsub(/[^\w\-]/,'')
|
8
|
+
.gsub(/\-+/, '-')[0,30]
|
9
|
+
.downcase
|
10
|
+
end
|
11
|
+
|
12
|
+
error_for(:unallowed_characters_error) unless value =~ /^[\w\-]+$/
|
13
|
+
end
|
14
|
+
|
15
|
+
def db_schema
|
16
|
+
[:string, {
|
17
|
+
limit: 30
|
18
|
+
}]
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Typero::ModelType < Typero::Type
|
2
|
+
def set
|
3
|
+
value(&:to_h)
|
4
|
+
|
5
|
+
errors = []
|
6
|
+
|
7
|
+
schema = Typero.schema(opts[:model])
|
8
|
+
schema.validate(value) do |field, error|
|
9
|
+
errors.push '%s (%s)' % [error, field]
|
10
|
+
end
|
11
|
+
|
12
|
+
raise TypeError.new errors.join(', ') if errors.first
|
13
|
+
end
|
14
|
+
|
15
|
+
def db_schema
|
16
|
+
[:jsonb, {
|
17
|
+
null: false
|
18
|
+
}]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -1,4 +1,20 @@
|
|
1
1
|
class Typero::OibType < Typero::Type
|
2
|
+
error :en, :not_an_oib_error, 'not in an OIB format'
|
3
|
+
|
4
|
+
def set
|
5
|
+
value do |data|
|
6
|
+
check?(data) ? data.to_i : error_for(:not_an_oib_error)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def db_schema
|
11
|
+
[:string, {
|
12
|
+
limit: 11
|
13
|
+
}]
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
2
18
|
# http://domagoj.eu/oib/
|
3
19
|
def check? oib
|
4
20
|
oib = oib.to_s
|
@@ -19,16 +35,5 @@ class Typero::OibType < Typero::Type
|
|
19
35
|
return control_sum == oib.at(10).to_i
|
20
36
|
end
|
21
37
|
|
22
|
-
def set
|
23
|
-
@value = check?(@value) ? @value.to_i : nil
|
24
|
-
end
|
25
|
-
|
26
|
-
def validate
|
27
|
-
raise TypeError.new(error_for(:not_an_oib_error)) unless check?(@value)
|
28
|
-
end
|
29
|
-
|
30
|
-
def not_an_oib_error
|
31
|
-
'not in an OIB format'
|
32
|
-
end
|
33
38
|
end
|
34
39
|
|
@@ -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,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,90 @@
|
|
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 type schema
|
39
|
+
def schema name=nil, &block
|
40
|
+
# :user -> 'User'
|
41
|
+
name = name.to_s.classify if name
|
42
|
+
|
43
|
+
if block_given?
|
44
|
+
Typero::Schema.new(&block).tap do |schema|
|
45
|
+
Typero::Schema::SCHEMAS[name] = schema if name
|
46
|
+
end
|
47
|
+
else
|
48
|
+
raise ArgumentErorr.new('Schema name not given') unless name
|
49
|
+
|
50
|
+
schema = Typero::Schema::SCHEMAS[name]
|
51
|
+
schema ||= class_finder name, :schema
|
52
|
+
schema || raise('Typero schema "%s" not defined' % name)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def export model, opts={}, &block
|
57
|
+
if block_given?
|
58
|
+
Exporter::EXPORTERS[model.to_s.classify] = block
|
59
|
+
else
|
60
|
+
Exporter.new(model, opts).render
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def defined? name
|
65
|
+
Typero::Type.load name
|
66
|
+
true
|
67
|
+
rescue ArgumentError
|
68
|
+
false
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
# class_finder :user, :exporter, :representer
|
74
|
+
# find first UserExporter, User::Exporter, User::Representer, UserRepresenter
|
75
|
+
def class_finder *args
|
76
|
+
name = args.shift.to_s.classify
|
77
|
+
|
78
|
+
for el in args
|
79
|
+
for separator in ['_','/']
|
80
|
+
klass = [name, el].join(separator).classify
|
81
|
+
|
82
|
+
begin
|
83
|
+
return klass.constantize
|
84
|
+
rescue NameError => e
|
85
|
+
nil
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
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.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:
|
11
|
+
date: 2020-06-02 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
|
@@ -32,18 +32,29 @@ extensions: []
|
|
32
32
|
extra_rdoc_files: []
|
33
33
|
files:
|
34
34
|
- "./.version"
|
35
|
+
- "./lib/adapters/sequel.rb"
|
35
36
|
- "./lib/typero.rb"
|
36
|
-
- "./lib/typero/
|
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/
|
37
|
+
- "./lib/typero/exporter.rb"
|
38
|
+
- "./lib/typero/params.rb"
|
39
|
+
- "./lib/typero/schema.rb"
|
40
|
+
- "./lib/typero/type/type.rb"
|
41
|
+
- "./lib/typero/type/types/boolean_type.rb"
|
42
|
+
- "./lib/typero/type/types/currency_type.rb"
|
43
|
+
- "./lib/typero/type/types/date_type.rb"
|
44
|
+
- "./lib/typero/type/types/datetime_type.rb"
|
45
|
+
- "./lib/typero/type/types/email_type.rb"
|
46
|
+
- "./lib/typero/type/types/float_type.rb"
|
47
|
+
- "./lib/typero/type/types/hash_type.rb"
|
48
|
+
- "./lib/typero/type/types/image_type.rb"
|
49
|
+
- "./lib/typero/type/types/integer_type.rb"
|
50
|
+
- "./lib/typero/type/types/label_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/url_type.rb"
|
57
|
+
- "./lib/typero/typero.rb"
|
47
58
|
homepage: https://github.com/dux/typero
|
48
59
|
licenses:
|
49
60
|
- MIT
|
@@ -63,8 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
74
|
- !ruby/object:Gem::Version
|
64
75
|
version: '0'
|
65
76
|
requirements: []
|
66
|
-
|
67
|
-
rubygems_version: 2.7.5
|
77
|
+
rubygems_version: 3.0.6
|
68
78
|
signing_key:
|
69
79
|
specification_version: 4
|
70
80
|
summary: Ruby type system
|
data/lib/typero/type.rb
DELETED
@@ -1,39 +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(what)
|
19
|
-
true
|
20
|
-
end
|
21
|
-
|
22
|
-
def error_for name
|
23
|
-
@opts[name] || send(name)
|
24
|
-
end
|
25
|
-
|
26
|
-
def get
|
27
|
-
@value
|
28
|
-
end
|
29
|
-
|
30
|
-
def set
|
31
|
-
@value
|
32
|
-
end
|
33
|
-
|
34
|
-
def default
|
35
|
-
nil
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
|
data/lib/typero/type/array.rb
DELETED
@@ -1,44 +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(/\}$/,'').split(/\s*,\s*/)
|
9
|
-
end
|
10
|
-
|
11
|
-
@value.uniq!
|
12
|
-
@value.compact!
|
13
|
-
|
14
|
-
if type = @opts[:array_type]
|
15
|
-
@value.map! { |el|
|
16
|
-
Typero.validate(type, el) { |msg|
|
17
|
-
raise TypeError.new "'%s' %s (%s)" % [el, msg, value_in_list_error]
|
18
|
-
}
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
|
-
# this converts Sequel::Postgres::PGArray to Array and fixes many problems
|
23
|
-
@value = @value.to_a if @value.class != Array
|
24
|
-
end
|
25
|
-
|
26
|
-
def validate
|
27
|
-
raise TypeError, error_for(:min_length) % @opts[:min] if @opts[:min] && @value.length < @opts[:min]
|
28
|
-
raise TypeError, error_for(:max_length) % @opts[:max] if @opts[:max] && @value.length > @opts[:max]
|
29
|
-
true
|
30
|
-
end
|
31
|
-
|
32
|
-
def min_error
|
33
|
-
'min array lenght is %s elements'
|
34
|
-
end
|
35
|
-
|
36
|
-
def max_error
|
37
|
-
'max array lenght is %s elements'
|
38
|
-
end
|
39
|
-
|
40
|
-
def value_in_list_error
|
41
|
-
'value in list'
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
data/lib/typero/type/boolean.rb
DELETED
data/lib/typero/type/email.rb
DELETED
@@ -1,21 +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
|
-
end
|
21
|
-
|