looker-sdk 0.0.6 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/scripts/wait_for_looker.sh +35 -0
  3. data/.github/workflows/release.yml +47 -0
  4. data/.github/workflows/ruby-ci.yml +60 -0
  5. data/.gitignore +3 -0
  6. data/CHANGELOG.md +13 -0
  7. data/CODE_OF_CONDUCT.md +73 -26
  8. data/CONTRIBUTING.md +29 -0
  9. data/Gemfile +1 -1
  10. data/LICENSE.md +33 -0
  11. data/Makefile +81 -0
  12. data/Rakefile +24 -27
  13. data/authentication.md +3 -3
  14. data/examples/add_delete_users.rb +24 -0
  15. data/examples/change_credentials_email_address_for_users.rb +24 -0
  16. data/examples/convert_look_to_lookless_tile.rb +71 -0
  17. data/examples/create_credentials_email_for_users.rb +24 -0
  18. data/examples/delete_all_user_sessions.rb +24 -0
  19. data/examples/delete_credentials_google_for_users.rb +24 -0
  20. data/examples/generate_password_reset_tokens_for_users.rb +24 -0
  21. data/examples/ldap_roles_test.rb +24 -0
  22. data/examples/me.rb +24 -0
  23. data/examples/refresh_user_notification_addresses.rb +24 -0
  24. data/examples/roles_and_users_with_permission.rb +24 -0
  25. data/examples/sdk_setup.rb +24 -0
  26. data/examples/streaming_downloads.rb +24 -0
  27. data/examples/users_with_credentials_email.rb +24 -0
  28. data/examples/users_with_credentials_embed.rb +24 -0
  29. data/examples/users_with_credentials_google.rb +23 -1
  30. data/examples/users_with_credentials_google_without_credentials_email.rb +24 -0
  31. data/lib/looker-sdk/authentication.rb +27 -2
  32. data/lib/looker-sdk/client/dynamic.rb +61 -11
  33. data/lib/looker-sdk/client.rb +52 -16
  34. data/lib/looker-sdk/configurable.rb +28 -2
  35. data/lib/looker-sdk/default.rb +30 -0
  36. data/lib/looker-sdk/error.rb +28 -0
  37. data/lib/looker-sdk/rate_limit.rb +24 -0
  38. data/lib/looker-sdk/response/raise_error.rb +25 -3
  39. data/lib/looker-sdk/sawyer_patch.rb +25 -1
  40. data/lib/looker-sdk/version.rb +25 -1
  41. data/lib/looker-sdk.rb +50 -0
  42. data/looker-sdk.gemspec +4 -4
  43. data/readme.md +9 -5
  44. data/shell/Gemfile +1 -1
  45. data/shell/shell.rb +24 -0
  46. data/test/fixtures/{.netrc → .netrc.template} +0 -0
  47. data/test/helper.rb +56 -6
  48. data/test/looker/swagger.json +1 -1
  49. data/test/looker/test_client.rb +117 -5
  50. data/test/looker/test_dynamic_client.rb +75 -3
  51. data/test/looker/test_dynamic_client_agent.rb +24 -0
  52. metadata +27 -21
  53. data/.travis.yml +0 -16
  54. data/LICENSE +0 -21
@@ -5,7 +5,7 @@
5
5
  "title": "Looker API",
6
6
  "description": "This document is a representative sample (subset) of the Looker API that should only be used to unit test the Looker ruby sdk. To get the current, actual Looker API metadata visit /api/3.0/swagger.json on your Looker instance.",
7
7
  "contact": {
8
- "name": "Looker Team <support@looker.com>"
8
+ "name": "Looker Team <https://help.looker.com>"
9
9
  },
