looker-sdk 0.0.5 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.travis.yml +1 -2
  4. data/CODE_OF_CONDUCT.md +46 -0
  5. data/Gemfile +1 -1
  6. data/LICENSE.md +33 -0
  7. data/Makefile +81 -0
  8. data/Rakefile +24 -27
  9. data/authentication.md +3 -3
  10. data/examples/add_delete_users.rb +24 -0
  11. data/examples/change_credentials_email_address_for_users.rb +24 -0
  12. data/examples/convert_look_to_lookless_tile.rb +71 -0
  13. data/examples/create_credentials_email_for_users.rb +24 -0
  14. data/examples/delete_all_user_sessions.rb +24 -0
  15. data/examples/delete_credentials_google_for_users.rb +24 -0
  16. data/examples/generate_password_reset_tokens_for_users.rb +24 -0
  17. data/examples/ldap_roles_test.rb +24 -0
  18. data/examples/me.rb +24 -0
  19. data/examples/refresh_user_notification_addresses.rb +24 -0
  20. data/examples/roles_and_users_with_permission.rb +24 -0
  21. data/examples/sdk_setup.rb +24 -0
  22. data/examples/streaming_downloads.rb +24 -0
  23. data/examples/users_with_credentials_email.rb +24 -0
  24. data/examples/users_with_credentials_embed.rb +33 -0
  25. data/examples/users_with_credentials_google.rb +23 -1
  26. data/examples/users_with_credentials_google_without_credentials_email.rb +24 -0
  27. data/lib/looker-sdk/authentication.rb +27 -2
  28. data/lib/looker-sdk/client/dynamic.rb +61 -11
  29. data/lib/looker-sdk/client.rb +86 -21
  30. data/lib/looker-sdk/configurable.rb +28 -2
  31. data/lib/looker-sdk/default.rb +30 -0
  32. data/lib/looker-sdk/error.rb +28 -0
  33. data/lib/looker-sdk/rate_limit.rb +24 -0
  34. data/lib/looker-sdk/response/raise_error.rb +25 -3
  35. data/lib/looker-sdk/sawyer_patch.rb +25 -1
  36. data/lib/looker-sdk/version.rb +25 -1
  37. data/lib/looker-sdk.rb +50 -0
  38. data/looker-sdk.gemspec +4 -3
  39. data/readme.md +12 -9
  40. data/shell/.netrc +3 -1
  41. data/shell/shell.rb +27 -2
  42. data/test/fixtures/{.netrc → .netrc.template} +0 -0
  43. data/test/helper.rb +26 -2
  44. data/test/looker/swagger.json +74 -3
  45. data/test/looker/test_client.rb +102 -6
  46. data/test/looker/test_dynamic_client.rb +101 -4
  47. data/test/looker/test_dynamic_client_agent.rb +24 -0
  48. metadata +50 -22
  49. data/LICENSE +0 -21
@@ -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,31 @@ describe LookerSDK::Client do
6
30
  setup_sdk
7
31
  end
8
32
 
9
- after(:each) do
10
- teardown_sdk
33
+ describe "lazy load swagger" do
34
+
35
+ it "lazy loads swagger" do
36
+ LookerSDK.reset!
37
+ client = LookerSDK::Client.new(
38
+ :lazy_swagger => true,
39
+ :netrc => true,
40
+ :netrc_file => File.join(fixture_path, '.netrc'),
41
+ :connection_options => {:ssl => {:verify => false}},
42
+ )
43
+ assert_nil client.swagger
44
+ client.me()
45
+ assert client.swagger
46
+ end
47
+
48
+ it "loads swagger initially" do
49
+ LookerSDK.reset!
50
+ client = LookerSDK::Client.new(
51
+ :lazy_swagger => false,
52
+ :netrc => true,
53
+ :netrc_file => File.join(fixture_path, '.netrc'),
54
+ :connection_options => {:ssl => {:verify => false}},
55
+ )
56
+ assert client.swagger
57
+ end
11
58
  end
