typero 0.9.0 → 0.9.5

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: 8e78c338c182793ab2bffd1b4c5469d5285f57f55697402b6e80fb1881a3f7a8
4
- data.tar.gz: 18a803b38ef8a24cb3756a43e5b5704082a08f4d805be57239cb054c28e6f132
3
+ metadata.gz: 0bcd151d7d7b875c6db7aec28c85c3abcf10596a4f596622050d7e18cdb81e9e
4
+ data.tar.gz: d54b9c76d6587e5872f19deba20febd7430e19022fe869a1360339c8156205d9
5
5
  SHA512:
6
- metadata.gz: 1c02d8cec42f465c5cf34b0b69c856cf193f1c5e289898af0aefdebf1d61ed91c95148a1fa9ca1c047a07810c99bd518946dbfe323e0e53c4502b66b08910c85
7
- data.tar.gz: de185fca3ac80a4e7e9d6b87778872b3b352f89678f334e24b0047480d401cbd0abf95bb8940ba0e29d9d3f485ef62521b38335f1f6cc3a7d1f59194383f4a67
6
+ metadata.gz: 5b639372e86d329ef150809f52f964a459c3faf369a86d219292a2af6b8364ed5c2745079d409944472ec59316cae690e0f1d554cecdeacb625bb5ccf4b39f29
7
+ data.tar.gz: 0e887a10b853325c7b27f3c90ab57b3c1987d38576e3f1128fb27eb4982d2aaefdbf6e5ded9e80a75c7085c5674686196b13653eed62db853d6d50fe0c15ad39
data/.version CHANGED
@@ -1 +1 @@
1
- 0.9.0
1
+ 0.9.5
@@ -1,62 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Sequel::Plugins::TyperoAttributes
3
+ module Sequel::Plugins::Typero
4
4
  module ClassMethods
5
5
  def typero
6
- Typero.new self
6
+ Typero.schema self
7
7
  end
8
8
  end
9
9
 
10
10
  module InstanceMethods
11
11
  # calling typero! on any object will validate all fields
12
- def typero! field_name=nil
13
- return unless Typero.defined?(self.class)
12
+ def validate
13
+ super
14
14
 
15
- typero = self.class.typero
15
+ schema = Typero.schema(self.class) || return
16
16
 
17
- typero.validate(self) do |name, err|
17
+ schema.validate(self) do |name, err|
18
18
  errors.add(name, err) unless (errors.on(name) || []).include?(err)
19
19
  end
20
20
 
21
21
  # this are rules unique to database, so we check them here
22
- typero.rules.each do |field, rule|
23
- self[field] ||= {} if rule[:type] == 'hash'
24
-
22
+ schema.rules.each do |field, rule|
25
23
  # check uniqe fields
26
- if rule[:unique]
24
+ if unique = rule.dig(:meta, :unique)
27
25
  id = self[:id] || 0
28
26
  value = self[field]
29
27
 
30
28
  # we only check if field is changed
31
29
  if value.present? && column_changed?(field) && self.class.xwhere('LOWER(%s)=LOWER(?) and id<>?' % field, value, id).first
