scim-kit 0.2.6 → 0.2.7

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: 1a9111686b257670cfbc534ae4f9904bfe30b974b0f162a1106506ddbc643a4e
4
- data.tar.gz: dcc149efdc5dc6ac9e18447f9050454c1dde041769c4a5778b0355e76209f134
3
+ metadata.gz: 71f2c3e794e6d3203aacae277565ca28934f455ea4328e860d3b9227041a9e21
4
+ data.tar.gz: b98a7c46d298ca348c6ee51873e8dac278a6fb8dceb27bf918599f22af9263dc
5
5
  SHA512:
6
- metadata.gz: fdf0fa6dcecbd0fec7af66688de603fdde756ec733029012176a44df93d19d954b90a837c2c6536d0060dddf9d6a1ee80307fb50dc414d65195b4cb6bbc96833
7
- data.tar.gz: 7e796433ee04950e55470c36c1377103cef52535f913ca6456189bc4665e0701af24dd59941f7ec5c0ddbb3c47b14fcf38bdb6182405d8518ced2a39349e49dd
6
+ metadata.gz: 4025c01e0ce569a6c0567db2dc4d043229123543076824a7edb43cee21c66d0ce02403bded2c1dd07aa2eb6493cae612d7d8794423a2fbd76d859b7f1fa93b55
7
+ data.tar.gz: 15b39a9c896ee626a832b225070284d362266b83d50246de79ca67fddda306ec11d13291aecd243b3466bbf60ac924bee0765549d9ce8ae2cb3fa2e78898915c
@@ -5,25 +5,48 @@ module Scim
5
5
  module V2
6
6
  # Represents a SCIM Attribute
7
7
  class Attribute
8
+ include ::ActiveModel::Validations
8
9
  include Attributable
9
10
  include Templatable
10
11
  attr_reader :type
11
12
  attr_reader :_value
12
13
 
14
+ validate :presence_of_value, if: proc { |x| x.type.required }
15
+ validate :inclusion_of_value, if: proc { |x| x.type.canonical_values }
16
+ validate :validate_type
17
+
13
18
  def initialize(type:, value: nil)
14
19
  @type = type
15
20
  @_value = value
16
21
  define_attributes_for(type.attributes)
17
22
  end
18
23
 
24
+ def _assign(new_value, coerce: true)
25
+ @_value = coerce ? type.coerce(new_value) : new_value
26
+ end
27
+
19
28
  def _value=(new_value)
20
- @_value = type.coerce(new_value)
29
+ _assign(new_value, coerce: true)
30
+ end
31
+
32
+ private
33
+
34
+ def presence_of_value
35
+ return unless type.required && _value.blank?
36
+
37
+ errors.add(type.name, I18n.t('errors.messages.blank'))
38
+ end
39
+
40
+ def inclusion_of_value
41
+ return if type.canonical_values.include?(_value)
42
+
43
+ errors.add(type.name, I18n.t('errors.messages.inclusion'))
44
+ end
45
+
46
+ def validate_type
47
+ return if type.valid?(_value)
21
48
 
22
- if type.canonical_values &&
23
- !type.canonical_values.empty? &&
24
- !type.canonical_values.include?(new_value)
25
- raise ArgumentError, new_value
26
- end
49
+ errors.add(type.name, I18n.t('errors.messages.invalid'))
27
50
  end
28
51
  end
29
52
  end
@@ -6,23 +6,6 @@ module Scim
6
6
  # Represents a scim Attribute type
7
7
  class AttributeType
8
8
  include Templatable
9
- DATATYPES = {
10
- string: 'string',
11
- boolean: 'boolean',
12
- decimal: 'decimal',
13
- integer: 'integer',
14
- datetime: 'dateTime',
15
- binary: 'binary',
16
- reference: 'reference',
17
- complex: 'complex'
18
- }.freeze
19
- COERCION = {
20
- string: ->(x) { x.to_s },
21
- decimal: ->(x) { x.to_f },
22
- integer: ->(x) { x.to_i },
23
- datetime: ->(x) { x.is_a?(::String) ? DateTime.parse(x) : x },
24
- binary: ->(x) { Base64.strict_encode64(x) }
25
- }.freeze
26
9
  attr_accessor :canonical_values