10
10
  "license": {
11
11
  "name": "EULA",
@@ -1,3 +1,27 @@
1
+ ############################################################################################
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2018 Looker Data Sciences, Inc.
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ # THE SOFTWARE.
23
+ ############################################################################################
24
+
1
25
  require_relative '../helper'
2
26
 
3
27
  describe LookerSDK::Client do
@@ -6,8 +30,52 @@ describe LookerSDK::Client do
6
30
  setup_sdk
7
31
  end
8
32
 
9
- after(:each) do
10
- teardown_sdk
33
+ base_url = ENV['LOOKERSDK_BASE_URL'] || 'https://localhost:20000'
34
+ verify_ssl = case ENV['LOOKERSDK_VERIFY_SSL']
35
+ when /false/i
36
+ false
37
+ when /f/i
38
+ false
39
+ when '0'
40
+ false
41
+ else
42
+ true
43
+ end
44
+ api_version = ENV['LOOKERSDK_API_VERSION'] || '4.0'
45
+ client_id = ENV['LOOKERSDK_CLIENT_ID']
46
+ client_secret = ENV['LOOKERSDK_CLIENT_SECRET']
47
+
48
+ opts = {}
49
+ if (client_id && client_secret) then
50
+ opts.merge!({
51
+ :client_id => client_id,
52
+ :client_secret => client_secret,
53
+ :api_endpoint => "#{base_url}/api/#{api_version}",
54
+ })
55
+ opts[:connection_options] = {:ssl => {:verify => false}} unless verify_ssl
56
+ else
57
+ opts.merge!({
58
+ :netrc => true,
59
+ :netrc_file => File.join(fixture_path, '.netrc'),
60
+ :connection_options => {:ssl => {:verify => false}},
61
+ })
62
+
63
+ end
64
+
65
+ describe "lazy load swagger" do
66
+ it "lazy loads swagger" do
67
+ LookerSDK.reset!
68
+ client = LookerSDK::Client.new(opts.merge({:lazy_swagger => true}))
69
+ assert_nil client.swagger
70
+ client.me()
71
+ assert client.swagger
72
+ end
73
+
74
+ it "loads swagger initially" do
75
+ LookerSDK.reset!
76
+ client = LookerSDK::Client.new(opts.merge({:lazy_swagger => false}))
77
+ assert client.swagger
78
+ end
11
79
  end
12
80
 
13
81
  describe "module configuration" do
@@ -26,8 +94,9 @@ describe LookerSDK::Client do
26
94
  end
27
95
 
28
96
  it "inherits the module configuration" do
29
- client = LookerSDK::Client.new
97
+ client = LookerSDK::Client.new(:lazy_swagger => true)
30
98
  LookerSDK::Configurable.keys.each do |key|
99
+ next if key == :lazy_swagger
31
100
  client.instance_variable_get(:"@#{key}").must_equal("Some #{key}")
32
101
  end
33
102
  end
@@ -39,7 +108,8 @@ describe LookerSDK::Client do
39
108
  :connection_options => {:ssl => {:verify => false}},
40
109
  :per_page => 40,
41
110
  :client_id => "looker_client_id",
42
- :client_secret => "client_secret2"
111
+ :client_secret => "client_secret2",
112
+ :lazy_swagger => true,
43
113
  }
44
114
  end
45
115
 
@@ -86,8 +156,13 @@ describe LookerSDK::Client do
86
156
 
87
157
  describe "with .netrc" do
88
158
  it "can read .netrc files" do
159
+ skip unless File.exist?(File.join(fixture_path, '.netrc'))
89
160
  LookerSDK.reset!
90
- client = LookerSDK::Client.new(:netrc => true, :netrc_file => File.join(fixture_path, '.netrc'))
161
+ client = LookerSDK::Client.new(
162
+ :lazy_swagger => true,
163
+ :netrc => true,
164
+ :netrc_file => File.join(fixture_path, '.netrc'),
165
+ )
91
166
  client.client_id.wont_be_nil
92
167
  client.client_secret.wont_be_nil
93
168
  end
@@ -98,6 +173,9 @@ describe LookerSDK::Client do
98
173
 
99
174
  before do
100
175
  LookerSDK.reset!
176
+ LookerSDK.configure do |c|
177
+ c.lazy_swagger = true
178
+ end
101
179
  end
102
180
 
103
181
  it "sets oauth token with .configure" do
@@ -208,6 +286,40 @@ describe LookerSDK::Client do
208
286
  end
209
287
  end
210
288
 
289
+ [
290
+ [:get, '/api/3.0/users/foo%2Fbar', false],
291
+ [:get, '/api/3.0/users/foo%252Fbar', true],
292
+ [:post, '/api/3.0/users/foo%2Fbar', false],
293
+ [:post, '/api/3.0/users/foo%252Fbar', true],
294
+ [:put, '/api/3.0/users/foo%2Fbar', false],
295
+ [:put, '/api/3.0/users/foo%252Fbar', true],
296
+ [:patch, '/api/3.0/users/foo%2Fbar', false],
297
+ [:patch, '/api/3.0/users/foo%252Fbar', true],
298
+ [:delete, '/api/3.0/users/foo%2Fbar', false],
299
+ [:delete, '/api/3.0/users/foo%252Fbar', true],
300
+ [:head, '/api/3.0/users/foo%2Fbar', false],
301
+ [:head, '/api/3.0/users/foo%252Fbar', true],
302
+ ].each do |method, path, encoded|
303
+ it "handles request path encoding" do
304
+ expected_path = '/api/3.0/users/foo%252Fbar'
305
+
306
+ resp = OpenStruct.new(:data => "hi", :status => 204)
307
+ mock = MiniTest::Mock.new.expect(:call, resp, [method, expected_path, nil, {}])
308
+ Sawyer::Agent.stubs(:new).returns(mock, mock)
309
+
310
+ sdk = LookerSDK::Client.new
311
+ if [:get, :delete, :head].include? method
312
+ args = [method, path, nil, encoded]
313
+ else
314
+ args = [method, path, nil, nil, encoded]
315
+ end
316
+ sdk.without_authentication do
317
+ value = sdk.public_send *args
318
+ assert_equal "hi", value
319
+ end
320
+ mock.verify
321
+ end
322
+ end
211
323
  end