32
- error = rule[:unique].class == TrueClass ? %[Value '"#{value}"' for #{field} allready exists] : rule[:unique]
30
+ error = unique.class == TrueClass ? %[Value "#{value}" for field "#{field}" has been already used, please chose another value.] : unique
33
31
  errors.add(field, error) unless (errors.on(field) || []).include?(error)
34
32
  end
35
33
  end
36
34
 
37
35
  # check protected fields
38
- if rule[:protected] && self[:id]
36
+ if prot = rule.dig(:meta, :protected) && self[:id]
39
37
  if column_changed?(field)
40
- error = rule[:protected].class == TrueClass ? "value once defined can't be overwritten." : rule[:protected]
38
+ error = prot.class == TrueClass ? "value once defined can't be overwritten." : prot
41
39
  errors.add(field, error) unless (errors.on(field) || []).include?(error)
42
40
  end
43
41
  end
44
42
  end
45
-
46
- # check single field if single field given
47
- if field_name
48
- raise ArgumentError.new 'Field :%s not found in %s' % [field_name, self] unless self[field_name]
49
- return unless errors.on(field_name)
50
-
51
- errors.on(field_name).join(', ')
52
- end
53
-
54
- true
55
- end
56
-
57
- def validate
58
- typero!
59
- super
60
43
  end
61
44
  end
62
45
 
@@ -65,5 +48,5 @@ module Sequel::Plugins::TyperoAttributes
65
48
  end
66
49
  end
67
50
 
68
- Sequel::Model.plugin :typero_attributes
51
+ # Sequel::Model.plugin :typero
69
52
 
data/lib/typero/params.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Typero
4
4
  class Params
5
- attr_reader :rules, :db_rules
5
+ attr_reader :db_rules
6
6
 
7
7
  def initialize &block
8
8
  @db_rules = []
@@ -10,10 +10,14 @@ module Typero
10
10
  instance_exec &block
11
11
  end
12
12
 
13
+ def rules
14
+ @rules.dup
15
+ end
16
+
13
17
  private
14
18
 
15
19
  # used in dsl to define schema field options
16
- def set field, *args
20
+ def set field, *args, &block
17
21
  raise "Field name not given (Typero)" unless field
18
22
 
19
23
  if args.first.is_a?(Hash)
@@ -27,12 +31,25 @@ module Typero
27
31
 
28
32
  field = field.to_s
29
33
 
34
+ if field.include?('!')
35
+ if block
36
+ field = field.sub('!', '')
37
+ @block_type = field.to_sym
38
+ instance_exec &block
39
+ @block_type = nil
40
+ return
41
+ else
42
+ raise ArgumentError.new 'If you use ! you have to provide a block'
43
+ end
44
+ end
45
+
30
46
  # name? - opional name
31
47
  if field.include?('?')
32
48
  field = field.sub('?', '')
33
49
  opts[:required] = false
34
50
  end
35
51
 
52
+ opts[:required] = opts.delete(:req) unless opts[:req].nil?
36
53
  opts[:required] = true if opts[:required].nil?
37
54
 
38
55
  # array that allows duplicates
@@ -47,28 +64,41 @@ module Typero
47
64
  opts[:array] = true
48
65
  end
49
66
 
67
+ opts[:type] = @block_type if @block_type
68
+
50
69
  # Boolean
51
- if opts[:type].is_a?(TrueClass)
70
+ if opts[:type].is_a?(TrueClass) || opts[:type] == :true
52
71
  opts[:required] = false
53
72
  opts[:default] = true
54
73
  opts[:type] = :boolean
55
- elsif opts[:type].is_a?(FalseClass)
56
- opts[:required] = false
57
- opts[:default] = false
74
+ elsif opts[:type].is_a?(FalseClass) || opts[:type] == :false || opts[:type] == :boolean
75
+ opts[:required] = false if opts[:required].nil?
76
+ opts[:default] = false if opts[:default].nil?
58
77
  opts[:type] = :boolean
59
78
  end
60
79
 
80
+ # model / schema
81
+ if opts[:type].class.ancestors.include?(Typero::Schema)
82
+ opts[:model] = opts.delete(:type)
83
+ end
61
84
  opts[:model] = opts.delete(:schema) if opts[:schema]
62
85
  opts[:type] = :model if opts[:model]
63
86
 
87
+ if block_given?
88
+ opts[:type] = :model
89
+ opts[:model] = Typero.schema &block
90
+ end
91
+
64
92
  opts[:type] ||= 'string'
65
93
  opts[:type] = opts[:type].to_s.downcase.to_sym
66
94
 
67
95
  opts[:description] = opts.delete(:desc) unless opts[:desc].nil?
68
96
 
69
97
  # chek alloed params, all optional should go in meta
70
- result = opts.keys - Typero::Type::OPTS_KEYS
71
- raise ArgumentError.new('Unallowed Type params found: "%s", allowed: %s' % [result.join(' and '), Typero::Type::OPTS_KEYS.sort]) if result.length > 0
98
+ opts.keys.each do |key|
99
+ type = Typero::Type.load opts[:type]
100
+ type.allowed_opt?(key) {|err| raise ArgumentError, err }
101
+ end
72
102
 
73
103
  field = field.to_sym
74
104
 
@@ -93,7 +123,7 @@ module Typero
93
123
  # set :emails, Array[:email]
94
124
  # email Array[:emails]
95
125
  def method_missing field, *args, &block
96
- set field, *args
126
+ set field, *args, &block
97
127
  end
98
128
  end
99
129
  end
data/lib/typero/schema.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  module Typero
2
2
  class Schema
3
- SCHEMAS = {}
4
-
5
3
  # accepts dsl block to
6
4
  def initialize &block
7
5
  raise "Params not defined" unless block_given?
@@ -10,42 +8,69 @@ module Typero
10
8
 
11
9
  # validates any instance object with hash variable interface
12
10
  # it also coarces values
13
- def validate object
14
- @object = object
15
- @errors = {}
11
+ def validate object, options=nil
12
+ @options = options || {}
13
+ @object = object
14
+ @errors = {}
15
+
16
+ # remove undefined keys if Hash provided
17
+ if @options[:strict] && object.is_a?(Hash)
18
+ undefined = object.keys.map(&:to_s) - @schema.rules.keys.map(&:to_s)
19
+ object.delete_if { |k, _| undefined.include?(k.to_s) }
20
+ end
16
21
 
17
22
  @schema.rules.each do |field, opts|
23
+ # force filed as a symbol
24
+ field = field.to_sym
25
+
26
+ for k in opts.keys
27
+ opts[k] = @object.instance_exec(&opts[k]) if opts[k].is_a?(Proc)
28
+ end
29
+
18
30
  # set value to default if value is blank and default given
19
31
  @object[field] = opts[:default] if opts[:default] && @object[field].blank?
20
32
 
21
- # get field value
22
- value = @object[field]
33
+ if @object.respond_to?(:key?)
34
+ if @object.key?(field)
35
+ value = @object[field]
36
+ elsif @object.key?(field.to_s)
37
+ # invalid string key, needs fix
38
+ value = @object[field] = @object.delete(field.to_s)
39
+ end
40
+ else
41
+ value = @object[field]
42
+ end
23
43
 
24
44
  if opts[:array]
25
- unless value.is_a?(Array)
26
- opts[:delimiter] ||= /\s*,\s*/
45
+ unless value.respond_to?(:each)
46
+ opts[:delimiter] ||= /\s*[,\n]\s*/
27
47
  value = value.to_s.split(opts[:delimiter])
28
48
  end
29
49
 
30
50
  value = value
31
- .map { |el| check_filed_value field, el, opts }
32
- .map { |el| el.to_s == '' ? nil : el }
51
+ .flatten
52
+ .map { |el| el.to_s == '' ? nil : check_filed_value(field, el, opts) }
33
53
  .compact
34
54
 
35
55
  value = Set.new(value).to_a unless opts[:duplicates]
36
56
 
37
57
  opts[:max_count] ||= 100
38
- add_error(field, 'Max number of array elements is %d, you have %d' % [opts[:max_count], value.length], opts) if value.length > opts[:max_count]
58
+ add_error(field, 'Max number of array elements is %d, you have %d' % [opts[:max_count], value.length], opts) if value && value.length > opts[:max_count]
59
+ add_error(field, 'Min number of array elements is %d, you have %d' % [opts[:min_count], value.length], opts) if value && opts[:min_count] && value.length < opts[:min_count]
39
60
 
40
61
  add_required_error field, value.first, opts
41
62
  else
63
+ value = nil if value.to_s == ''
64
+
65
+ # if value is not list of allowed values, raise error
66
+ allowed = opts[:allow] || opts[:allowed] || opts[:values]
67
+ if value && allowed && !allowed.map(&:to_s).include?(value.to_s)
68
+ add_error field, 'Value "%s" is not allowed' % value, opts
69
+ end
70
+
42
71
  value = check_filed_value field, value, opts
43
- add_required_error field, value, opts
44
- end
45
72
 
46
- # if value is not list of allowed values, raise error
47
- if opts[:allowed] && !opts[:values].include?(value)
48
- add_error field, 'Value "%s" is not allowed' % value, opts
73
+ add_required_error field, value, opts
49
74
  end
50
75
 
51
76
  # present empty string values as nil
@@ -126,7 +151,13 @@ module Typero
126
151
  check = klass.constantize.new value, opts
127
152
  check.get
128
153
  rescue TypeError => e
129
- add_error field, e.message, opts
154
+ if e.message[0] == '{'
155
+ for key, msg in JSON.parse(e.message)
156
+ add_error [field, key].join('.'), msg, opts
157
+ end
158
+ else
159
+ add_error field, e.message, opts
160
+ end
130
161
  end
131
162
  end
132
163
  end
@@ -15,8 +15,24 @@ module Typero
15
15
  }
