typero 0.9.4 → 0.9.6

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
  SHA256:
3
- metadata.gz: 0f8d03e15d714e38774a8f817aaf02c710e3ddca8b65f9d413aefb01678bd31b
4
- data.tar.gz: ebd4cb0d01d43f7a93c3e2575daa832ba960dd8ece2a284676c763f4c43ef30c
3
+ metadata.gz: 54d18d3e66cf73fd0d6f6c42f319cb744fb3cc3f5e11e5e4a24b961c36792a34
4
+ data.tar.gz: 65f87c041f1a498c82d707d897d93eab7294a0d373a4d9aca5ec9aefe5da27b7
5
5
  SHA512:
6
- metadata.gz: 7a8dc1fdac410f59695f486860f078359a8344492335759b2df69f2fa382e3366000d70d994c4c05bdfa613c6c9dc207b66fefd2e4731f97dca97f94eda94b85
7
- data.tar.gz: e7c6581d6fc6558687b023505564c669f59ce8e5dc0a298392f83fab92e1f47b27704a0b7644143161c6a264d601c2ac2a382c8cc0bdfb54f97ea52789846891
6
+ metadata.gz: 1a63e1a470f0e21162f3c11e40fe4977b4432bb30d3f154330840f344b1dc91c49dc453213139b8e5299f4afe587ae3bf6427fa0aabedd0cc0910188e6463ca5
7
+ data.tar.gz: 0dd2e24597fa25a0543b851fa3218fc69e129fa671c3ed52edf6110994876c14e3ceb88002ebfec130782722b51dee184cf30dbb0012384da9eba7654d8db24c
data/.version CHANGED
@@ -1 +1 @@
1
- 0.9.4
1
+ 0.9.6
@@ -1,6 +1,6 @@
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
6
  Typero.schema self
@@ -48,5 +48,5 @@ module Sequel::Plugins::TyperoAttributes
48
48
  end
49
49
  end
50
50
 
51
- Sequel::Model.plugin :typero_attributes
51
+ # Sequel::Model.plugin :typero
52
52
 
data/lib/typero/params.rb CHANGED
@@ -1,4 +1,5 @@
1
- # Base class for schema validation
1
+ # Base class for schema validation.
2
+ # Accepts set of params and returns hash of porsed rules
2
3
 
3
4
  module Typero
4
5
  class Params
@@ -114,7 +115,7 @@ module Typero
114
115
  # db :timestamps
115
116
  # db :add_index, :code -> t.add_index :code
116
117
  def db *args
117
- @db_rules.push args
118
+ @db_rules.push args.unshift(:db_rule!)
118
119
  end
119
120
 
120
121
  # set :age, type: :integer -> integer :age
@@ -126,4 +127,4 @@ module Typero
126
127
  set field, *args, &block
127
128
  end
128
129
  end
129
- end
130
+ end
data/lib/typero/schema.rb CHANGED
@@ -1,17 +1,51 @@
1
+ # Typero.schema :user, type: :model do
2
+
3
+ # Typero.schema :some_name, type: :model, db: DB_LOG do
4
+ # set :name, String, req: true
5
+ # set :email, :email, req: true
6
+ # set :emails, [:email], min: 2
7
+ # end
8
+ #
9
+ # rules = Typero.schema :some_name
10
+ #
11
+ # or
12
+ #
13
+ # rules = Typero.schema do
14
+ # string :name, req: true # generic email string
15
+ # email :email, req: true # string of type email
16
+ # emails [:skills], min: 2 # list of emails in filed named "emails"
17
+ # end
18
+ #
19
+ # errors = rules.validate (@object || @hash)
20
+ # rules.valid? (@object)
21
+ # rules.validate(@object) {|errors| ... }
22
+
1
23
  module Typero
2
24
  class Schema
3
- SCHEMAS = {}
4
- TYPES = {}
25
+ SCHEMA_STORE ||= {}
26
+
27
+ attr_reader :klass
28
+ attr_reader :schema
29
+ attr_reader :opts
5
30
 
6
31
  # accepts dsl block to
7
- def initialize &block
8
- raise "Params not defined" unless block_given?
9
- @schema = Params.new &block
32
+ def initialize name, opts = nil, &block
33
+ if block
34
+ @opts = opts || {}
35
+ @schema = Params.new &block
36
+
37
+ if name
38
+ @klass = name
39
+ SCHEMA_STORE[name] = self
40
+ end
41
+ else
42
+ raise "Use Typero.schema(:name) to load stored schema"
43
+ end
10
44
  end
11
45
 
12
46
  # validates any instance object with hash variable interface
13
47
  # it also coarces values
14
- def validate object, options=nil
48
+ def validate object, options = nil
15
49
  @options = options || {}
16
50
  @object = object
17
51
  @errors = {}
@@ -67,11 +101,12 @@ module Typero
67
101
 
68
102
  # if value is not list of allowed values, raise error
69
103
  allowed = opts[:allow] || opts[:allowed] || opts[:values]
70
- if value && allowed && !allowed.include?(value)
104
+ if value && allowed && !allowed.map(&:to_s).include?(value.to_s)
71
105
  add_error field, 'Value "%s" is not allowed' % value, opts
72
106
  end
73
107
 
74
108
  value = check_filed_value field, value, opts
109
+
75
110
  add_required_error field, value, opts
76
111
  end
77
112
 
@@ -101,7 +136,7 @@ module Typero
101
136
  schema_opts = @schema.rules[field]
102
137
  opts[:array] = true if schema_opts[:array]
103
138
 
104
- total << [type, field, opts]
139
+ total << [field, type, opts]
105
140
  end
106
141
 
107
142
  out += @schema.db_rules
