dry-struct 1.0.0 → 1.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b8e3499eadacef74b5203366275c7f68c77ad138e950ac4e5f0a02635bc118f9
4
- data.tar.gz: a227f8eb3d8beb3b1388bbe1d447055076938611929ed0a41610253feae64741
3
+ metadata.gz: bf0892469a434b85578e7350f52039b85203dbd251ca5c4bd6b038373edc703e
4
+ data.tar.gz: 263e3d2d4ce824be64210a27d074fb42126dde12d94e56290307d9ff08c0efad
5
5
  SHA512:
6
- metadata.gz: 1c721723926e9edaf876e0e96e209fbdd33b882a9f92b2b670aeb3af26901c9c42d262a7446e811706c4fe02a3eb4bf76895747c2cac084ad20023952f480879
7
- data.tar.gz: a0dba3a720335d985feea9004a0b1ec1f8bb8625a4b6947a22acb6ab68bb0f4fb23aea38c8122570475ed332dc408330391d1572707216007f302e853e8a6e66
6
+ metadata.gz: '08ea5f7780bac10495f93a5043c5e100fc9386688920e4e7fd1b2304ceaeb8f37853f6ed70f5d5a69b1d7a30c0340450f8ce41fba91e812e00cf6a008f9c2de0'
7
+ data.tar.gz: da176db2c5d8127ea7ef6a088edf7f8f4d18c74e65d96e7f6a80dd9822c0baefdfa1dd7eb6d607ac077c033d64dcddb0ca6c1498eb411c4cd94ea96e23c701b4
@@ -1,25 +1,147 @@
1
- # 1.0.0 2019-04-23
1
+ <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
- ## Changed
3
+ ## 1.4.0 2021-01-21
4
4
 
5
- * `valid?` and `===` behave differently, `===` works the same way `Class#===` does and `valid?` checks if the value _can be_ coerced to the struct (flash-gordon)
6
5
 
7
- ## Added
6
+ ### Added
8
7
 