12
59
 
13
60
  describe "module configuration" do
@@ -26,8 +73,9 @@ describe LookerSDK::Client do
26
73
  end
27
74
 
28
75
  it "inherits the module configuration" do
29
- client = LookerSDK::Client.new
76
+ client = LookerSDK::Client.new(:lazy_swagger => true)
30
77
  LookerSDK::Configurable.keys.each do |key|
78
+ next if key == :lazy_swagger
31
79
  client.instance_variable_get(:"@#{key}").must_equal("Some #{key}")
32
80
  end
33
81
  end
@@ -39,7 +87,8 @@ describe LookerSDK::Client do
39
87
  :connection_options => {:ssl => {:verify => false}},
40
88
  :per_page => 40,
41
89
  :client_id => "looker_client_id",
42
- :client_secret => "client_secret2"
90
+ :client_secret => "client_secret2",
91
+ :lazy_swagger => true,
43
92
  }
44
93
  end
45
94
 
@@ -87,7 +136,11 @@ describe LookerSDK::Client do
87
136
  describe "with .netrc" do
88
137
  it "can read .netrc files" do
89
138
  LookerSDK.reset!
90
- client = LookerSDK::Client.new(:netrc => true, :netrc_file => File.join(fixture_path, '.netrc'))
139
+ client = LookerSDK::Client.new(
140
+ :lazy_swagger => true,
141
+ :netrc => true,
142
+ :netrc_file => File.join(fixture_path, '.netrc'),
143
+ )
91
144
  client.client_id.wont_be_nil
92
145
  client.client_secret.wont_be_nil
93
146
  end
@@ -98,6 +151,9 @@ describe LookerSDK::Client do
98
151
 
99
152
  before do
100
153
  LookerSDK.reset!
154
+ LookerSDK.configure do |c|
155
+ c.lazy_swagger = true
156
+ end
101
157
  end
102
158
 
103
159
  it "sets oauth token with .configure" do
@@ -208,16 +264,56 @@ describe LookerSDK::Client do
208
264
  end
209
265
  end
210
266
 
267
+ [
268
+ [:get, '/api/3.0/users/foo%2Fbar', false],
269
+ [:get, '/api/3.0/users/foo%252Fbar', true],
270
+ [:post, '/api/3.0/users/foo%2Fbar', false],
271
+ [:post, '/api/3.0/users/foo%252Fbar', true],
272
+ [:put, '/api/3.0/users/foo%2Fbar', false],
273
+ [:put, '/api/3.0/users/foo%252Fbar', true],
274
+ [:patch, '/api/3.0/users/foo%2Fbar', false],
275
+ [:patch, '/api/3.0/users/foo%252Fbar', true],
276
+ [:delete, '/api/3.0/users/foo%2Fbar', false],
277
+ [:delete, '/api/3.0/users/foo%252Fbar', true],
278
+ [:head, '/api/3.0/users/foo%2Fbar', false],
279
+ [:head, '/api/3.0/users/foo%252Fbar', true],
280
+ ].each do |method, path, encoded|
281
+ it "handles request path encoding" do
282
+ expected_path = '/api/3.0/users/foo%252Fbar'
283
+
284
+ resp = OpenStruct.new(:data => "hi", :status => 204)
285
+ mock = MiniTest::Mock.new.expect(:call, resp, [method, expected_path, nil, {}])
286
+ Sawyer::Agent.stubs(:new).returns(mock, mock)
287
+
288
+ sdk = LookerSDK::Client.new
289
+ if [:get, :delete, :head].include? method
290
+ args = [method, path, nil, encoded]
291
+ else
292
+ args = [method, path, nil, nil, encoded]
293
+ end
294
+ sdk.without_authentication do
295
+ value = sdk.public_send *args
296
+ assert_equal "hi", value
297
+ end
298
+ mock.verify
299
+ end
300
+ end
211
301
  end
212
302
 
213
303
  describe 'Sawyer date/time parsing patch' do
