scimitar 1.10.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/scimitar/active_record_backed_resources_controller.rb +23 -98
  3. data/app/controllers/scimitar/application_controller.rb +13 -41
  4. data/app/controllers/scimitar/resource_types_controller.rb +2 -0
  5. data/app/controllers/scimitar/resources_controller.rb +2 -0
  6. data/app/controllers/scimitar/schemas_controller.rb +3 -366
  7. data/app/controllers/scimitar/service_provider_configurations_controller.rb +1 -0
  8. data/app/models/scimitar/complex_types/address.rb +6 -0
  9. data/app/models/scimitar/engine_configuration.rb +5 -15
  10. data/app/models/scimitar/error_response.rb +0 -12
  11. data/app/models/scimitar/lists/query_parser.rb +13 -113
  12. data/app/models/scimitar/resource_invalid_error.rb +1 -1
  13. data/app/models/scimitar/resources/base.rb +9 -53
  14. data/app/models/scimitar/resources/mixin.rb +59 -646
  15. data/app/models/scimitar/schema/address.rb +0 -1
  16. data/app/models/scimitar/schema/attribute.rb +5 -14
  17. data/app/models/scimitar/schema/base.rb +1 -1
  18. data/app/models/scimitar/schema/name.rb +2 -2
  19. data/app/models/scimitar/schema/user.rb +10 -10
  20. data/app/models/scimitar/schema/vdtp.rb +1 -1
  21. data/app/models/scimitar/service_provider_configuration.rb +3 -14
  22. data/config/initializers/scimitar.rb +3 -69
  23. data/lib/scimitar/engine.rb +12 -57
  24. data/lib/scimitar/support/hash_with_indifferent_case_insensitive_access.rb +10 -140
  25. data/lib/scimitar/version.rb +2 -2
  26. data/lib/scimitar.rb +2 -7
  27. data/spec/apps/dummy/app/controllers/mock_groups_controller.rb +1 -1
  28. data/spec/apps/dummy/app/models/mock_group.rb +1 -1
  29. data/spec/apps/dummy/app/models/mock_user.rb +9 -52
  30. data/spec/apps/dummy/config/application.rb +1 -0
  31. data/spec/apps/dummy/config/environments/test.rb +28 -5
  32. data/spec/apps/dummy/config/initializers/scimitar.rb +10 -90
  33. data/spec/apps/dummy/config/routes.rb +7 -28
  34. data/spec/apps/dummy/db/migrate/20210304014602_create_mock_users.rb +1 -11
  35. data/spec/apps/dummy/db/migrate/20210308044214_create_join_table_mock_groups_mock_users.rb +3 -8
  36. data/spec/apps/dummy/db/schema.rb +4 -12
  37. data/spec/controllers/scimitar/application_controller_spec.rb +3 -126
  38. data/spec/controllers/scimitar/resource_types_controller_spec.rb +2 -2
  39. data/spec/controllers/scimitar/schemas_controller_spec.rb +48 -344
  40. data/spec/models/scimitar/complex_types/address_spec.rb +4 -3
  41. data/spec/models/scimitar/complex_types/email_spec.rb +2 -0
  42. data/spec/models/scimitar/lists/query_parser_spec.rb +9 -146
  43. data/spec/models/scimitar/resources/base_spec.rb +71 -217
  44. data/spec/models/scimitar/resources/base_validation_spec.rb +5 -43
  45. data/spec/models/scimitar/resources/mixin_spec.rb +129 -1508
  46. data/spec/models/scimitar/schema/attribute_spec.rb +3 -22
  47. data/spec/models/scimitar/schema/base_spec.rb +1 -1
  48. data/spec/models/scimitar/schema/user_spec.rb +2 -12
  49. data/spec/requests/active_record_backed_resources_controller_spec.rb +66 -1016
  50. data/spec/requests/application_controller_spec.rb +3 -16
  51. data/spec/requests/engine_spec.rb +0 -75
  52. data/spec/spec_helper.rb +1 -9
  53. data/spec/support/hash_with_indifferent_case_insensitive_access_spec.rb +0 -108
  54. metadata +26 -37
  55. data/LICENSE.txt +0 -21
  56. data/README.md +0 -717
  57. data/lib/scimitar/support/utilities.rb +0 -111
  58. data/spec/apps/dummy/app/controllers/custom_create_mock_users_controller.rb +0 -25
  59. data/spec/apps/dummy/app/controllers/custom_replace_mock_users_controller.rb +0 -25
  60. data/spec/apps/dummy/app/controllers/custom_save_mock_users_controller.rb +0 -24
  61. data/spec/apps/dummy/app/controllers/custom_update_mock_users_controller.rb +0 -25