212
324
 
213
325
  describe 'Sawyer date/time parsing patch' do
@@ -1,3 +1,27 @@
1
+ ############################################################################################
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2018 Looker Data Sciences, Inc.
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ # THE SOFTWARE.
23
+ ############################################################################################
24
+
1
25
  require_relative '../helper'
2
26
 
3
27
  class LookerDynamicClientTest < MiniTest::Spec
@@ -12,6 +36,7 @@ class LookerDynamicClientTest < MiniTest::Spec
12
36
  conn.adapter :rack, engine
13
37
  end
14
38
 
39
+ LookerSDK.reset!
15
40
  LookerSDK::Client.new do |config|
16
41
  config.swagger = swagger
17
42
  config.access_token = access_token
@@ -68,9 +93,30 @@ class LookerDynamicClientTest < MiniTest::Spec
68
93
 
69
94
  describe "swagger" do
70
95
 
96
+ it "raises when swagger.json can't be loaded" do
97
+ mock = MiniTest::Mock.new.expect(:call, nil) {raise "no swagger for you"}
98
+ mock.expect(:call, nil) {raise "still no swagger for you"}
99
+ err = assert_raises(RuntimeError) { sdk_client(nil, mock) }
100
+ assert_equal "still no swagger for you", err.message
101
+ end
102
+
103
+ it "loads swagger without authentication" do
104
+ resp = [200, {'Content-Type' => 'application/json'}, [default_swagger.to_json]]
105
+ mock = MiniTest::Mock.new.expect(:call, resp, [Hash])
106
+ sdk = sdk_client(nil, mock)
107
+ assert_equal default_swagger, sdk.swagger
108
+ end
109
+
110
+ it "loads swagger with authentication" do
111
+ resp = [200, {'Content-Type' => 'application/json'}, [default_swagger.to_json]]
112
+ mock = MiniTest::Mock.new.expect(:call, nil) {raise "login first!"}
113
+ mock.expect(:call, resp, [Hash])
114
+ sdk = sdk_client(nil, mock)
115
+ assert_equal default_swagger, sdk.swagger
116
+ end
117
+
71
118
  it "invalid method name" do
72
- mock = MiniTest::Mock.new.expect(:call, response){|env| confirm_env(env, method, path, body, query, content_type)}
73
- sdk = sdk_client(default_swagger, mock)
119
+ sdk = sdk_client(default_swagger, nil)
74
120
  assert_raises NoMethodError do
75
121
  sdk.this_method_name_doesnt_exist()
76
122
  end
@@ -80,18 +126,44 @@ class LookerDynamicClientTest < MiniTest::Spec
80
126
  end
81
127
  end
82
128
 
129
+ describe "operation maps" do
130
+ it "invoke by string operationId" do
131
+ verify(response, :get, '/api/3.0/user') do |sdk|
132
+ sdk.invoke('me')
133
+ end
134
+ end
135
+
136
+ it "invoke by symbol operationId" do
137
+ verify(response, :get, '/api/3.0/user') do |sdk|
138
+ sdk.invoke(:me)
139
+ end
140
+ end
141
+ end
142
+
83
143
  it "get no params" do
84
144
  verify(response, :get, '/api/3.0/user') do |sdk|
85
145
  sdk.me
86
146
  end
87
147
  end
88
148
 
89
- it "get with parms" do
149
+ it "get with params" do
90
150
  verify(response, :get, '/api/3.0/users/25') do |sdk|
91
151
  sdk.user(25)
92
152
  end
93
153
  end
94
154
 
155
+ it "get with params that need encoding" do
156
+ verify(response, :get, '/api/3.0/users/foo%2Fbar') do |sdk|
157
+ sdk.user("foo/bar")
158
+ end
159
+ end
160
+
161
+ it "get with params already encoded" do
162
+ verify(response, :get, '/api/3.0/users/foo%2Fbar') do |sdk|
163
+ sdk.user("foo%2Fbar")
164
+ end
165
+ end
166
+
95
167
  it "get with query" do
96
168
  verify(response, :get, '/api/3.0/user', '', {bar:"foo"}) do |sdk|
97
169
  sdk.me({bar:'foo'})
@@ -1,3 +1,27 @@
1
+ ############################################################################################
2
+ # The MIT License (MIT)
3
+ #
4
+ # Copyright (c) 2018 Looker Data Sciences, Inc.
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ # THE SOFTWARE.
23
+ ############################################################################################
24
+
1
25
  require_relative '../helper'
