activerecord-import 0.23.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/test.yaml +107 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +214 -4
  5. data/Gemfile +11 -9
  6. data/LICENSE +21 -56
  7. data/README.markdown +574 -22
  8. data/Rakefile +2 -1
  9. data/activerecord-import.gemspec +4 -4
  10. data/benchmarks/benchmark.rb +5 -1
  11. data/benchmarks/schema/{mysql_schema.rb → mysql2_schema.rb} +0 -0
  12. data/gemfiles/5.0.gemfile +1 -0
  13. data/gemfiles/5.1.gemfile +1 -0
  14. data/gemfiles/5.2.gemfile +2 -2
  15. data/gemfiles/6.0.gemfile +2 -0
  16. data/gemfiles/6.1.gemfile +2 -0
  17. data/gemfiles/7.0.gemfile +1 -0
  18. data/lib/activerecord-import/active_record/adapters/jdbcmysql_adapter.rb +4 -4
  19. data/lib/activerecord-import/adapters/abstract_adapter.rb +7 -1
  20. data/lib/activerecord-import/adapters/mysql_adapter.rb +8 -11
  21. data/lib/activerecord-import/adapters/postgresql_adapter.rb +14 -16
  22. data/lib/activerecord-import/adapters/sqlite3_adapter.rb +125 -8
  23. data/lib/activerecord-import/base.rb +9 -1
  24. data/lib/activerecord-import/import.rb +269 -123
  25. data/lib/activerecord-import/synchronize.rb +2 -2
  26. data/lib/activerecord-import/value_sets_parser.rb +2 -0
  27. data/lib/activerecord-import/version.rb +1 -1
  28. data/lib/activerecord-import.rb +1 -0
  29. data/test/adapters/makara_postgis.rb +1 -0
  30. data/test/{travis → github}/database.yml +3 -1
  31. data/test/import_test.rb +138 -8
  32. data/test/makara_postgis/import_test.rb +8 -0
  33. data/test/models/animal.rb +6 -0
  34. data/test/models/card.rb +3 -0
  35. data/test/models/customer.rb +6 -0
  36. data/test/models/deck.rb +6 -0
  37. data/test/models/order.rb +6 -0
  38. data/test/models/playing_card.rb +2 -0
  39. data/test/models/user.rb +3 -1
  40. data/test/models/user_token.rb +4 -0
  41. data/test/schema/generic_schema.rb +30 -0
  42. data/test/schema/mysql2_schema.rb +19 -0
  43. data/test/schema/postgresql_schema.rb +16 -0
  44. data/test/schema/sqlite3_schema.rb +13 -0
  45. data/test/support/factories.rb +8 -8
  46. data/test/support/generate.rb +6 -6
  47. data/test/support/mysql/import_examples.rb +12 -0
  48. data/test/support/postgresql/import_examples.rb +100 -2
  49. data/test/support/shared_examples/on_duplicate_key_update.rb +54 -0
  50. data/test/support/shared_examples/recursive_import.rb +74 -4
  51. data/test/support/sqlite3/import_examples.rb +189 -25
  52. data/test/test_helper.rb +28 -3
  53. metadata +37 -18
  54. data/.travis.yml +0 -62
  55. data/gemfiles/3.2.gemfile +0 -2
  56. data/gemfiles/4.0.gemfile +0 -2
  57. data/gemfiles/4.1.gemfile +0 -2
  58. data/test/schema/mysql_schema.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 25b9f077b6e370081a1c29b59ba3ce50be68659c
4
- data.tar.gz: adc5eff35697da10f5a6e3922980dfdd3ea849a6
2
+ SHA256:
3
+ metadata.gz: 71623b61f085adce5254fc92ae524f595594cb5a960bb4bf0cb46d961ca9d203
4
+ data.tar.gz: ce2200678685afd85dc0a887d967bae7e2e4220942ab2f8fc34bb949b8f5a31b
5
5
  SHA512:
6
- metadata.gz: c8211cc8ed17997e92e944c1d36533ce501d18401da25df549e700fdd37e4223f5bcef2a342b3c8aa74af31d23d16c932a6e39b2445dba83dc8866575da16196
7
- data.tar.gz: 293a3eb933956824ec0fd0b9dfe760ba43d262b3154a5286f3cb33d677ae0c2949effd9c92006dbaa97f5748d97b289bd2483c5b68933ca8e2d8698c18d26111
6
+ metadata.gz: 71bdd79b977164223d77c77ec796ac3914124318bb377c8aa044bc8085d0f7ba9536e35b99b6a670b0a4c825e4dfe49aef5a10626b92109b2ce7dd8cd529dbb1
7
+ data.tar.gz: 89db7ca7f321a473391d2083a2dc6cb4fe8614069441c2a16601a0a3e4ab848e889eafba67b53fc2042d60b7095aab50926f4795d07930c0c90820527f07c28c
@@ -0,0 +1,107 @@
1
+ name: Test
2
+ on: [push, pull_request]
3
+ jobs:
4
+ test:
5
+ services:
6
+ postgres:
7
+ image: postgis/postgis:10-2.5
8
+ env:
9
+ POSTGRES_USER: postgres
10
+ POSTGRES_PASSWORD: postgres
11
+ ports:
12
+ - 5432:5432
13
+ # Set health checks to wait until postgres has started
14
+ options: >-
15
+ --health-cmd pg_isready
16
+ --health-interval 10s
17
+ --health-timeout 5s
18
+ --health-retries 5
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ ruby:
23
+ - 3.1
24
+ env:
25
+ - AR_VERSION: '7.0'
26
+ RUBYOPT: --enable-frozen-string-literal
27
+ - AR_VERSION: 6.1
28
+ RUBYOPT: --enable-frozen-string-literal
29
+ include:
30
+ - ruby: '3.0'
31
+ env:
32
+ AR_VERSION: '7.0'
33
+ - ruby: '3.0'
34
+ env:
35
+ AR_VERSION: 6.1
36
+ - ruby: 2.7
37
+ env:
38
+ AR_VERSION: '7.0'
39
+ - ruby: 2.7
40
+ env:
41
+ AR_VERSION: 6.1
42
+ - ruby: 2.7
43
+ env:
44
+ AR_VERSION: '6.0'
45
+ - ruby: 2.6
46
+ env:
47
+ AR_VERSION: 5.2
48
+ - ruby: 2.6
49
+ env:
50
+ AR_VERSION: 5.1
51
+ - ruby: 2.4
52
+ env:
53
+ AR_VERSION: '5.0'
54
+ - ruby: 2.4
55
+ env:
56
+ AR_VERSION: 4.2
57
+ runs-on: ubuntu-latest
58
+ env:
59
+ AR_VERSION: ${{ matrix.env.AR_VERSION }}
60
+ DB_DATABASE: activerecord_import_test
61
+ steps:
62
+ - uses: actions/checkout@v2
63
+ - uses: ruby/setup-ruby@v1
64
+ with:
65
+ ruby-version: ${{ matrix.ruby }}
66
+ bundler-cache: true
67
+ - name: Set up databases
68
+ run: |
69
+ sudo /etc/init.d/mysql start
70
+ mysql -e 'CREATE DATABASE ${{ env.DB_DATABASE }} CHARACTER SET utf8 COLLATE utf8_general_ci;' -u root -proot
71
+ psql -h localhost -U postgres -c 'create database ${{ env.DB_DATABASE }};'
72
+ psql -h localhost -U postgres -d ${{ env.DB_DATABASE }} -c 'create extension if not exists hstore;'
73
+ psql -h localhost -U postgres -c 'create extension if not exists postgis;'
74
+ psql -h localhost -U postgres -c 'create extension if not exists "uuid-ossp";'
75
+ cp test/github/database.yml test/database.yml
76
+ env:
77
+ PGPASSWORD: postgres
78
+ - name: Run tests with mysql2
79
+ run: |
80
+ bundle exec rake test:mysql2
81
+ bundle exec rake test:mysql2_makara
82
+ bundle exec rake test:mysql2spatial
83
+ - name: Run tests with postgresql
84
+ run: |
85
+ bundle exec rake test:postgis
86
+ bundle exec rake test:postgresql
87
+ bundle exec rake test:postgresql_makara
88
+ - name: Run tests with seamless_database_pool
89
+ run: |
90
+ bundle exec rake test:seamless_database_pool
91
+ if: ${{ matrix.ruby < '3.0' }}
92
+ - name: Run tests with sqlite
93
+ run: |
94
+ bundle exec rake test:spatialite
95
+ bundle exec rake test:sqlite3
96
+ lint:
97
+ runs-on: ubuntu-latest
98
+ env:
99
+ AR_VERSION: '7.0'
100
+ steps:
101
+ - uses: actions/checkout@v2
102
+ - uses: ruby/setup-ruby@v1
103
+ with:
104
+ ruby-version: 2.7
105
+ bundler-cache: true
106
+ - name: Run Rubocop
107
+ run: bundle exec rubocop
data/.gitignore CHANGED
@@ -24,6 +24,7 @@ pkg
24
24
  log/*.log
25
25
  test.db
26
26
  test/database.yml
27
+ benchmarks/log/
27
28
 
28
29
  .ruby-*
29
30
  .bundle/
data/CHANGELOG.md CHANGED
@@ -1,11 +1,221 @@
1
+ ## Changes in 1.4.0
2
+
3
+ ### New Features
4
+
5
+ * Enable compatibility with frozen string literals. Thanks to @desheikh via \##760.
6
+
7
+ ## Changes in 1.3.0
8
+
9
+ ### Fixes
10
+
11
+ * Ensure correct timestamp values are returned for models after insert. Thanks to @kos1kov via \##756.
12
+ * Restore database_version method to public scope. Thanks to @beauraF via \##753.
13
+
14
+ ### New Features
15
+
16
+ * Add support for ActiveRecord 7.0. Thanks to @nickhammond, @ryanwood, @jkowens via \##749 and \##752.
17
+ * Add support for compound foreign keys. Thanks to @Uladzimiro via \##750.
18
+ * Add support for :recursive combined with on_duplicate_key_update: :all. Thanks to @deathwish via \##746.
19
+
20
+ ## Changes in 1.2.0
21
+
22
+ ### Fixes
23
+
24
+ * Update JDBC MySQL adapter to use mysql2 connection adapter. Thanks to @terencechow via \##744.
25
+ * Fix importing STI models with ActiveRecord 6. Thanks to @clemens1483 via \##743.
26
+ * Use polymorphic_name instead of base_class.name for imports. Thanks to @kmhajjar via \##741.
27
+ * Fix compatibility issue with composite primary keys. Thanks to @dlanileonardo via \##737.
28
+ * Prevent double validation of associations on recursive import.
29
+
30
+ ## Changes in 1.1.0
31
+
32
+ ### New Features
33
+
34
+ * Add batch progress reporting. Thanks to @gee-forr via \##729.
35
+
36
+ ## Changes in 1.0.8
37
+
38
+ ### Fixes
39
+
40
+ * Use correct method for clearing query cache. Thanks to @EtienneDepaulis via \##719.
41
+
42
+ ## Changes in 1.0.7
43
+
44
+ ### New Features
45
+
46
+ * Use @@max_allowed_packet session variable instead of querying SHOW VARIABLES. Thanks to @diclophis via \#706.
47
+ * Add option :track_validation_failures. When this is set to true, failed_instances will be an array of arrays, with each inner array having the form [:index_in_dataset, :object_with_errors]. Thanks to @rorymckinley via \#684.
48
+
49
+ ### Fixes
50
+
51
+ * Prevent mass-assignment errors in Rails strict mode. Thanks to @diclophis via \##709.
52
+
53
+ ## Changes in 1.0.6
54
+
55
+ ### Fixes
56
+
57
+ * Handle after_initialize callbacks. Thanks to @AhMohsen46 via \#691 and
58
+ \#692.
59
+ * Fix regression introduced in 1.0.4. Explicitly allow adapters to
60
+ support on duplicate key update. Thanks to @dsobiera, @jkowens via \#696.
61
+
62
+ ## Changes in 1.0.5
63
+
64
+ ### Fixes
65
+
66
+ * Allow serialized attributes to be returned from import. Thanks to @timanovsky, @jkowens via \#660.
67
+ * Return ActiveRecord::Connection from
68
+ ActiveRecord::Base#establish_connection. Thanks to @reverentF via
69
+ \#663.
70
+ * Support PostgreSQL array. Thanks to @ujihisa via \#669.
71
+ * Skip loading association ids when column changed. Thanks to @Aristat
72
+ via \#673.
73
+
74
+ ## Changes in 1.0.4
75
+
76
+ ### Fixes
77
+
78
+ * Use prepend pattern for ActiveRecord::Base#establish_connection patching. Thanks to @dombesz via \#648.
79
+ * Fix NoMethodError when using PostgreSQL ENUM types. Thanks to @sebcoetzee via \#651.
80
+ * Fix issue updating optimistic lock in Postgres. Thanks to @timanovsky
81
+ via \#656.
82
+
83
+ ## Changes in 1.0.3
84
+
85
+ ### New Features
86
+
87
+ * Add support for ActiveRecord 6.1.0.alpha. Thanks to @imtayadeway via
88
+ \#642.
89
+
90
+ ### Fixes
91
+
92
+ * Return an empty array for results instead of nil when importing empty
93
+ array. Thanks to @gyfis via \#636.
94
+
95
+ ## Changes in 1.0.2
96
+
97
+ ### New Features
98
+
99
+ * Add support for CockroachDB adapter. Thanks to @willie via \#605.
100
+ * Add support for ActiveRecord 6.0.0.rc1. Thanks to @madeindjs, @bill-filler,
101
+ @jkowens via \#619, \#623.
102
+
103
+ ### Fixes
104
+
105
+ * Fixes NoMethodError when attempting to use nil logger. Thanks to @MattMecel,
106
+ @khiav22357.
107
+ * Fix issue validating STI models. Thanks to @thejbsmith, @jkowens via
108
+ \#626.
109
+
110
+ ## Changes in 1.0.1
111
+
112
+ ### Fixes
113
+
114
+ * Raise an error with a helpful message if array of values exceeds the number of
115
+ columns for a table. Thanks to @golddranks via \#589.
116
+ * Properly check if model responds to import before creating alias.
117
+ Thanks to @jcw- via \#591.
118
+ * No longer pass :returning option to child associations on recursive
119
+ import. Thanks to @dmitriy-kiriyenko via \#595.
120
+ * Fix import issue for models with Postgresql json/jsonb fields. Thanks
121
+ to @stokarenko via \#594.
122
+ * Fix issue importing models with timestamps that contain timezone
123
+ information. Thanks to @dekaikiwi, @jkowens via \#598.
124
+ * Ignore :no_returning when using :recursive option. Thanks to @dgollahon, @jkowens
125
+ via \#599.
126
+
127
+ ## Changes in 1.0.0
128
+
129
+ ### New Features
130
+
131
+ * Move ActiveRecord::Dirty changes to previous_changes after import.
132
+ Thanks to @stokarenko via \#584.
133
+
134
+ ### Breaking Changes
135
+
136
+ * Previously :on_duplicate_key_update was enabled by default for MySQL.
137
+ The update timestamp columns (updated_at, updated_on) would be updated
138
+ on duplicate key. This was behavior is inconsistent with the other database
139
+ adapters and could also be considered surprising. Going forward it must
140
+ be explicitly enabled. See \#548.
141
+
142
+ ## Changes in 0.28.2
143
+
144
+ ### Fixes
145
+
146
+ * Fix issue where validations where not working in certain scenarios.
147
+ Thanks to @CASIXx1 via \#579.
148
+
149
+ ## Changes in 0.28.1
150
+
151
+ ### Fixes
152
+
153
+ * Fix issue where ActiveRecord presence validations were being mutated.
154
+ Limited custom presence validation to bulk imports.
155
+
156
+ ## Changes in 0.28.0
157
+
158
+ ### New Features
159
+
160
+ * Allow updated timestamps to be manually set.Thanks to @Rob117, @jkowens via \#570.
161
+
162
+ ### Fixes
163
+
164
+ * Fix validating presence of belongs_to associations. Existence
165
+ of the parent record is not validated, but the foreign key field
166
+ cannot be empty. Thanks to @Rob117, @jkowens via \#575.
167
+
168
+ ## Changes in 0.27.0
169
+
170
+ ### New Features
171
+
172
+ * Add "secret" option validate_uniqueness to enable uniqueness
173
+ validators when validating import. This is not a recommended
174
+ approach (See #228), but is being added back in for projects
175
+ that depended on this feature. Thanks to @jkowens via \#554.
176
+
177
+ ## Changes in 0.26.0
178
+
179
+ ### New Features
180
+
181
+ * Add on_duplicate_key_update for SQLite. Thanks to @jkowens via \#542.
182
+ * Add option to update all fields on_duplicate_key_update. Thanks to @aimerald, @jkowens via \#543.
183
+
184
+ ### Fixes
185
+
186
+ * Handle deeply frozen options hashes. Thanks to @jturkel via \#546.
187
+ * Switch from FactoryGirl to FactoryBot. Thanks to @koic via \#547.
188
+ * Allow import to work with ProxySQL. Thanks to @GregFarrell via \#550.
189
+
190
+ ## Changes in 0.25.0
191
+
192
+ ### New Features
193
+
194
+ * Add support for makara_postgis adapter. Thanks to @chadwilken via \#527.
195
+ * Skip validating presence of belongs_to associations. Thanks to @Sohair63, @naiyt, @jkowens via \#528.
196
+
197
+ ### Fixes
198
+
199
+ * Add missing require for ActiveSupport.on_load. Thanks to @onk via \#529.
200
+ * Support setting attribute values in before_validation callbacks.
201
+ Thanks to @SirRawlins, @jkowens via \#531.
202
+ * Ignore virtual columns. Thanks to @dbourguignon, @jkowens via \#530.
203
+
204
+ ## Changes in 0.24.0
205
+
206
+ ### Fixes
207
+
208
+ * Use the association primary key when importing. Thanks to @dpogue via \#512.
209
+ * Allow association ids to be updated. Thanks to @Aristat via \#515.
210
+
1
211
  ## Changes in 0.23.0
2
212
 
3
213
  ### New Features
4
214
 
5
- * Rename `import` method to `bulk_import and alias to `import`. Thanks
215
+ * Rename `import` method to `bulk_import` and alias to `import`. Thanks
6
216
  to @itay-grudev, @jkowens via \#498.
7
217
  * Increment lock_version on duplicate key update. Thanks to @aimerald
8
- via \#400.
218
+ via \#500.
9
219
 
10
220
  ### Fixes
11
221
 
@@ -125,7 +335,7 @@
125
335
  Thanks to @jkowens via \#301.
126
336
  * Allow for custom timestamp columns. Thanks to @mojidabckuu, @jkowens
127
337
  via \#401.
128
-
338
+
129
339
  ### Fixes
130
340
 
131
341
  * Fix ActiveRecord 5 issue coercing boolean values when serializing
@@ -137,7 +347,7 @@
137
347
 
138
348
  * Fix issue where PostgreSQL cannot recognize columns if names
139
349
  include mixed case characters. Thanks to @hugobgranja via \#379.
140
- * Fix an issue for ActiveRecord 5 where serialized fields with
350
+ * Fix an issue for ActiveRecord 5 where serialized fields with
141
351
  default values were not being typecast. Thanks to @whistlerbrk,
142
352
  @jkowens via \#386.
143
353
  * Add option :force_single_insert for MySQL to make sure a single
data/Gemfile CHANGED
@@ -6,6 +6,11 @@ version = ENV['AR_VERSION'].to_f
6
6
 
7
7
  mysql2_version = '0.3.0'
8
8
  mysql2_version = '0.4.0' if version >= 4.2
9
+ mysql2_version = '0.5.0' if version >= 6.1
10
+ sqlite3_version = '1.3.0'
11
+ sqlite3_version = '1.4.0' if version >= 6.0
12
+ pg_version = '0.9'
13
+ pg_version = '1.1' if version >= 6.1
9
14
 
10
15
  group :development, :test do
11
16
  gem 'rubocop', '~> 0.40.0'
@@ -15,9 +20,10 @@ end
15
20
  # Database Adapters
16
21
  platforms :ruby do
17
22
  gem "mysql2", "~> #{mysql2_version}"
18
- gem "pg", "~> 0.9"
19
- gem "sqlite3", "~> 1.3.10"
20
- gem "seamless_database_pool", "~> 1.0.20"
23
+ gem "pg", "~> #{pg_version}"
24
+ gem "sqlite3", "~> #{sqlite3_version}"
25
+ # seamless_database_pool requires Ruby ~> 2.0
26
+ gem "seamless_database_pool", "~> 1.0.20" if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.0.0')
21
27
  end
22
28
 
23
29
  platforms :jruby do
@@ -29,7 +35,7 @@ platforms :jruby do
29
35
  end
30
36
 
31
37
  # Support libs
32
- gem "factory_girl", "~> 4.2.0"
38
+ gem "factory_bot"
33
39
  gem "timecop"
34
40
  gem "chronic"
35
41
  gem "mocha", "~> 1.3.0"
@@ -39,13 +45,9 @@ platforms :jruby do
39
45
  gem "ruby-debug", "= 0.10.4"
40
46
  end
41
47
 
42
- platforms :mri_19 do
43
- gem "debugger"
44
- end
45
-
46
48
  platforms :ruby do
47
49
  gem "pry-byebug"
48
- gem "rb-readline"
50
+ gem "pry", "~> 0.12.0"
49
51
  end
50
52
 
51
53
  if version >= 4.0
data/LICENSE CHANGED
@@ -1,56 +1,21 @@
1
- Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
2
- You can redistribute it and/or modify it under either the terms of the
3
- 2-clause BSDL (see the file BSDL), or the conditions below:
4
-
5
- 1. You may make and give away verbatim copies of the source form of the
6
- software without restriction, provided that you duplicate all of the
7
- original copyright notices and associated disclaimers.
8
-
9
- 2. You may modify your copy of the software in any way, provided that
10
- you do at least ONE of the following:
11
-
12
- a) place your modifications in the Public Domain or otherwise
13
- make them Freely Available, such as by posting said
14
- modifications to Usenet or an equivalent medium, or by allowing
15
- the author to include your modifications in the software.
16
-
17
- b) use the modified software only within your corporation or
18
- organization.
19
-
20
- c) give non-standard binaries non-standard names, with
21
- instructions on where to get the original software distribution.
22
-
23
- d) make other distribution arrangements with the author.
24
-
25
- 3. You may distribute the software in object code or binary form,
26
- provided that you do at least ONE of the following:
27
-
28
- a) distribute the binaries and library files of the software,
29
- together with instructions (in the manual page or equivalent)
30
- on where to get the original distribution.
31
-
32
- b) accompany the distribution with the machine-readable source of
33
- the software.
34
-
35
- c) give non-standard binaries non-standard names, with
36
- instructions on where to get the original software distribution.
37
-
38
- d) make other distribution arrangements with the author.
39
-
40
- 4. You may modify and include the part of the software into any other
41
- software (possibly commercial). But some files in the distribution
42
- are not written by the author, so that they are not under these terms.
43
-
44
- For the list of those files and their copying conditions, see the
45
- file LEGAL.
46
-
47
- 5. The scripts and library files supplied as input to or produced as
48
- output from the software do not automatically fall under the
49
- copyright of the software, but belong to whomever generated them,
50
- and may be sold commercially, and may be aggregated with this
51
- software.
52
-
53
- 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
54
- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
55
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56
- PURPOSE.
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Zach Dennis <zach.dennis@gmail.com>
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.