16
16
 
17
17
  # default shared allowed opts keys
18
- OPTS_KEYS = [:type, :required, :array, :max_count, :default, :name, :meta, :model]
19
18
  OPTS = {}
19
+ OPTS_KEYS = [
20
+ :allow,
21
+ :allowed,
22
+ :array,
23
+ :default,
24
+ :description,
25
+ :delimiter,
26
+ :max_count,
27
+ :meta,
28
+ :min_count,
29
+ :model,
30
+ :name,
31
+ :req,
32
+ :required,
33
+ :type,
34
+ :values
35
+ ]
20
36
 
21
37
  attr_reader :opts
22
38
 
@@ -38,17 +54,31 @@ module Typero
38
54
  end
39
55
 
40
56
  def opts key, desc
41
- OPTS_KEYS.push key unless OPTS_KEYS.include?(key)
42
-
43
57
  OPTS[self] ||= {}
44
58
  OPTS[self][key] = desc
45
59
  end
60
+
61
+ def allowed_opt? name
62
+ return true if OPTS_KEYS.include?(name)
63
+
64
+ OPTS[self] ||= {}
65
+ return true if OPTS[self][name]
66
+
67
+ msg = %[Unallowed param "#{name}" for type "#{to_s}" found. Allowed are "#{OPTS_KEYS.join(', ')}"]
68
+ msg += %[ + "#{OPTS[self].keys.join(', ')}"] if OPTS[self].keys.first
69
+
70
+ block_given? ? yield(msg) : raise(ArgumentError, msg)
71
+
72
+ false
73
+ end
46
74
  end