@@ -71,6 +71,10 @@ module Typero
71
71
 
72
72
  false
73
73
  end
74
+
75
+ def db_schema
76
+ new(nil).db_schema
77
+ end
74
78
  end
75
79
 
76
80
  ###
@@ -98,7 +102,11 @@ module Typero
98
102
  opts[:default].nil? ? default : opts[:default]
99
103
  else
100
104
  set
101
- error_for(:not_in_range, opts[:values].join(', ')) if opts[:values] && !opts[:values].include?(@value)
105
+
106
+ if opts[:values] && !opts[:values].map(&:to_s).include?(@value.to_s)
107
+ error_for(:not_in_range, opts[:values].join(', '))
108
+ end
109
+
102
110
  value
103
111
  end
104
112
  end
@@ -7,6 +7,7 @@ class Typero::HashType < Typero::Type
7
7
  end
8
8
 
9
9
  @value ||= {}
10
+ @value.delete_if {|_, v| v.empty? }
10
11
 
11
12
  error_for(:not_hash_type_error) unless @value.respond_to?(:keys) && @value.respond_to?(:values)
12
13
 
@@ -3,7 +3,6 @@ class Typero::ModelType < Typero::Type
3
3
  value(&:to_h)
4
4
 
5
5
  errors = {}
6
-
7
6
  schema = opts[:model].is_a?(Typero::Schema) ? opts[:model] : Typero.schema(opts[:model])
8
7
 
9
8
  # by default models in schems are strict true (remove undefined keys)
@@ -11,6 +10,8 @@ class Typero::ModelType < Typero::Type
11
10
  errors[field] = error
12
11
  end
13
12
 
13
+ @value.delete_if {|_, v| v.empty? }
14
+
14
15
  raise TypeError.new errors.to_json if errors.keys.first
15
16
  end
16
17
 
@@ -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
+
data/lib/typero/typero.rb CHANGED
@@ -1,25 +1,7 @@
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
1
  module Typero
20
2
  extend self
21
3
 
22
- VERSION = File.read File.expand_path "../../.version", File.dirname(__FILE__)
4
+ VERSION ||= File.read File.expand_path "../../.version", File.dirname(__FILE__)
23
5
 
24
6
  # check and coerce value
25
7
  # Typero.type(:label) -> Typero::LabelType
@@ -45,39 +27,39 @@ module Typero
45
27
  end
46
28
  alias :set :type
47
29
 
48
- # load or set type schema
30
+ # type schema
49
31
  # Typero.schema(:blog) { ... }
32
+
33
+ # type schema with option
50
34
  # Typero.schema(:blog, type: :model) { ... }
35
+
36
+ # get schema
51
37
  # Typero.schema(:blog)
38
+
39
+ # get all schema that matches any option
52
40
  # Typero.schema(type: :model)
53
- def schema name=nil, opts=nil, &block
41
+ def schema name = nil, opts = nil, &block
54
42
  klass = name.to_s.classify if name && !name.is_a?(Hash)
55
43
 
56
44
  if block_given?
57
- Typero::Schema.new(&block).tap do |schema|
58
- if klass
59
- Typero::Schema::SCHEMAS[klass] = schema
60
-
61
- if opts && opts[:type]
62
- Typero::Schema::TYPES[opts[:type]] ||= []
63
- Typero::Schema::TYPES[opts[:type]].push klass unless Typero::Schema::TYPES[opts[:type]].include?(klass)
64
- end
65
- end
66
- end
45
+ # Typero.schema type: :model, db: DB_LOG do
46
+ Typero::Schema.new(klass, opts, &block)
67
47
  else
68
- # Schema not given, get schema
69
48
  if name.is_a?(Hash)
70
- # Typero.schema type: :model
71
- if type = name[:type]
72
- Typero::Schema::TYPES[type]
49
+ # Schema not given, get schema
50
+ # Typero.schema type: :model
51
+ out = []
52
+
53
+ for schema in Schema::SCHEMA_STORE.values
54
+ if schema.opts[name.keys.first] == name.values.first
55
+ out.push schema.klass
56
+ end
73
57
  end
74
- elsif klass
75
- # Typero.schema :user
76
- schema = Typero::Schema::SCHEMAS[klass]
77
- schema ||= class_finder klass, :schema
78
- schema || nil
58
+
59
+ out
79
60
  else
80
- raise ArgumentError, 'Schema type not defined.'
61
+ # Typero.schema :user
62
+ Typero::Schema::SCHEMA_STORE[klass] || raise('Schema "%s" not found' % klass)
81
63
  end
82
64
  end
83
65
  end
@@ -88,21 +70,4 @@ module Typero
88
70
  rescue ArgumentError
89
71
  false
90
72
  end
91
-
92
- private
93
-
94
- # class_finder :user, :exporter, :representer
95
- # find first UserExporter, User::Exporter, User::Representer, UserRepresenter
96
- def class_finder *args
97
- name = args.shift.to_s.classify
98
-
99
- for el in args
100
- for separator in ['_','/']
101
- klass = [name, el].join(separator).classify
102
- return klass.constantize if const_defined? klass
103
- end
104
- end
105
-
106
- nil
107
- end
108
73
  end
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.4
4
+ version: 0.9.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dino Reic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-31 00:00:00.000000000 Z
11
+ date: 2022-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fast_blank
@@ -51,6 +51,7 @@ files:
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"
56
57
  - "./lib/typero/type/types/time_type.rb"
@@ -76,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
77
  - !ruby/object:Gem::Version
77
78
  version: '0'
78
79
  requirements: []
79
- rubygems_version: 3.2.22
80
+ rubygems_version: 3.2.3
80
81
  signing_key:
81
82
  specification_version: 4
82
83
  summary: Ruby type system