214
304
  describe 'key matches time_field pattern' do
215
- it 'does not modify non-iso date/time string' do
305
+ it 'does not modify non-iso date/time string or integer fields' do
216
306
  values = {
217
307
  :test_at => '30 days',
218
308
  :test_on => 'July 20, 1969',
219
309
  :test_date => '1968-04-03 12:23:34', # this is not iso8601 format!
220
310
  :date => '2 months ago',
311
+ :test_int_at => 42,
312
+ :test_int_on => 42,
313
+ :test_int_date => 42.1,
314
+ :test_float_at => 42.1,
315
+ :test_float_on => 42.1,
316
+ :test_float_date => 42.1,
221
317
  }
222
318
 
223
319
  serializer = LookerSDK::Client.new.send(:serializer)
@@ -1,6 +1,30 @@
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
- describe LookerSDK::Client::Dynamic do
27
+ class LookerDynamicClientTest < MiniTest::Spec
4
28
 
5
29
  def access_token
6
30
  '87614b09dd141c22800f96f11737ade5226d7ba8'
@@ -12,6 +36,7 @@ describe LookerSDK::Client::Dynamic do
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
@@ -66,21 +91,79 @@ describe LookerSDK::Client::Dynamic do
66
91
  mock.verify
67
92
  end
68
93
 
69
-
70
94
  describe "swagger" do
71
95
 
72
- it "get" do
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
+
118
+ it "invalid method name" do
119
+ sdk = sdk_client(default_swagger, nil)
120
+ assert_raises NoMethodError do
121
+ sdk.this_method_name_doesnt_exist()
122
+ end
123
+
124
+ assert_raises NameError do
125
+ sdk.invoke(:this_method_name_doesnt_exist)
126
+ end
127
+ end
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
+
143
+ it "get no params" do
73
144
  verify(response, :get, '/api/3.0/user') do |sdk|
74
145
  sdk.me
75
146
  end
76
147
  end
77
148
 
78
- it "get with parms" do
149
+ it "get with params" do
79
150
  verify(response, :get, '/api/3.0/users/25') do |sdk|
80
151
  sdk.user(25)
81
152
  end
82
153
  end
83
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
+
84
167
  it "get with query" do
85
168
  verify(response, :get, '/api/3.0/user', '', {bar:"foo"}) do |sdk|
86
169
  sdk.me({bar:'foo'})
@@ -93,6 +176,20 @@ describe LookerSDK::Client::Dynamic do
93
176
  end
94
177
  end
95
178
 
179
+ it "get with array query param - string input (csv)" do
180
+ verify(response, :get, '/api/3.0/users/1/attribute_values','',{user_attribute_ids: '2,3,4'}) do |sdk|
181
+ sdk.user_attribute_user_values(1, {user_attribute_ids: '2,3,4'})
182
+ sdk.last_response.env.url.query.must_equal 'user_attribute_ids=2%2C3%2C4'
183
+ end
184
+ end
185
+
186
+ it "get with array query param - array input (multi[])" do
187
+ verify(response, :get, '/api/3.0/users/1/attribute_values','',{user_attribute_ids: ['2','3','4']}) do |sdk|
188
+ sdk.user_attribute_user_values(1, {user_attribute_ids: [2,3,4]})
189
+ sdk.last_response.env.url.query.must_equal 'user_attribute_ids%5B%5D=2&user_attribute_ids%5B%5D=3&user_attribute_ids%5B%5D=4'
190
+ end
191
+ end
192
+
96
193
  it "post" do
97
194
  verify(response, :post, '/api/3.0/users', {first_name:'Joe'}) do |sdk|
98
195
  sdk.create_user({first_name:'Joe'})
@@ -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,45 +1,72 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: looker-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Looker
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-10 00:00:00.000000000 Z
11
+ date: 2021-09-17 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
- version: '0.6'
19
- name: sawyer
19
+ version: '0.8'
20
+ type: :runtime
20
21
  prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '2.0'