47
75
 
48
76
  ###
49
77
 
50
78
  def initialize value, opts={}, &block
51
- value = value.sub(/^\s+/, '').sub(/\s+$/, '') if value.is_a?(String)
79
+ value = value.strip.rstrip if value.is_a?(String)
80
+
81
+ opts.keys.each {|key| self.class.allowed_opt?(key) }
52
82
 
53
83
  @value = value
54
84
  @opts = opts
@@ -68,7 +98,11 @@ module Typero
68
98
  opts[:default].nil? ? default : opts[:default]
69
99
  else
70
100
  set
71
- error_for(:not_in_range, opts[:values].join(', ')) if opts[:values] && !opts[:values].include?(@value)
101
+
102
+ if opts[:values] && !opts[:values].map(&:to_s).include?(@value.to_s)
103
+ error_for(:not_in_range, opts[:values].join(', '))
104
+ end
105
+
72
106
  value
73
107
  end
74
108
  end
@@ -1,9 +1,15 @@
1
1
  class Typero::DateType < Typero::Type
2
+ opts :min, 'Smallest date-time allowed'
3
+ opts :max, 'Maximal date-time allowed'
4
+
2
5
  error :en, :min_date, 'Minimal allowed date is %s'
3
6
  error :en, :max_date, 'Maximal allowed date is %s'
4
7
 
5
8
  def set
6
- value { |data| DateTime.parse(data) }
9
+ unless [Date].include?(value.class)
10
+ value { |data| DateTime.parse(data) }
11
+ end
12
+
7
13
  value { |data| DateTime.new(data.year, data.month, data.day) }
8
14
 
9
15
  check_date_min_max
@@ -1,8 +1,13 @@
1
1
  require_relative 'date_type'
2
2
 
3
3
  class Typero::DatetimeType < Typero::DateType
4
+ opts :min, 'Smallest date allowed'
5
+ opts :max, 'Maximal date allowed'
6
+
4
7
  def set
5
- value { |data| DateTime.parse(data) }
8
+ unless [Time, DateTime].include?(value.class)
9
+ value { |data| DateTime.parse(data) }
10
+ end
6
11
 
7
12
  check_date_min_max
8
13
  end
@@ -2,11 +2,18 @@ class Typero::HashType < Typero::Type
2
2
  error :en, :not_hash_type_error, 'value is not hash type'
