scimitar 1.10.0 → 2.0.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.
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.