21
37
  type: :runtime
38
+ prerelease: false
22
39
  version_requirements: !ruby/object:Gem::Requirement
23
40
  requirements:
24
- - - '='
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '1.2'
44
+ - - "<"
25
45
  - !ruby/object:Gem::Version
26
- version: '0.6'
27
- description: Use this SDK to access the Looker API. The Looker API provides functions to perform administrative tasks such as provisioning users, configuring database connections, and so on. It also enables you to leverage the Looker data analytics engine to fetch data or render visualizations defined in your Looker data models. For more information, see https://looker.com.
28
- email: support@looker.com
46
+ version: '2.0'
47
+ description: Use this SDK to access the Looker API. The Looker API provides functions
48
+ to perform administrative tasks such as provisioning users, configuring database
49
+ connections, and so on. It also enables you to leverage the Looker data analytics
50
+ engine to fetch data or render visualizations defined in your Looker data models.
51
+ For more information, see https://looker.com.
52
+ email: opensource+sdkruby@looker.com
29
53
  executables: []
30
54
  extensions: []
31
55
  extra_rdoc_files: []
32
56
  files:
33
- - .gitignore
34
- - .ruby-gemset
35
- - .travis.yml
57
+ - ".gitignore"
58
+ - ".ruby-gemset"
59
+ - ".travis.yml"
60
+ - CODE_OF_CONDUCT.md
36
61
  - Gemfile
37
- - LICENSE
62
+ - LICENSE.md
63
+ - Makefile
38
64
  - Rakefile
39
65
  - authentication.md
40
66
  - examples/.netrc
41
67
  - examples/add_delete_users.rb
42
68
  - examples/change_credentials_email_address_for_users.rb
69
+ - examples/convert_look_to_lookless_tile.rb
43
70
  - examples/create_credentials_email_for_users.rb
44
71
  - examples/delete_all_user_sessions.rb
45
72
  - examples/delete_credentials_google_for_users.rb
@@ -51,6 +78,7 @@ files:
51
78
  - examples/sdk_setup.rb
52
79
  - examples/streaming_downloads.rb
53
80
  - examples/users_with_credentials_email.rb
81
+ - examples/users_with_credentials_embed.rb
54
82
  - examples/users_with_credentials_google.rb
55
83
  - examples/users_with_credentials_google_without_credentials_email.rb
56
84
  - lib/looker-sdk.rb
@@ -72,7 +100,7 @@ files:
72
100
  - shell/readme.md
73
101
  - shell/shell.rb
74
102
  - streaming.md
75
- - test/fixtures/.netrc
103
+ - test/fixtures/.netrc.template
76
104
  - test/helper.rb
77
105
  - test/looker/swagger.json
78
106
  - test/looker/test_client.rb
@@ -83,25 +111,25 @@ homepage: https://github.com/looker/looker-sdk-ruby
83
111
  licenses:
84
112
  - MIT
85
113
  metadata: {}
86
- post_install_message:
114
+ post_install_message:
87
115
  rdoc_options: []
88
116
  require_paths:
89
117
  - lib
90
118
  required_ruby_version: !ruby/object:Gem::Requirement
91
119
  requirements:
92
- - - '>='
120
+ - - ">="
93
121
  - !ruby/object:Gem::Version
94
- version: 1.9.3
122
+ version: '2.5'
95
123
  required_rubygems_version: !ruby/object:Gem::Requirement
96
124
  requirements:
97
- - - '>='
125
+ - - ">="
98
126
  - !ruby/object:Gem::Version
99
127
  version: '0'
100
128
  requirements:
101
129
  - Looker version 4.0 or later
102
- rubyforge_project:
103
- rubygems_version: 2.4.5
104
- signing_key:
130
+ rubyforge_project:
131
+ rubygems_version: 2.7.6.2
132
+ signing_key:
105
133
  specification_version: 4
106
134
  summary: Looker Ruby SDK
107
135
  test_files: []
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.