3
3
 
4
4
  def set
5
- error_for(:not_hash_type_error) unless value.is_a?(Hash)
5
+ if value.is_a?(String) && value[0,1] == '{'
6
+ @value = JSON.load(value)
7
+ end
8
+
9
+ @value ||= {}
10
+ @value.delete_if {|_, v| v.empty? }
11
+
12
+ error_for(:not_hash_type_error) unless @value.respond_to?(:keys) && @value.respond_to?(:values)
6
13
 
7
14
  if opts[:allow]
8
- for key in value.keys
9
- value.delete(key) unless opts[:allow].include?(key)
15
+ for key in @value.keys
16
+ @value.delete(key) unless opts[:allow].include?(key)
10
17
  end
11
18
  end
12
19
  end
@@ -0,0 +1,13 @@
1
+ class Typero::LocaleType < Typero::Type
2
+ error :en, :locale_bad_format, 'Locale "%s" is in bad format (should be xx or xx-xx)'
3
+
4
+ def set
5
+ error_for(:locale_bad_format, value) unless value =~ /^[\w\-]{2,5}$/
6
+ end
7
+
8
+ def db_schema
9
+ [:string, { limit: 5 }]
10
+ end
11
+ end
12
+
13
+
@@ -2,14 +2,17 @@ class Typero::ModelType < Typero::Type
2
2
  def set
3
3
  value(&:to_h)
4
4
 
5
- errors = []
5
+ errors = {}
6
+ schema = opts[:model].is_a?(Typero::Schema) ? opts[:model] : Typero.schema(opts[:model])
6
7
 
7
- schema = Typero.schema(opts[:model])
8
- schema.validate(value) do |field, error|
9
- errors.push '%s (%s)' % [error, field]
8
+ # by default models in schems are strict true (remove undefined keys)
9
+ schema.validate value, strict: true do |field, error|
10
+ errors[field] = error
10
11
  end
11
12
 
12
- raise TypeError.new errors.join(', ') if errors.first
13
+ @value.delete_if {|_, v| v.empty? }
14
+
15
+ raise TypeError.new errors.to_json if errors.keys.first
13
16
  end
14
17
 
15
18
  def db_schema
@@ -4,12 +4,13 @@
4
4
  class Typero::PointType < Typero::Type
5
5
  def set
6
6
  if value.include?('/@')
7
+ # extract value from google maps link
7
8
  point = value.split('/@', 2).last.split(',')
8
9
  value { [point[0], point[1]].join(',') }
9
10
  end
10
11
 
11
12
  if !value.include?('POINT') && value.include?(',')
12
- point = value.sub(/,\s*/, ' ')
13
+ point = value.sub(/\s*,\s*/, ' ')
13
14
  value { 'SRID=4326;POINT(%s)' % point }
14
15
  end
15
16
 
@@ -0,0 +1,20 @@
1
+ # Same as point, but we keep data as a float in Array
2
+
3
+ class Typero::SimplePointType < Typero::Type
4
+ def set
5
+ if value.include?('/@')
6
+ # extract value from google maps link
7
+ point = value.split('/@', 2).last.split(',')[0,2]
8
+ value { point }
9
+ end
10
+
11
+ if !value.include?('POINT') && value.include?(',')
12
+ value { value.split(/\s*,\s*/)[0,2] }
13
+ end
14
+ end
15
+
16
+ def db_schema
17
+ [:float, { array: true }]
18
+ end
19
+ end
20
+
@@ -7,6 +7,9 @@ class Typero::StringType < Typero::Type
7
7
  value(&:to_s)
8
8
  value(&:downcase) if opts[:downcase]
9
9
 
10
+ # this is database default for string type and it is good to define default unless defined
11
+ opts[:max] ||= 255
12
+
10
13
  error_for(:min_length_error, opts[:min], value.length) if opts[:min] && value.length < opts[:min]
11
14
  error_for(:max_length_error, opts[:max], value.length) if opts[:max] && value.length > opts[:max]
12
15
  end
@@ -0,0 +1,5 @@
1
+ require_relative 'datetime_type'
2
+
3
+ class Typero::TimeType < Typero::DatetimeType
4
+ end
5
+
@@ -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
+
data/lib/typero/typero.rb CHANGED
@@ -19,45 +19,82 @@
19
19
  module Typero