@@ -11,14 +11,11 @@ RSpec.describe Scimitar::ApplicationController do
11
11
  end
12
12
 
13
13
  context 'format handling' do
14
- it 'renders "OK" if the request does not provide any Content-Type value' do
14
+ it 'renders "not acceptable" if the request does not use SCIM type' do
15
15
  get '/CustomRequestVerifiers', params: { format: :html }
16
16
 
17
- expect(response).to have_http_status(:ok)
18
- parsed_body = JSON.parse(response.body)
19
- expect(parsed_body['request']['is_scim' ]).to eql(true)
20
- expect(parsed_body['request']['format' ]).to eql('application/scim+json')
21
- expect(parsed_body['request']['content_type']).to eql('application/scim+json') # Filled in by ApplicationController#require_scim
17
+ expect(response).to have_http_status(:not_acceptable)
18
+ expect(JSON.parse(response.body)['detail']).to eql('Only application/scim+json type is accepted.')
22
19
  end
23
20
 
24
21
  it 'renders 400 if given bad JSON' do
@@ -38,16 +35,6 @@ RSpec.describe Scimitar::ApplicationController do
38
35
  expect(parsed_body['request']['content_type']).to eql('application/scim+json')
39
36
  end
40
37
 
41
- it 'translates Content-Type with charset to Rails request format' do
42
- get '/CustomRequestVerifiers', headers: { 'CONTENT_TYPE' => 'application/scim+json; charset=utf-8' }
43
-
44
- expect(response).to have_http_status(:ok)
45
- parsed_body = JSON.parse(response.body)
46
- expect(parsed_body['request']['is_scim' ]).to eql(true)
47
- expect(parsed_body['request']['format' ]).to eql('application/scim+json')
48
- expect(parsed_body['request']['content_type']).to eql('application/scim+json; charset=utf-8')
49
- end
50
-
51
38
  it 'translates Rails request format to header' do
52
39
  get '/CustomRequestVerifiers', params: { format: :scim }
53
40
 
@@ -42,79 +42,4 @@ RSpec.describe Scimitar::Engine do
42
42
  expect(JSON.parse(response.body)['name']['familyName']).to eql('baz')
43
43
  end
44
44
  end # "context 'parameter parser' do"