2
26
 
3
27
  describe LookerSDK::Client::Dynamic do
metadata CHANGED
@@ -1,70 +1,76 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: looker-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Looker
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-31 00:00:00.000000000 Z
11
+ date: 2021-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: sawyer
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - "~>"
17
18
  - !ruby/object:Gem::Version
18
19
  version: '0.8'
19
- name: sawyer
20
- prerelease: false
21
20
  type: :runtime
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.8'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: faraday
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - ">="
31
32
  - !ruby/object:Gem::Version
32
- version: 0.9.0
33
+ version: '1.2'
33
34
  - - "<"
34
35
  - !ruby/object:Gem::Version
35
- version: '1.0'
36
- name: faraday
37
- prerelease: false
36
+ version: '2.0'
38
37
  type: :runtime
38
+ prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - ">="
42
42
  - !ruby/object:Gem::Version
43
- version: 0.9.0
43
+ version: '1.2'
44
44
  - - "<"
45
45
  - !ruby/object:Gem::Version
46
- version: '1.0'
46
+ version: '2.0'
47
47
  description: Use this SDK to access the Looker API. The Looker API provides functions
48
48
  to perform administrative tasks such as provisioning users, configuring database
49
49
  connections, and so on. It also enables you to leverage the Looker data analytics
50
50
  engine to fetch data or render visualizations defined in your Looker data models.
51
51
  For more information, see https://looker.com.
52
- email: opensource+sdkruby@looker.com
52
+ email: drstrangelove@google.com
53
53
  executables: []
54
54
  extensions: []
55
55
  extra_rdoc_files: []
56
56
  files:
57
+ - ".github/scripts/wait_for_looker.sh"
58
+ - ".github/workflows/release.yml"
59
+ - ".github/workflows/ruby-ci.yml"
57
60
  - ".gitignore"
58
61
  - ".ruby-gemset"
59
- - ".travis.yml"
62
+ - CHANGELOG.md
60
63
  - CODE_OF_CONDUCT.md
64
+ - CONTRIBUTING.md
61
65
  - Gemfile
62
- - LICENSE
66
+ - LICENSE.md
67
+ - Makefile
63
68
  - Rakefile
64
69
  - authentication.md
65
70
  - examples/.netrc
66
71
  - examples/add_delete_users.rb
67
72
  - examples/change_credentials_email_address_for_users.rb
73
+ - examples/convert_look_to_lookless_tile.rb
68
74
  - examples/create_credentials_email_for_users.rb
69
75
  - examples/delete_all_user_sessions.rb
70
76
  - examples/delete_credentials_google_for_users.rb
@@ -98,18 +104,18 @@ files:
98
104
  - shell/readme.md
99
105
  - shell/shell.rb
100
106
  - streaming.md
101
- - test/fixtures/.netrc
107
+ - test/fixtures/.netrc.template
102
108
  - test/helper.rb
103
109
  - test/looker/swagger.json
104
110
  - test/looker/test_client.rb
105
111
  - test/looker/test_dynamic_client.rb
106
112
  - test/looker/test_dynamic_client_agent.rb
107
113
  - test/looker/user.json
108
- homepage: https://github.com/looker/looker-sdk-ruby
114
+ homepage: https://github.com/looker-open-source/looker-sdk-ruby
109
115
  licenses:
110
116
  - MIT
111
117
  metadata: {}
112
- post_install_message:
118
+ post_install_message:
113
119
  rdoc_options: []
114
120
  require_paths:
115
121
  - lib
@@ -117,7 +123,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
117
123
  requirements:
118
124
  - - ">="
119
125
  - !ruby/object:Gem::Version
120
- version: 1.9.3
126
+ version: '2.5'
121
127
  required_rubygems_version: !ruby/object:Gem::Requirement
122
128
  requirements:
123
129
  - - ">="
@@ -125,9 +131,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
131
  version: '0'
126
132
  requirements:
127
133
  - Looker version 4.0 or later
128
- rubyforge_project:
129
- rubygems_version: 2.6.13
130
- signing_key:
134
+ rubyforge_project:
135
+ rubygems_version: 2.7.6.2
136
+ signing_key:
131
137
  specification_version: 4
132
138
  summary: Looker Ruby SDK
133
139
  test_files: []
data/.travis.yml DELETED
@@ -1,16 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.9.3
4
- - 2.0
5
- - 2.1
6
- - 2.3.1
7
- - jruby-1.7.27
8
- - jruby-9.1.5.0
9
- cache:
10
- bundler: true
11
- matrix:
12
- fast_finish: true
13
- allow_failures:
14
- - rvm: ruby-head
15
- - rvm: jruby-head
16
- - rvm: ree
data/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2015 Looker Data Sciences, Inc.
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
13
- all 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
21
- THE SOFTWARE.