20
20
  extend self
21
21
 
22
- VERSION = File.read File.expand_path "../../.version", File.dirname(__FILE__)
22
+ VERSION ||= File.read File.expand_path "../../.version", File.dirname(__FILE__)
23
+ SCHEMAS ||= {}
23
24
 
24
25
  # 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
26
+ # Typero.type(:label) -> Typero::LabelType
27
+ # Typero.type(:label, 'Foo bar') -> "foo-bar"
28
+ def type klass_name, value = :_undefined, opts = {}, &block
29
+ klass = Typero::Type.load(klass_name)
30
+
31
+ if value == :_undefined
32
+ klass
33
33
  else
34
- raise error
34
+ begin
35
+ check = klass.new value, opts
36
+ check.get
37
+ rescue TypeError => error
38
+ if block
39
+ block.call error
40
+ false
41
+ else
42
+ raise error
43
+ end
44
+ end
35
45
  end
36
46
  end
47
+ alias :set :type
48
+
49
+ # type schema
50
+ # Typero.schema(:blog) { ... }
51
+
52
+ # type schema with option
53
+ # Typero.schema(:blog, type: :model) { ... }
37
54
 
38
- # load type schema
39
- def schema name=nil, &block
40
- # :user -> 'User'
41
- name = name.to_s.classify if name
55
+ # get schema
56
+ # Typero.schema(:blog)
57
+
58
+ # get schema with options (as array)
59
+ # Typero.schema(:blog, :with_schema)
60
+
61
+ # get all schema names with type: model
62
+ # Typero.schema(type: :model)
63
+ def schema name = nil, opts = nil, &block
64
+ klass = name.to_s.classify if name && !name.is_a?(Hash)
42
65
 
43
66
  if block_given?
44
67
  Typero::Schema.new(&block).tap do |schema|
45
- Typero::Schema::SCHEMAS[name] = schema if name
68
+ if klass
69
+ SCHEMAS[klass] = [schema, opts || {}]
70
+ end
46
71
  end
47
72
  else
48
- raise ArgumentErorr.new('Schema name not given') unless name
73
+ # Schema not given, get schema
74
+ if name.is_a?(Hash)
75
+ # Typero.schema type: :model
76
+ out = []
49
77
 
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
78
+ for key, _ in SCHEMAS
79
+ schema, opts = _
80
+ next unless opts[name.keys.first] == name.values.first
81
+ out.push key.classify
82
+ end
55
83
 
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
84
+ out
85
+ elsif klass
86
+ # Typero.schema :user
87
+ schema = SCHEMAS[klass]
88
+ schema ||= class_finder klass, :schema
89
+
90
+ if opts
91
+ schema
92
+ else
93
+ schema.respond_to?(:[]) ? schema[0] : schema
94
+ end
95
+ else
96
+ raise ArgumentError, 'Schema type not defined.'
97
+ end
61
98
  end
62
99
  end
63
100
 
@@ -78,13 +115,10 @@ module Typero
78
115
  for el in args
79
116
  for separator in ['_','/']
80
117
  klass = [name, el].join(separator).classify
81
-
82
- begin
83
- return klass.constantize
84
- rescue NameError => e
85
- nil
86
- end
118
+ return klass.constantize if const_defined? klass
87
119
  end
88
120
  end
121
+
122
+ nil
89
123
  end
90
124
  end
data/lib/typero.rb CHANGED
@@ -1,8 +1,9 @@
1
+ # require 'hash_wia'
2
+
1
3
  # base libs
2
4
  require_relative 'typero/typero'
3
5
  require_relative 'typero/schema'
4
6
  require_relative 'typero/params'
5
- require_relative 'typero/exporter'
6
7
  require_relative 'typero/type/type'
7
8
 
8
9
  # checker types
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.9.0
4
+ version: 0.9.5
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: 2020-06-02 00:00:00.000000000 Z
11
+ date: 2022-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fast_blank
@@ -34,7 +34,6 @@ files:
34
34
  - "./.version"
35
35
  - "./lib/adapters/sequel.rb"
36
36
  - "./lib/typero.rb"