45
-
46
- # These are unit tests rather than request tests; seems like a reasonable
47
- # place to put them in the absence of a standardised RSpec "engine" location.
48
- #
49
- context 'engine unit tests' do
50
- around :each do | example |
51
- license_schema = Class.new(Scimitar::Schema::Base) do
52
- def initialize(options = {})
53
- super(name: 'License', id: self.class.id(), description: 'Represents a License')
54
- end
55
- def self.id; 'urn:ietf:params:scim:schemas:license'; end
56
- def self.scim_attributes; []; end
57
- end
58
-
59
- @license_resource = Class.new(Scimitar::Resources::Base) do
60
- self.set_schema(license_schema)
61
- def self.endpoint; '/License'; end
62
- end
63
-
64
- example.run()
65
- ensure
66
- Scimitar::Engine.reset_default_resources()
67
- Scimitar::Engine.reset_custom_resources()
68
- end
69
-
70
- context '::resources, :add_custom_resource, ::set_default_resources' do
71
- it 'returns default resources' do
72
- expect(Scimitar::Engine.resources()).to match_array([Scimitar::Resources::User, Scimitar::Resources::Group])
73
- end
74
-
75
- it 'includes custom resources' do
76
- Scimitar::Engine.add_custom_resource(@license_resource)
77
- expect(Scimitar::Engine.resources()).to match_array([Scimitar::Resources::User, Scimitar::Resources::Group, @license_resource])
78
- end
79
-
80
- it 'notes changes to defaults' do
81
- Scimitar::Engine::set_default_resources([Scimitar::Resources::User])
82
- expect(Scimitar::Engine.resources()).to match_array([Scimitar::Resources::User])
83
- end
84
-
85
- it 'notes changes to defaults with custom resources added' do
86
- Scimitar::Engine::set_default_resources([Scimitar::Resources::User])
87
- Scimitar::Engine.add_custom_resource(@license_resource)
88
- expect(Scimitar::Engine.resources()).to match_array([Scimitar::Resources::User, @license_resource])
89
- end
90
-
91
- it 'rejects bad defaults' do
92
- expect {
93
- Scimitar::Engine::set_default_resources([@license_resource])
94
- }.to raise_error('Scimitar::Engine::set_default_resources: Only Scimitar::Resources::User, Scimitar::Resources::Group are supported')
95
- end
96
-
97
- it 'rejects empty defaults' do
98
- expect {
99
- Scimitar::Engine::set_default_resources([])
100
- }.to raise_error('Scimitar::Engine::set_default_resources: At least one resource must be given')
101
- end
102
- end # "context '::resources, :add_custom_resource, ::set_default_resources' do"
103
-
104
- context '#schemas' do
105
- it 'returns schema instances from ::resources' do
106
- expect(Scimitar::Engine).to receive(:resources).and_return([Scimitar::Resources::User, @license_resource])
107
-
108
- schema_instances = Scimitar::Engine.schemas()
109
- schema_classes = schema_instances.map(&:class)
110
-
111
- expect(schema_classes).to match_array([
112
- Scimitar::Schema::User,
113
- ScimSchemaExtensions::User::Enterprise,
114
- ScimSchemaExtensions::User::Manager,
115
- @license_resource.schemas.first
116
- ])
117
- end
118
- end # "context '#schemas' do"
119
- end # "context 'engine unit tests' do"
120
45
  end
data/spec/spec_helper.rb CHANGED
@@ -19,7 +19,7 @@ require File.expand_path('../apps/dummy/config/environment', __FILE__)
19
19
  abort("The Rails environment is running in production mode!") if Rails.env.production?
20
20
 
21
21
  require 'rspec/rails'
22
- require 'debug'
22
+ require 'byebug'
23
23
  require 'scimitar'
24
24
 
25
25
  # ============================================================================
@@ -30,7 +30,6 @@ RSpec.configure do | config |
30
30
  config.disable_monkey_patching!
31
31
  config.infer_spec_type_from_file_location!
32
32
  config.filter_rails_from_backtrace!
33
- config.raise_errors_for_deprecations!
34
33
 
35
34
  config.color = true
36
35
  config.tty = true
@@ -39,13 +38,6 @@ RSpec.configure do | config |
39
38
  config.use_transactional_fixtures = true
40
39
 
41
40
  Kernel.srand config.seed
42
-
43
- config.around :each do | example |
44
- original_engine_configuration = Scimitar.instance_variable_get('@engine_configuration')
45
- example.run()
46
- ensure
47
- Scimitar.instance_variable_set('@engine_configuration', original_engine_configuration)
48
- end
49
41
  end
50
42
 
51
43
  # ============================================================================
@@ -37,114 +37,6 @@ RSpec.describe Scimitar::Support::HashWithIndifferentCaseInsensitiveAccess do
37
37
  expect(subject()).to_not have_key('bar')
38
38
  end
39
39
  end # "context 'where keys set as symbols' do"