9
- * `Struct.call` now accepts an optional block that will be called on failed coercion. This behavior is consistent with dry-types 1.0. Note that `.new` doesn't take a block (flash-gordon)
8
+ - Support for wrapping constructors and fallbacks, see release notes for dry-types 1.5.0 (@flash-gordon)
9
+ - Improvements of the attribute DSL, now it's possible to use optional structs as a base class (@flash-gordon)
10
+ ```ruby
11
+ class User < Dry::Struct
12
+ attribute :name, Types::String
13
+ attribute :address, Dry::Struct.optional do
14
+ attribute :city, Types::String
15
+ end
16
+ end
17
+
18
+ User.new(name: "John", address: nil) # => #<User name="John" address=nil>
19
+ ```
20
+
21
+
22
+ [Compare v1.3.0...v1.4.0](https://github.com/dry-rb/dry-struct/compare/v1.3.0...v1.4.0)
23
+
24
+ ## 1.3.0 2020-02-10
25
+
26
+
27
+ ### Added
28
+
29
+ - Nested structures will reuse type and key transformations from the enclosing struct (@flash-gordon)
30
+
31
+ ```ruby
32
+ class User < Dry::Struct
33
+ transform_keys(&:to_sym)
34
+
35
+ attribute :name, Types::String
36
+ attribute :address do
37
+ # this struct will inherit transform_keys(&:to_sym)
38
+ attribute :city, Types::String
39
+ end
40
+
41
+ # nested struct will _not_ transform keys because a parent
42
+ # struct is given
43
+ attribute :contacts, Dry::Struct do
44
+ attribute :email, Types::String
45
+ end
46
+ end
47
+ ```
48
+ - `Dry::Struct::Constructor` finally acts like a fully-featured type (@flash-gordon)
49
+ - `Dry::Struct.abstract` declares a struct class as abstract. An abstract class is used as a default superclass for nested structs (@flash-gordon)
50
+ - `Dry::Struct.to_ast` and struct compiler (@flash-gordon)
51
+ - Struct composition with `Dry::Struct.attributes_from`. It's more flexible than inheritance (@waiting-for-dev + @flash-gordon)
52
+
53
+ ```ruby
54
+ class Address < Dry::Struct
55
+ attribute :city, Types::String
56
+ attribute :zipcode, Types::String
57
+ end
58
+
59
+ class Buyer < Dry::Struct
60
+ attribute :name, Types::String
61
+ attributes_from Address
62
+ end
63
+
64
+ class Seller < Dry::Struct
65
+ attribute :name, Types::String
66
+ attribute :email, Types::String
67
+ attributes_from Address
68
+ end
69
+ ```
70
+
71
+ ### Changed
72
+
73
+ - [internal] metadata is now stored inside schema (@flash-gordon)
74
+
75
+ [Compare v1.2.0...v1.3.0](https://github.com/dry-rb/dry-struct/compare/v1.2.0...v1.3.0)
76
+
77
+ ## 1.2.0 2019-12-20
78
+
79
+
80
+ ### Changed
81
+
82
+ - `Dry::Struct::Value` is deprecated. `Dry::Struct` instances were never meant to be mutable, we have no support for this. The only difference between `Dry::Struct` and `Dry::Struct::Value` is that the latter is deeply frozen. Freezing objects slows the code down and gives you very little benefit in return. If you have a use case for `Value`, it won't be hard to roll your own solution using [ice_nine](https://github.com/dkubb/ice_nine) (flash-gordon)
83
+ - In the thread of the previous change, structs now use immutable equalizer. This means `Struct#hash` memoizes its value after the first invocation. Depending on the case, this may speed up your code significantly (flash-gordon)
84
+
85
+ [Compare v1.1.1...v1.2.0](https://github.com/dry-rb/dry-struct/compare/v1.1.1...v1.2.0)
86
+
87
+ ## 1.1.1 2019-10-13
88
+
89
+
90
+ ### Changed
91
+
92
+ - Pattern matching syntax is simplified with `deconstruct_keys` (k-tsj)
93
+
94
+ ```ruby
95
+ User = Dry.Struct(name: 'string', email: 'string')
96
+
97
+ user = User.new(name: 'John Doe', email: 'john@acme.org')
98
+
99
+ case user
100
+ in User(name: 'John Doe', email:)
101
+ puts email
102
+ else
103
+ puts 'Not John'
104
+ end
105
+ ```
106
+
107
+ See more examples in the [specs](https://github.com/dry-rb/dry-struct/blob/8112772eb08d22ff2cd3e6997514d79a9b124968/spec/dry/struct/pattern_matching_spec.rb).
108
+
109
+ [Compare v1.1.0...v1.1.1](https://github.com/dry-rb/dry-struct/compare/v1.1.0...v1.1.1)
110
+
111
+ ## 1.1.0 2019-10-07
112
+
113
+
114
+ ### Added
115
+
116
+ - Experimental support for pattern matching :tada: (flash-gordon)
117
+
118
+
119
+ [Compare v1.0.0...v1.1.0](https://github.com/dry-rb/dry-struct/compare/v1.0.0...v1.1.0)
120
+
121
+ ## 1.0.0 2019-04-23
122
+
123
+
124
+ ### Added
125
+
126
+ - `Struct.call` now accepts an optional block that will be called on failed coercion. This behavior is consistent with dry-types 1.0. Note that `.new` doesn't take a block (flash-gordon)
10
127
  ```ruby
11
128
  User = Dry::Struct(name: 'string')
12
129
  User.(1) { :oh_no }
13
130
  # => :oh_no
14
131
  ```
15
132
 
133
+ ### Changed
134
+
135
+ - `valid?` and `===` behave differently, `===` works the same way `Class#===` does and `valid?` checks if the value _can be_ coerced to the struct (flash-gordon)
136
+
16
137
  [Compare v0.7.0...v1.0.0](https://github.com/dry-rb/dry-struct/compare/v0.7.0...v1.0.0)
17
138
 
18
- # 0.7.0 2019-03-22
139
+ ## 0.7.0 2019-03-22
140
+
19
141
 
20
- ## Changed
142
+ ### Changed
21
143
 
22
- * [BREAKING] `Struct.input` was renamed `Struct.schema`, hence `Struct.schema` returns an instance of `Dry::Types::Hash::Schema` rather than a `Hash`. Schemas are also implementing `Enumerable` but they iterate over key types.
144
+ - [BREAKING] `Struct.input` was renamed `Struct.schema`, hence `Struct.schema` returns an instance of `Dry::Types::Hash::Schema` rather than a `Hash`. Schemas are also implementing `Enumerable` but they iterate over key types.
23
145
  New API:
24
146
  ```ruby
25
147
  User.schema.each do |key|
@@ -31,7 +153,7 @@
31
153
  ```ruby
32
154
  User.schema.key(:id) # => #<Dry::Types::Hash::Key ...>
33
155
  ```
34
- * [BREAKING] `transform_types` now passes one argument to the block, an instance of the `Key` type. Combined with the new API from dry-types it simplifies declaring omittable keys:
156
+ - [BREAKING] `transform_types` now passes one argument to the block, an instance of the `Key` type. Combined with the new API from dry-types it simplifies declaring omittable keys:
35
157
  ```ruby
36
158
  class StructWithOptionalKeys < Dry::Struct
37
159
  transform_types { |key| key.required(false) }
@@ -39,20 +161,17 @@
39
161
  transform_types(&:omittable)
40
162
  end
41
163
  ```
42
- * `Dry::Stuct#new` is now more efficient for partial updates (flash-gordon)
43
- * Ruby 2.3 is EOL and not officially supported. It may work but we don't test it.
164
+ - `Dry::Stuct#new` is now more efficient for partial updates (flash-gordon)
165
+ - Ruby 2.3 is EOL and not officially supported. It may work but we don't test it.
44
166
 
45
167
  [Compare v0.6.0...v0.7.0](https://github.com/dry-rb/dry-struct/compare/v0.6.0...v0.7.0)
46
168
 
47
- # v0.6.0 2018-10-24
169
+ ## 0.6.0 2018-10-24
48
170
 
49
- ## Changed
50
171
 
51
- * [BREAKING] `Struct.attribute?` in the old sense is deprecated, use `has_attribute?` as a replacement
172
+ ### Added
52
173
 
53
- ## Added
54
-
55
- * `Struct.attribute?` is an easy way to define omittable attributes (flash-gordon):
174
+ - `Struct.attribute?` is an easy way to define omittable attributes (flash-gordon):
56
175
 
57
176
  ```ruby
58
177
  class User < Dry::Struct
@@ -62,21 +181,22 @@
62
181
  # User.new(name: 'John') # => #<User name="John">
63
182
  ```
64
183
 
65
- ## Fixed
184
+ ### Fixed
66
185
 
67
- * `Struct#to_h` recursively converts hash values to hashes, this was done to be consistent with current behavior for arrays (oeoeaio + ZimbiX)
186
+ - `Struct#to_h` recursively converts hash values to hashes, this was done to be consistent with current behavior for arrays (oeoeaio + ZimbiX)
68
187
 
69
- [Compare v0.5.1...v0.6.0](https://github.com/dry-rb/dry-struct/compare/v0.5.1...v0.6.0)
188
+ ### Changed
70
189
 
71
- # v0.5.1 2018-08-11
190
+ - [BREAKING] `Struct.attribute?` in the old sense is deprecated, use `has_attribute?` as a replacement
72
191
 
73
- ## Fixed
192
+ [Compare v0.5.1...v0.6.0](https://github.com/dry-rb/dry-struct/compare/v0.5.1...v0.6.0)
193
+
194
+ ## 0.5.1 2018-08-11
74
195
 
75
- * Constant resolution is now restricted to the current module when structs are automatically defined using the block syntax. This shouldn't break any existing code (piktur)
76
196
 
77
- ## Added
197
+ ### Added
78
198
 
79
- * Pretty print extension (ojab)
199
+ - Pretty print extension (ojab)
80
200
  ```ruby
81
201
  Dry::Struct.load_extensions(:pretty_print)
82
202
  PP.pp(user)
@@ -86,20 +206,19 @@
86
206
  address=#<Test::Address city="NYC", zipcode="123">>
87
207
  ```
88
208
 
89
- [Compare v0.5.0...v0.5.1](https://github.com/dry-rb/dry-struct/compare/v0.5.0...v0.5.1)
209
+ ### Fixed
90
210
 
91
- # v0.5.0 2018-05-03
211
+ - Constant resolution is now restricted to the current module when structs are automatically defined using the block syntax. This shouldn't break any existing code (piktur)
212
+
213
+
214
+ [Compare v0.5.0...v0.5.1](https://github.com/dry-rb/dry-struct/compare/v0.5.0...v0.5.1)
92
215
 
93
- ## BREAKING CHANGES
216
+ ## 0.5.0 2018-05-03
94
217
 
95
- * `constructor_type` was removed, use `transform_types` and `transform_keys` as a replacement (see below)
96
- * Default types are evaluated _only_ on missing values. Again, use `tranform_types` as a work around for `nil`s
97
- * Values are now stored within a single instance variable names `@attributes`, this sped up struct creation and improved support for reserved attribute names such as `hash`, they don't get a getter but still can be read via `#[]`
98
- * Ruby 2.3 is a minimal supported version
99
218
 
100
- ## Added
219
+ ### Added
101
220
 
102
- * `Dry::Struct.transform_types` accepts a block which is yielded on every type to add. Since types are `dry-types`' objects that come with a robust DSL it's rather simple to restore the behavior of `constructor_type`. See https://github.com/dry-rb/dry-struct/pull/64 for details (flash-gordon)
221
+ - `Dry::Struct.transform_types` accepts a block which is yielded on every type to add. Since types are `dry-types`' objects that come with a robust DSL it's rather simple to restore the behavior of `constructor_type`. See https://github.com/dry-rb/dry-struct/pull/64 for details (flash-gordon)
103
222
 
104
223
  Example: evaluate defaults on `nil` values
105
224
 
@@ -110,18 +229,15 @@
110
229
  end
111
230
  end
112
231
  ```
113
-
114
- * `Data::Struct.transform_keys` accepts a block/proc that transforms keys of input hashes. The most obvious usage is simbolization but arbitrary transformations are allowed (flash-gordon)
115
-
116
- * `Dry.Struct` builds a struct by a hash of attribute names and types (citizen428)
232
+ - `Data::Struct.transform_keys` accepts a block/proc that transforms keys of input hashes. The most obvious usage is simbolization but arbitrary transformations are allowed (flash-gordon)
233
+ - `Dry.Struct` builds a struct by a hash of attribute names and types (citizen428)
117
234
 
118
235
  ```ruby
119
236
  User = Dry::Struct(name: 'strict.string') do
120
237
  attribute :email, 'strict.string'
121
238
  end
122
239
  ```
123
-
124
- * Support for `Struct.meta`, note that `.meta` returns a _new class_ (flash-gordon)
240
+ - Support for `Struct.meta`, note that `.meta` returns a _new class_ (flash-gordon)
125
241
 
126
242
  ```ruby
127
243
  class User < Dry::Struct
@@ -132,8 +248,7 @@
132
248
 
133
249
  User.new(name: 'Jade').class == UserWithMeta.new(name: 'Jade').class # => false
134
250
  ```
135
-
136
- * `Struct.attribute` yields a block with definition for nested structs. It defines a nested constant for the new struct and supports arrays (AMHOL + flash-gordon)
251
+ - `Struct.attribute` yields a block with definition for nested structs. It defines a nested constant for the new struct and supports arrays (AMHOL + flash-gordon)
137
252
 
138
253
  ```ruby
139
254
  class User < Dry::Struct
@@ -151,92 +266,103 @@
151
266
  # ^This automatically defines User::Address and User::Account
152
267
  ```
153
268
 
154
- ## Fixed
269
+ ### Fixed
270
+
271
+ - Adding a new attribute invalidates `attribute_names` (flash-gordon)
272
+ - Struct classes track subclasses and define attributes in them, now it doesn't matter whether you define attributes first and _then_ subclass or vice versa. Note this can lead to memory leaks in Rails environment when struct classes are reloaded (flash-gordon)
155
273
 
156
- * Adding a new attribute invalidates `attribute_names` (flash-gordon)
157
- * Struct classes track subclasses and define attributes in them, now it doesn't matter whether you define attributes first and _then_ subclass or vice versa. Note this can lead to memory leaks in Rails environment when struct classes are reloaded (flash-gordon)
158
274
 
159
275
  [Compare v0.4.0...v0.5.0](https://github.com/dry-rb/dry-struct/compare/v0.4.0...v0.5.0)
160
276
 
161
- # v0.4.0 2017-11-04
277
+ ## 0.4.0 2017-11-04
162
278
 
163
- ## Changed
164
279
 
165
- * Attribute readers don't override existing instance methods (solnic)
166
- * `Struct#new` uses raw attributes instead of method calls, this makes the behavior consistent with the change above (flash-gordon)
167
- * `constructor_type` now actively rejects `:weak` and `:symbolized` values (GustavoCaso)
280
+ ### Fixed
168
281
 
169
- ## Fixed
282
+ - `Struct#new` doesn't call `.to_hash` recursively (flash-gordon)
170
283
 
171
- * `Struct#new` doesn't call `.to_hash` recursively (flash-gordon)
284
+ ### Changed
285
+
286
+ - Attribute readers don't override existing instance methods (solnic)
287
+ - `Struct#new` uses raw attributes instead of method calls, this makes the behavior consistent with the change above (flash-gordon)
288
+ - `constructor_type` now actively rejects `:weak` and `:symbolized` values (GustavoCaso)
172
289
 
173
290
  [Compare v0.3.1...v0.4.0](https://github.com/dry-rb/dry-struct/compare/v0.3.1...v0.4.0)
174
291
 
175
- # v0.3.1 2017-06-30
292
+ ## 0.3.1 2017-06-30
293
+
294
+
295
+ ### Added
176
296
 
177
- ## Added
297
+ - `Struct.constructor` that makes dry-struct more aligned with dry-types; now you can have a struct with a custom constructor that will be called _before_ calling the `new` method (v-kolesnikov)
298
+ - `Struct.attribute?` and `Struct.attribute_names` for introspecting struct attributes (flash-gordon)
299
+ - `Struct#__new__` is a safe-to-use-in-gems alias for `Struct#new` (flash-gordon)
178
300
 
179
- * `Struct.constructor` that makes dry-struct more aligned with dry-types; now you can have a struct with a custom constructor that will be called _before_ calling the `new` method (v-kolesnikov)
180
- * `Struct.attribute?` and `Struct.attribute_names` for introspecting struct attributes (flash-gordon)
181
- * `Struct#__new__` is a safe-to-use-in-gems alias for `Struct#new` (flash-gordon)
182
301
 
183
302
  [Compare v0.3.0...v0.3.1](https://github.com/dry-rb/dry-struct/compare/v0.3.0...v0.3.1)
184
303
 
185
- # v0.3.0 2017-05-05
304
+ ## 0.3.0 2017-05-05
186
305
 
187
- ## Added
188
306
 
189
- * `Dry::Struct#new` method to return new instance with applied changeset (Kukunin)
307
+ ### Added
190
308
 
191
- ## Fixed
309
+ - `Dry::Struct#new` method to return new instance with applied changeset (Kukunin)
192
310
 
193
- * `.[]` and `.call` does not coerce subclass to superclass anymore (Kukunin)
194
- * Raise ArgumentError when attribute type is a string and no value provided is for `new` (GustavoCaso)
311
+ ### Fixed
195
312
 
196
- ## Changed
313
+ - `.[]` and `.call` does not coerce subclass to superclass anymore (Kukunin)
314
+ - Raise ArgumentError when attribute type is a string and no value provided is for `new` (GustavoCaso)
197
315
 
198
- * `.new` without arguments doesn't use nil as an input for non-default types anymore (flash-gordon)
316
+ ### Changed
317
+
318
+ - `.new` without arguments doesn't use nil as an input for non-default types anymore (flash-gordon)
199
319
 
200
320
  [Compare v0.2.1...v0.3.0](https://github.com/dry-rb/dry-struct/compare/v0.2.1...v0.3.0)
201
321
 
202
- # v0.2.1 2017-02-27
322
+ ## 0.2.1 2017-02-27
323
+
203
324
 
204
- ## Fixed
325
+ ### Fixed
326
+
327
+ - Fixed `Dry::Struct::Value` which appeared to be broken in the last release (flash-gordon)
205
328
 
206
- * Fixed `Dry::Struct::Value` which appeared to be broken in the last release (flash-gordon)
207
329
 
208
330
  [Compare v0.2.0...v0.2.1](https://github.com/dry-rb/dry-struct/compare/v0.2.0...v0.2.1)
209
331
 
210
- # v0.2.0 2016-02-26
332
+ ## 0.2.0 2016-02-26
333
+
211
334
 
212
- ## Changed
335
+ ### Changed
213
336
 
214
- * Struct attributes can be overridden in a subclass (flash-gordon)
337
+ - Struct attributes can be overridden in a subclass (flash-gordon)
215
338
 
216
339
  [Compare v0.1.1...v0.2.0](https://github.com/dry-rb/dry-struct/compare/v0.1.1...v0.2.0)
217
340
 
218
- # v0.1.1 2016-11-13
341
+ ## 0.1.1 2016-11-13
342
+
219
343
 
220
- ## Fixed
344
+ ### Fixed
345
+
346
+ - Make `Dry::Struct` act as a constrained type. This fixes the behavior of sum types containing structs (flash-gordon)
221
347
 
222
- * Make `Dry::Struct` act as a constrained type. This fixes the behavior of sum types containing structs (flash-gordon)
223
348
 
224
349
  [Compare v0.1.0...v0.1.1](https://github.com/dry-rb/dry-struct/compare/v0.1.0...v0.1.1)
225
350
 
226
- # v0.1.0 2016-09-21
351
+ ## 0.1.0 2016-09-21
352
+
227
353
 
228
- ## Added
354
+ ### Added
229
355
 
230
- * `:strict_with_defaults` constructor type (backus)
356
+ - `:strict_with_defaults` constructor type (backus)
231
357
 
232
- ## Changed
358
+ ### Changed
233
359
 
234
- * [BREAKING] `:strict` was renamed to `:permissive` as it ignores missing keys (backus)
235
- * [BREAKING] `:strict` now raises on unexpected keys (backus)
236
- * Structs no longer auto-register themselves in the types container as they implement `Type` interface and we don't have to wrap them in `Type::Definition` (flash-gordon)
360
+ - [BREAKING] `:strict` was renamed to `:permissive` as it ignores missing keys (backus)
361
+ - [BREAKING] `:strict` now raises on unexpected keys (backus)
362
+ - Structs no longer auto-register themselves in the types container as they implement `Type` interface and we don't have to wrap them in `Type::Definition` (flash-gordon)
237
363
 
238
364
  [Compare v0.0.1...v0.1.0](https://github.com/dry-rb/dry-struct/compare/v0.0.1...v0.1.0)
239
365
 
240
- # v0.0.1 2016-07-17
366
+ ## 0.0.1 2016-07-17
241
367
 
242
368
  Initial release of code imported from dry-types
data/LICENSE CHANGED
@@ -1,20 +1,20 @@
1
- Copyright (c) 2013-2016 Piotr Solnica
1
+ The MIT License (MIT)
2
2
 
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
3
+ Copyright (c) 2015-2021 dry-rb team
10
4
 
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
13
11
 
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.