37
- - "./lib/typero/exporter.rb"
38
37
  - "./lib/typero/params.rb"
39
38
  - "./lib/typero/schema.rb"
40
39
  - "./lib/typero/type/type.rb"
@@ -48,18 +47,22 @@ files:
48
47
  - "./lib/typero/type/types/image_type.rb"
49
48
  - "./lib/typero/type/types/integer_type.rb"
50
49
  - "./lib/typero/type/types/label_type.rb"
50
+ - "./lib/typero/type/types/locale_type.rb"
51
51
  - "./lib/typero/type/types/model_type.rb"
52
52
  - "./lib/typero/type/types/oib_type.rb"
53
53
  - "./lib/typero/type/types/point_type.rb"
54
+ - "./lib/typero/type/types/simple_point_type.rb"
54
55
  - "./lib/typero/type/types/string_type.rb"
55
56
  - "./lib/typero/type/types/text_type.rb"
57
+ - "./lib/typero/type/types/time_type.rb"
58
+ - "./lib/typero/type/types/timezone_type.rb"
56
59
  - "./lib/typero/type/types/url_type.rb"
57
60
  - "./lib/typero/typero.rb"
58
61
  homepage: https://github.com/dux/typero
59
62
  licenses:
60
63
  - MIT
61
64
  metadata: {}
62
- post_install_message:
65
+ post_install_message:
63
66
  rdoc_options: []
64
67
  require_paths:
65
68
  - lib
@@ -74,8 +77,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
77
  - !ruby/object:Gem::Version
75
78
  version: '0'
76
79
  requirements: []
77
- rubygems_version: 3.0.6
78
- signing_key:
80
+ rubygems_version: 3.2.3
81
+ signing_key:
79
82
  specification_version: 4
80
83
  summary: Ruby type system
81
84
  test_files: []
@@ -1,93 +0,0 @@
1
- module Typero
2
- class Exporter
3
- EXPORTERS ||= {}
4
-
5
- attr_accessor :response
6
-
7
- def initialize model, opts={}
8
- opts = { user: opts } unless opts.is_a?(Hash)
9
-
10
- opts[:exporter] ||= model.class
11
- opts[:depth] ||= 1
12
- opts[:current_depth] ||= 0
13
-
14
- exporter = opts.delete(:exporter).to_s.classify
15
-
16
- @model = model
17
- @opts = opts
18
- @block = EXPORTERS[exporter] || raise('Exporter "%s" (:%s) not found' % [block, block.underscore])
19
- @response = {}
20
- end
21
-
22
- def render
23
- instance_exec &@block
24
- @response
25
- end
26
-
27
- private
28
-
29
- def export object, opts={}
30
- if object.is_a?(Symbol)
31
- return property object, export(model.send(object))
32
- end
33
-
34
- return if @opts[:current_depth] >= @opts[:depth]
35
-
36
- @opts[:current_depth] += 1
37
- out = self.class.new(object, @opts.merge(opts)).render
38
- @opts[:current_depth] -= 1
39
- out
40
- end
41
-
42
- def property name, data=:_undefined
43
- if block_given?
44
- data = yield if data == :_undefined
45
- @response[name] = data
46
- else
47
- data = data == :_undefined ? model.send(name) : data
48
-
49
- if data.respond_to?(:export_json)
50
- data = data.export_json
51
- elsif data.respond_to?(:to_h)
52
- data = data.to_h
53
- end
54
-
55
- @response[name] = data
56
- end
57
- end
58
- alias :prop :property
59
-
60
- def hproperty name
61
- @response[name] = model[name]
62
- end
63
- alias :hprop :hproperty
64
-
65
- def namespace name, &block
66
-
67
- end
68
-
69
- def meta &block
70
- namespace :meta, &block
71
- end
72
-
73
- def model
74
- @model
75
- end
76
-
77
- # get current user from globals if globals defined
78
- def user
79
- if @opts[:user]
80
- @opts[:user]
81
- elsif defined?(User) && User.respond_to?(:current)
82
- User.current
83
- elsif defined?(Current) && Current.respond_to?(:user)
84
- Current.user
85
- elsif current_user = Thread.current[:current_user]
86
- current_user
87
- else
88
- nil
89
- end
90
- end
91
- end
92
- end
93
-