27
10
  attr_accessor :case_exact
28
11
  attr_accessor :description
@@ -80,17 +63,52 @@ module Scim
80
63
  end
81
64
 
82
65
  def coerce(value)
83
- if type_is?(:boolean) && ![true, false].include?(value)
84
- raise ArgumentError, value
66
+ return value if complex?
67
+
68
+ if multi_valued
69
+ return value unless value.respond_to?(:to_a)
70
+
71
+ value.to_a.map do |x|
72
+ COERCION.fetch(type, ->(y) { y }).call(x)
73
+ end
74
+ else
75
+ COERCION.fetch(type, ->(x) { x }).call(value)
76
+ end
77
+ end
78
+
79
+ def valid?(value)
80
+ if multi_valued
81
+ return false unless value.respond_to?(:to_a)
82
+
83
+ return value.to_a.all? { |x| validate(x) }
85
84
  end
86
- return value if multi_valued
87
85
 
88
- coercion = COERCION[type]
89
- coercion ? coercion.call(value) : value
86
+ complex? ? valid_complex?(value) : valid_simple?(value)
90
87
  end
91
88
 
92
89
  private
93
90
 
91
+ def validate(value)
92
+ complex? ? valid_complex?(value) : valid_simple?(value)
93
+ end
94
+
95
+ def valid_simple?(value)
96
+ VALIDATIONS[type]&.call(value)
97
+ end
98
+
99
+ def valid_complex?(item)
100
+ return false unless item.is_a?(Hash)
101
+
102
+ item.keys.each do |key|
103
+ return false unless type_for(key)&.valid?(item[key])
104
+ end
105
+ end
106
+
107
+ def type_for(name)
108
+ name = name.to_s.underscore
109
+ attributes.find { |x| x.name.to_s.underscore == name }
110
+ end
111
+
94
112
  def string?
95
113
  type_is?(:string)
96
114
  end
@@ -5,6 +5,7 @@ module Scim
5
5
  module V2
6
6
  # Represents a SCIM Resource
7
7
  class Resource
8
+ include ::ActiveModel::Validations
8
9
  include Attributable
9
10
  include Templatable
10
11
 
@@ -12,6 +13,9 @@ module Scim
12
13
  attr_reader :meta
13
14
  attr_reader :schemas
14
15
 
16
+ validates_presence_of :id
17
+ validate :schema_validations
18
+
15
19
  def initialize(schemas:, location:)
16
20
  @meta = Meta.new(schemas[0].name, location)
17
21
  @schemas = schemas
@@ -19,6 +23,21 @@ module Scim
19
23
  define_attributes_for(schema.attributes)
20
24
  end
21
25
  end
26
+
27
+ private
28
+
29
+ def schema_validations
30
+ schemas.each do |schema|
31
+ schema.attributes.each do |type|
32
+ validate_attribute(type)
33
+ end
34
+ end
35
+ end
36
+
37
+ def validate_attribute(type)
38
+ attribute = attribute_for(type.name)
39
+ errors.copy!(attribute.errors) unless attribute.valid?
40
+ end
22
41
  end
23
42
  end
24
43
  end
@@ -13,6 +13,7 @@ module Scim
13
13
  def initialize(id:, name:, location:)
14
14
  @id = id
15
15
  @name = name
16
+ @description = ''
16
17
  @meta = Meta.new('Schema', location)
17
18
  @meta.created = @meta.last_modified = @meta.version = nil
18
19
  @attributes = []
data/lib/scim/kit/v2.rb CHANGED
@@ -21,6 +21,51 @@ module Scim
21
21
  module Kit
22
22
  # Version 2 of the SCIM RFC https://tools.ietf.org/html/rfc7644
23
23
  module V2