40
-
41
- context 'access and merging' do
42
- before :each do
43
- @original_subject = subject().to_h().dup()
44
- end
45
-
46
- it 'returns keys as Strings' do
47
- subject()[:foo] = 1
48
- subject()[:BAR] = 2
49
-
50
- expect(subject().keys).to match_array(@original_subject.keys + ['foo', 'BAR'])
51
- end
52
-
53
- it 'retains original case of keys' do
54
- subject()[:foo ] = 1
55
- subject()['FoO'] = 40 # (first-time-set case preservation test in passing)
56
- subject()[:BAR ] = 2
57
- subject()['Baz'] = 3
58
-
59
- expectation = @original_subject.merge({
60
- 'foo' => 40,
61
- 'BAR' => 2,
62
- 'Baz' => 3
63
- })
64
-
65
- expect(subject()).to eql(expectation)
66
- end
67
-
68
- it '#merge does not mutate the receiver and retains case of first-set keys' do
69
- subject()[:foo] = 1
70
- subject()[:BAR] = 2
71
-
72
- pre_merge_subject = subject().dup()
73
-
74
- result = subject().merge({:FOO => { 'onE' => 40 }, :Baz => 3})
75
- expectation = @original_subject.merge({
76
- 'foo' => { 'onE' => 40 },
77
- 'BAR' => 2,
78
- 'Baz' => 3
79
- })
80
-
81
- expect(subject()).to eql(pre_merge_subject)
82
- expect(result).to eql(expectation)
83
- end
84
-
85
- it '#merge! mutates the receiver retains case of first-set keys' do
86
- subject()[:foo] = 1
87
- subject()[:BAR] = 2
88
-
89
- subject().merge!({:FOO => { 'onE' => 40 }, :Baz => 3})
90
-
91
- expectation = @original_subject.merge({
92
- 'foo' => { 'onE' => 40 },
93
- 'BAR' => 2,
94
- 'Baz' => 3
95
- })
96
-
97
- expect(subject()).to eql(expectation)
98
- end
99
-
100
- it '#deep_merge does not mutate the receiver and retains nested key cases' do
101
- subject()[:foo] = { :one => 10 }
102
- subject()[:BAR] = 2
103
-
104
- pre_merge_subject = subject().dup()
105
-
106
- result = subject().deep_merge({:FOO => { 'ONE' => 40, :TWO => 20 }, :Baz => 3})
107
- expectation = @original_subject.merge({
108
- 'foo' => { 'one' => 40, 'TWO' => 20 },
109
- 'BAR' => 2,
110
- 'Baz' => 3
111
- })
112
-
113
- expect(subject()).to eql(pre_merge_subject)
114
- expect(result).to eql(expectation)
115
- end
116
-
117
- it '#deep_merge! mutates the receiver and retains nested key cases' do
118
- subject()[:foo] = { :one => 10 }
119
- subject()[:BAR] = 2
120
-
121
- subject().deep_merge!({:FOO => { 'ONE' => 40, :TWO => 20 }, :Baz => 3})
122
-
123
- expectation = @original_subject.merge({
124
- 'foo' => { 'one' => 40, 'TWO' => 20 },
125
- 'BAR' => 2,
126
- 'Baz' => 3
127
- })
128
-
129
- expect(subject()).to eql(expectation)
130
- end
131
-
132
- it 'retains indifferent behaviour after duplication' do
133
- subject()[:foo] = { 'onE' => 40 }
134
- subject()[:BAR] = 2
135
-
136
- duplicate = subject().dup()
137
- duplicate.merge!({ 'FOO' => true, 'baz' => 3 })
138
-
139
- expectation = @original_subject.merge({
140
- 'foo' => true,
141
- 'BAR' => 2,
142
- 'baz' => 3
143
- })
144
-
145
- expect(duplicate.to_h).to eql(expectation.to_h)
146
- end
147
- end # "context 'access and merging' do"
148
40
  end # "shared_examples 'an indifferent access, case insensitive Hash' do"
149
41
 
150
42
  context 'when created directly' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scimitar
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - RIPA Global
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-06-27 00:00:00.000000000 Z
12
+ date: 2022-03-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -17,112 +17,112 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '6.0'
20
+ version: '7.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '6.0'
27
+ version: '7.0'
28
28
  - !ruby/object:Gem::Dependency
29
- name: debug
29
+ name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '1.9'
34
+ version: '13.0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '1.9'
41
+ version: '13.0'
42
42
  - !ruby/object:Gem::Dependency
43
- name: rake
43
+ name: pg
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '13.2'
48
+ version: '1.2'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '13.2'
55
+ version: '1.2'
56
56
  - !ruby/object:Gem::Dependency
57
- name: pg
57
+ name: simplecov-rcov
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '1.5'
62
+ version: '0.2'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '1.5'
69
+ version: '0.2'
70
70
  - !ruby/object:Gem::Dependency
71
- name: simplecov-rcov
71
+ name: rdoc
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '0.3'
76
+ version: '6.4'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: '0.3'
83
+ version: '6.4'
84
84
  - !ruby/object:Gem::Dependency
85
- name: rdoc
85
+ name: rspec-rails
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '6.7'
90
+ version: '5.0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '6.7'
97
+ version: '5.0'
98
98
  - !ruby/object:Gem::Dependency
99
- name: rspec-rails
99
+ name: byebug
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '6.1'
104
+ version: '11.1'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
109
  - - "~>"
110
110
  - !ruby/object:Gem::Version
111
- version: '6.1'
111
+ version: '11.1'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: doggo
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '1.3'
118
+ version: '1.2'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '1.3'
125
+ version: '1.2'
126
126
  description: SCIM v2 support for Users and Groups in Ruby On Rails
127
127
  email:
128
128
  - dev@ripaglobal.com
@@ -130,8 +130,6 @@ executables: []
130
130
  extensions: []
131
131
  extra_rdoc_files: []
132
132
  files:
133
- - LICENSE.txt
134
- - README.md
135
133
  - Rakefile
136
134
  - app/controllers/scimitar/active_record_backed_resources_controller.rb
137
135
  - app/controllers/scimitar/application_controller.rb
@@ -195,14 +193,9 @@ files:
195
193
  - lib/scimitar.rb
196
194
  - lib/scimitar/engine.rb
197
195
  - lib/scimitar/support/hash_with_indifferent_case_insensitive_access.rb
198
- - lib/scimitar/support/utilities.rb
199
196
  - lib/scimitar/version.rb
200
- - spec/apps/dummy/app/controllers/custom_create_mock_users_controller.rb
201
197
  - spec/apps/dummy/app/controllers/custom_destroy_mock_users_controller.rb
202
- - spec/apps/dummy/app/controllers/custom_replace_mock_users_controller.rb
203
198
  - spec/apps/dummy/app/controllers/custom_request_verifiers_controller.rb
204
- - spec/apps/dummy/app/controllers/custom_save_mock_users_controller.rb
205
- - spec/apps/dummy/app/controllers/custom_update_mock_users_controller.rb
206
199
  - spec/apps/dummy/app/controllers/mock_groups_controller.rb
207
200
  - spec/apps/dummy/app/controllers/mock_users_controller.rb
208
201
  - spec/apps/dummy/app/models/mock_group.rb
@@ -251,7 +244,7 @@ metadata:
251
244
  homepage_uri: https://www.ripaglobal.com/
252
245
  source_code_uri: https://github.com/RIPAGlobal/scimitar/
253
246
  bug_tracker_uri: https://github.com/RIPAGlobal/scimitar/issues/
254
- changelog_uri: https://github.com/RIPAGlobal/scimitar/blob/v1/CHANGELOG.md
247
+ changelog_uri: https://github.com/RIPAGlobal/scimitar/blob/master/CHANGELOG.md
255
248
  post_install_message:
256
249
  rdoc_options: []
257
250
  require_paths:
@@ -267,17 +260,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
267
260
  - !ruby/object:Gem::Version
268
261
  version: '0'
269
262
  requirements: []
270
- rubygems_version: 3.5.4
263
+ rubygems_version: 3.3.3
271
264
  signing_key:
272
265
  specification_version: 4
273
266
  summary: SCIM v2 for Rails
274
267
  test_files:
275
- - spec/apps/dummy/app/controllers/custom_create_mock_users_controller.rb
276
268
  - spec/apps/dummy/app/controllers/custom_destroy_mock_users_controller.rb
277
- - spec/apps/dummy/app/controllers/custom_replace_mock_users_controller.rb
278
269
  - spec/apps/dummy/app/controllers/custom_request_verifiers_controller.rb
279
- - spec/apps/dummy/app/controllers/custom_save_mock_users_controller.rb
280
- - spec/apps/dummy/app/controllers/custom_update_mock_users_controller.rb
281
270
  - spec/apps/dummy/app/controllers/mock_groups_controller.rb
282
271
  - spec/apps/dummy/app/controllers/mock_users_controller.rb
283
272
  - spec/apps/dummy/app/models/mock_group.rb
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2021 RIPA Global
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.