24
+ BASE64 = %r(
25
+ \A([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\Z
26
+ )x.freeze
27
+ BOOLEAN_VALUES = [true, false].freeze
28
+ DATATYPES = {
29
+ string: 'string',
30
+ boolean: 'boolean',
31
+ decimal: 'decimal',
32
+ integer: 'integer',
33
+ datetime: 'dateTime',
34
+ binary: 'binary',
35
+ reference: 'reference',
36
+ complex: 'complex'
37
+ }.freeze
38
+ COERCION = {
39
+ binary: lambda { |x|
40
+ VALIDATIONS[:binary].call(x) ? x : Base64.strict_encode64(x)
41
+ },
42
+ boolean: lambda { |x|
43
+ return true if x == 'true'
44
+ return false if x == 'false'
45
+
46
+ x
47
+ },
48
+ datetime: ->(x) { x.is_a?(::String) ? DateTime.parse(x) : x },
49
+ decimal: ->(x) { x.to_f },
50
+ integer: ->(x) { x.to_i },
51
+ string: ->(x) { x.to_s }
52
+ }.freeze
53
+ VALIDATIONS = {
54
+ binary: ->(x) { x.is_a?(String) && x.match?(BASE64) },
55
+ boolean: ->(x) { BOOLEAN_VALUES.include?(x) },
56
+ datetime: ->(x) { x.is_a?(DateTime) },
57
+ decimal: ->(x) { x.is_a?(Float) },
58
+ integer: lambda { |x|
59
+ begin
60
+ x&.integer?
61
+ rescue StandardError
62
+ false
63
+ end
64
+ },
65
+ reference: ->(x) { x =~ /\A#{URI.regexp(%w[http https])}\z/ },
66
+ string: ->(x) { x.is_a?(String) }
67
+ }.freeze
68
+
24
69
  class << self
25
70
  def configuration
26
71
  @configuration ||= ::Scim::Kit::V2::Configuration.new
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Scim
4
4
  module Kit
5
- VERSION = '0.2.6'
5
+ VERSION = '0.2.7'
6
6
  end
7
7
  end
data/lib/scim/kit.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_model'
4
+ require 'active_support/core_ext/hash/indifferent_access'
3
5
  require 'tilt'
4
6
  require 'tilt/jbuilder'
5
- require 'active_support/core_ext/hash/indifferent_access'
6
7
 
7
8
  require 'scim/kit/dynamic_attributes'
8
9
  require 'scim/kit/templatable'
data/scim-kit.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
 
13
13
  spec.summary = 'A SCIM library.'
14
14
  spec.description = 'A SCIM library.'
15
- spec.homepage = 'https://www.mokhan.ca/'
15
+ spec.homepage = 'https://www.github.com/mokhan/scim-kit'
16
16
  spec.license = 'MIT'
17
17
 
18
18
  # Specify which files should be added to the gem when it is released.
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  end
29
29
  spec.require_paths = ['lib']
30
30
 
31
+ spec.add_dependency 'activemodel', '>= 5.2.0'
31
32
  spec.add_dependency 'tilt', '~> 2.0'
32
33
  spec.add_dependency 'tilt-jbuilder', '~> 0.7'
33
34
  spec.add_development_dependency 'bundler', '~> 1.17'
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scim-kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - mo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-09 00:00:00.000000000 Z
11
+ date: 2019-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 5.2.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: tilt
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -207,7 +221,7 @@ files:
207
221
  - lib/scim/kit/v2/uniqueness.rb
208
222
  - lib/scim/kit/version.rb
209
223
  - scim-kit.gemspec
210
- homepage: https://www.mokhan.ca/
224
+ homepage: https://www.github.com/mokhan/scim-kit
211
225
  licenses:
212
226
  - MIT
213
227
  metadata: {}
@@ -226,7 +240,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
240
  - !ruby/object:Gem::Version
227
241
  version: '0'
228
242
  requirements: []
229
- rubygems_version: 3.0.1
243
+ rubygems_version: 3.0.2
230
244
  signing_key:
231
245
  specification_version: 4
232
246
  summary: A SCIM library.