judit-pickle 0.4.2

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 (75) hide show
  1. data/.gitignore +6 -0
  2. data/Gemfile +20 -0
  3. data/Gemfile.lock +98 -0
  4. data/History.txt +409 -0
  5. data/License.txt +20 -0
  6. data/README.rdoc +367 -0
  7. data/Rakefile +20 -0
  8. data/Rakefile.d/cucumber.rake +24 -0
  9. data/Rakefile.d/jeweler.rake +23 -0
  10. data/Rakefile.d/rcov.rake +18 -0
  11. data/Rakefile.d/rspec.rake +7 -0
  12. data/Rakefile.d/yard.rake +5 -0
  13. data/Todo.txt +3 -0
  14. data/VERSION +1 -0
  15. data/features/app/app.rb +122 -0
  16. data/features/app/blueprints.rb +11 -0
  17. data/features/app/factories.rb +23 -0
  18. data/features/app/views/notifier/email.erb +1 -0
  19. data/features/app/views/notifier/user_email.erb +6 -0
  20. data/features/email/email.feature +64 -0
  21. data/features/generator/generators.feature +59 -0
  22. data/features/path/models_page.feature +44 -0
  23. data/features/path/named_route_page.feature +10 -0
  24. data/features/pickle/create_from_active_record.feature +76 -0
  25. data/features/pickle/create_from_factory_girl.feature +63 -0
  26. data/features/pickle/create_from_machinist.feature +39 -0
  27. data/features/step_definitions/email_steps.rb +63 -0
  28. data/features/step_definitions/extra_email_steps.rb +7 -0
  29. data/features/step_definitions/fork_steps.rb +4 -0
  30. data/features/step_definitions/generator_steps.rb +46 -0
  31. data/features/step_definitions/path_steps.rb +14 -0
  32. data/features/step_definitions/pickle_steps.rb +100 -0
  33. data/features/step_definitions/raise_error_steps.rb +3 -0
  34. data/features/support/email.rb +21 -0
  35. data/features/support/env.rb +52 -0
  36. data/features/support/paths.rb +47 -0
  37. data/features/support/pickle.rb +26 -0
  38. data/features/support/pickle_app.rb +4 -0
  39. data/init.rb +0 -0
  40. data/lib/generators/pickle_generator.rb +69 -0
  41. data/lib/pickle/adapter.rb +137 -0
  42. data/lib/pickle/adapters/active_record.rb +57 -0
  43. data/lib/pickle/adapters/data_mapper.rb +42 -0
  44. data/lib/pickle/adapters/mongoid.rb +44 -0
  45. data/lib/pickle/config.rb +49 -0
  46. data/lib/pickle/email/parser.rb +18 -0
  47. data/lib/pickle/email/world.rb +13 -0
  48. data/lib/pickle/email.rb +77 -0
  49. data/lib/pickle/parser/matchers.rb +87 -0
  50. data/lib/pickle/parser.rb +65 -0
  51. data/lib/pickle/path/world.rb +5 -0
  52. data/lib/pickle/path.rb +45 -0
  53. data/lib/pickle/session/parser.rb +34 -0
  54. data/lib/pickle/session.rb +205 -0
  55. data/lib/pickle/version.rb +9 -0
  56. data/lib/pickle/world.rb +14 -0
  57. data/lib/pickle.rb +26 -0
  58. data/pickle.gemspec +134 -0
  59. data/rails_generators/pickle/pickle_generator.rb +33 -0
  60. data/rails_generators/pickle/templates/email.rb +21 -0
  61. data/rails_generators/pickle/templates/email_steps.rb +63 -0
  62. data/rails_generators/pickle/templates/paths.rb +47 -0
  63. data/rails_generators/pickle/templates/pickle.rb +28 -0
  64. data/rails_generators/pickle/templates/pickle_steps.rb +100 -0
  65. data/spec/pickle/adapter_spec.rb +186 -0
  66. data/spec/pickle/config_spec.rb +109 -0
  67. data/spec/pickle/email/parser_spec.rb +51 -0
  68. data/spec/pickle/email_spec.rb +166 -0
  69. data/spec/pickle/parser/matchers_spec.rb +70 -0
  70. data/spec/pickle/parser_spec.rb +161 -0
  71. data/spec/pickle/path_spec.rb +101 -0
  72. data/spec/pickle/session_spec.rb +434 -0
  73. data/spec/pickle_spec.rb +24 -0
  74. data/spec/spec_helper.rb +8 -0
  75. metadata +199 -0
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ pkg
2
+ doc/*
3
+ .yardoc
4
+ pickle-email*
5
+ cucumber_test_app
6
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,20 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "yard"
4
+ gem "rake"
5
+ gem "cucumber", ">=0.8"
6
+ gem "rspec"
7
+
8
+ group :test do
9
+ gem "rspec-rails"
10
+ gem "rails", "~>2.3"
11
+ gem "cucumber-rails", ">=0.3.2"
12
+ gem "factory_girl"
13
+ gem "machinist"
14
+ gem "jeweler"
15
+ gem "rcov"
16
+ gem "database_cleaner"
17
+ gem "capybara"
18
+ gem "webrat"
19
+ gem "sqlite3-ruby"
20
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,98 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ actionmailer (2.3.8)
5
+ actionpack (= 2.3.8)
6
+ actionpack (2.3.8)
7
+ activesupport (= 2.3.8)
8
+ rack (~> 1.1.0)
9
+ activerecord (2.3.8)
10
+ activesupport (= 2.3.8)
11
+ activeresource (2.3.8)
12
+ activesupport (= 2.3.8)
13
+ activesupport (2.3.8)
14
+ builder (2.1.2)
15
+ capybara (0.3.9)
16
+ culerity (>= 0.2.4)
17
+ mime-types (>= 1.16)
18
+ nokogiri (>= 1.3.3)
19
+ rack (>= 1.0.0)
20
+ rack-test (>= 0.5.4)
21
+ selenium-webdriver (>= 0.0.3)
22
+ cucumber (0.8.5)
23
+ builder (~> 2.1.2)
24
+ diff-lcs (~> 1.1.2)
25
+ gherkin (~> 2.1.4)
26
+ json_pure (~> 1.4.3)
27
+ term-ansicolor (~> 1.0.4)
28
+ cucumber-rails (0.3.2)
29
+ cucumber (>= 0.8.0)
30
+ culerity (0.2.10)
31
+ database_cleaner (0.5.2)
32
+ diff-lcs (1.1.2)
33
+ factory_girl (1.3.2)
34
+ ffi (0.6.3)
35
+ rake (>= 0.8.7)
36
+ gemcutter (0.6.1)
37
+ gherkin (2.1.5)
38
+ trollop (~> 1.16.2)
39
+ git (1.2.5)
40
+ jeweler (1.4.0)
41
+ gemcutter (>= 0.1.0)
42
+ git (>= 1.2.5)
43
+ rubyforge (>= 2.0.0)
44
+ json_pure (1.4.6)
45
+ machinist (1.0.6)
46
+ mime-types (1.16)
47
+ nokogiri (1.4.3.1)
48
+ rack (1.1.0)
49
+ rack-test (0.5.4)
50
+ rack (>= 1.0)
51
+ rails (2.3.8)
52
+ actionmailer (= 2.3.8)
53
+ actionpack (= 2.3.8)
54
+ activerecord (= 2.3.8)
55
+ activeresource (= 2.3.8)
56
+ activesupport (= 2.3.8)
57
+ rake (>= 0.8.3)
58
+ rake (0.8.7)
59
+ rcov (0.9.8)
60
+ rspec (1.3.0)
61
+ rspec-rails (1.3.2)
62
+ rack (>= 1.0.0)
63
+ rspec (>= 1.3.0)
64
+ rubyforge (2.0.4)
65
+ json_pure (>= 1.1.7)
66
+ rubyzip (0.9.4)
67
+ selenium-webdriver (0.0.27)
68
+ ffi (>= 0.6.1)
69
+ json_pure
70
+ rubyzip
71
+ sqlite3-ruby (1.3.1)
72
+ term-ansicolor (1.0.5)
73
+ trollop (1.16.2)
74
+ webrat (0.7.1)
75
+ nokogiri (>= 1.2.0)
76
+ rack (>= 1.0)
77
+ rack-test (>= 0.5.3)
78
+ yard (0.5.8)
79
+
80
+ PLATFORMS
81
+ ruby
82
+
83
+ DEPENDENCIES
84
+ capybara
85
+ cucumber (>= 0.8)
86
+ cucumber-rails (>= 0.3.2)
87
+ database_cleaner
88
+ factory_girl
89
+ jeweler
90
+ machinist
91
+ rails (~> 2.3)
92
+ rake
93
+ rcov
94
+ rspec
95
+ rspec-rails
96
+ sqlite3-ruby
97
+ webrat
98
+ yard
data/History.txt ADDED
@@ -0,0 +1,409 @@
1
+ == 0.4.2
2
+
3
+ * 1 bugfix
4
+ * Use mongoid finder syntax, which requires a :conditions key [Marc Lee]
5
+
6
+
7
+ == 0.4.1
8
+ Docfix
9
+
10
+ * 1 improvement
11
+ * documentation fixes, and example of writing your own pickle steps
12
+
13
+
14
+ == 0.4.0
15
+ Mongoid adapter, fallback ORM adapter for those not using machinist or active_record, bugfixes
16
+
17
+ * 2 major improvements
18
+ * adapter for Mongoid [Sebastian Zuchmanski]
19
+ * replace ActiveRecord 'factory' adapter with Orm adapter.
20
+
21
+ If you don't have machinist or factory_girl, the Orm factory adapter will fallback to your Orm to create classes.
22
+
23
+ BC: if you have a line like this:
24
+ Pickle.configure do |config|
25
+ config.adapters = [:active_record]
26
+ end
27
+
28
+ You need to replace it with :orm
29
+ Pickle.configure do |config|
30
+ config.adapters = [:orm]
31
+ end
32
+
33
+ * 1 minor improvement
34
+ * Pickle::Session::ModelNotKnownError is raised instead of a generic RuntimeError
35
+
36
+ * 1 bugfix
37
+ * references to unknown models in fields now raise ModelNotKnownError instead of silently assigning nil
38
+
39
+
40
+ == 0.3.5
41
+
42
+ * 3 improvements
43
+ * bundler is used for setting up development dependencies
44
+ * gemspec specifies dependencies for using pickle
45
+ * Machinist 2 compatability [giddie]
46
+
47
+ * 1 bugfix
48
+ * find_models now works with a factory name with spaces in it [#27]
49
+
50
+
51
+ == 0.3.4
52
+
53
+ * 2 minor improvements
54
+ * Fix problem where email body is not a string, but is string like [#26] [Tom Meier]
55
+ * Minor code refactoring
56
+
57
+
58
+ == 0.3.3
59
+
60
+ * 1 minor improvement
61
+ * Pickle respects the default build strategy for factory girl. [Sean Hussey]
62
+
63
+
64
+ == 0.3.2
65
+
66
+ * 3 minor improvements
67
+ * Document how to use machinist named blueprints [Christopher Darroch]
68
+ * Email links now visit the url, rather than just the path, this allows for features that
69
+ make use of the domain to function correctly
70
+ * Deprecation warnings for Rails 3 removed [Brian Rose & Kevin Olsen]
71
+
72
+
73
+ == 0.3.1
74
+
75
+ * 1 major improvement
76
+ * Rails 3 support for generators [H.J. Blok, szimek]
77
+
78
+
79
+ == 0.3.0
80
+
81
+ * 2 major improvements
82
+ * Mechanism for registering ORM adapters for pickle [Daniel Neighman]
83
+ * Adapters for ActiveRecord and DataMapper [Josh Bassett, Daniel Neighman]
84
+
85
+
86
+ == 0.2.12
87
+
88
+ * 1 bugfix
89
+ * script/generate pickle paths now works correctly with cucumber-rails 0.3.2
90
+
91
+
92
+ == 0.2.11
93
+
94
+ * 1 improvement
95
+ * use correct type when converting STI pickle model to attributes
96
+
97
+
98
+ == 0.2.10
99
+
100
+ * 2 improvements
101
+ * pickle backend is rails 3 compatible (but generators are not yet)
102
+ * modular Rakefile, devs can run only what they're interested in without having to install all gems
103
+
104
+
105
+ == 0.2.9 - 27 Apr 2010 (the #railscamp7 release)
106
+
107
+ * 5 improvements
108
+ * Fixed problem with verifying model attribute using strings with escaped quotes [Michael MacDonald]
109
+ * Added handling for positive and negative floats [Michael MacDonald, #railscamp7]
110
+ * Added handling of ruby integer syntax (e.g. 1_000_000) [Ian White]
111
+ * Modified the way pickle handles predicates to match rspec [Michael MacDonald, #railscamp7]
112
+ * Added step to assert size of an association (e.g. Then the user should have 4 friends) [Ian White]
113
+
114
+
115
+ == 0.2.8 - 5 Apr 2010
116
+
117
+ * 1 minor improvement
118
+ * 'Then show me the email' works as expected now [#18]
119
+
120
+
121
+ == 0.2.7 - 5 Apr 2010
122
+
123
+ * 1 minor improvement
124
+ * just rake 'rake cucumber' and a rails app will be setup for you if required (rails 2.3 only ATM)
125
+
126
+
127
+ == 0.2.6 - 5 Apr 2010
128
+
129
+ * 2 improvements
130
+ * running specs is now doable without being in a rails app - just do 'rake spec'
131
+ * running features is more straightforward, 'rake cucumber' then follow the instructions
132
+
133
+
134
+ == 0.2.5 - 17 Mar 2010
135
+
136
+ * 2 improvements
137
+ * Bugfix for find_models_via_table (failing to find models was not causing an error) [Chris Flipse]
138
+ * find_models_via_table & create_models_via_table return the found/created models [Chris Flipse, Ian White]
139
+
140
+
141
+ == 0.2.4 - 9 Mar 2010
142
+
143
+ * 1 major improvement
144
+ * Finding models via a table now works in the same way as creating models via a table (0.2.3), you
145
+ can create pickle refs
146
+
147
+
148
+ == 0.2.3 - 9 Mar 2010
149
+
150
+ * 1 major improvement
151
+ * You can now use pickle refs in tables. If you add a column which is the single factory name, the
152
+ contents of the column will be used as the pickle ref. [Stephan Hagemann]
153
+ e.g.
154
+ Given the following users exist:
155
+ | user | name | status |
156
+ | jack | Jack Spratt | alone |
157
+ | pete | Pete Sprong | dead |
158
+
159
+ * 1 minor improvement
160
+ * Fix bug in error message for when pickle ref can't be found [Myron Marston]
161
+
162
+
163
+ == 0.2.2 - 25 Feb 2010
164
+
165
+ * 3 improvements
166
+ * Added ability to follow links in emails (see email_steps.rb) [Michael Moen]
167
+ * Added a step definition for doing stuff like: Then the user's name should be "Tobi" [Tobi Knaup]
168
+ * Docfixes, mostly about testing [Nicholas Rutherford]
169
+
170
+
171
+ == 0.2.1 - 1 Dec 2009
172
+
173
+ * 2 minor improvements
174
+ * Allow nil as field value [#14]
175
+ * Added negative email step for delivered to
176
+
177
+
178
+ == 0.2.0 - 24 Nov 2009
179
+
180
+ * 4 major improvements
181
+ * Added support for finding models using tables
182
+ Example:
183
+ Then the following users should exist:
184
+ | name |
185
+ | Fred |
186
+ | Ethel |
187
+ And the 1st user should be male
188
+ And the 2nd user should be female
189
+
190
+ * tables now support pickle refs in cells (see features/pickle/create_from_factory_girl.rb#37)
191
+
192
+ * features/support/email.rb adds an email helper for mapping names to email addresses (similar to NavigationHelper in paths.rb)
193
+
194
+ * Added ability for path_to_pickle to handle arbitrary segments
195
+ Example:
196
+ path_to_pickle('account', 'the enquiry') => account_enquiry_path(<enquiry>)
197
+
198
+ * 2 minor improvements
199
+ * fail faster in pickle steps when a pickle ref can't be found, by using model! in most places
200
+
201
+ * generated pickle steps are less picky about possessives so that pickle mappings accepted in more places
202
+ e.g. when you have
203
+ config.map 'my', 'I', 'myself', :to => 'user: "me"'
204
+ you can now do
205
+ Given I exist
206
+ ...
207
+ Then the project should be one of my assigned projects
208
+
209
+
210
+ == 0.1.23 - 22 Nov 2009
211
+
212
+ * 1 major improvement
213
+ * script/generate pickle now adds its own pickle.rb support file, making it easier to regenerate cucumber
214
+ when a new release of cucumber appears [schlick, ianwhite]
215
+
216
+ * 1 minor improvement
217
+ * docs: more links
218
+
219
+
220
+ == 0.1.22 - 7 Nov 2009
221
+
222
+ * 2 minor enhancements
223
+ * Improved docs to include instructions for FactoryGirl users, and links/resources for pickle users
224
+ * Ruby 1.9.1 compatibility changes
225
+
226
+
227
+ == 0.1.21
228
+
229
+ * 1 minor enhancement
230
+ * Added 'should not' steps corresponding to model existence, and association exitsence [schlick]
231
+
232
+
233
+ == 0.1.20
234
+
235
+ * 1 minor enhancement
236
+ * Pickle now matches numeric field values preceded with a positive and negative sign eg +1.5 and -1 [schlick]
237
+
238
+
239
+ == 0.1.19
240
+
241
+ * 1 minor enhancement
242
+ * Add support for Cucumber tables [Tobi Knaup]
243
+
244
+
245
+ == 0.1.16, 0.1.17, 0.1.18 - 13 Oct 2009
246
+
247
+ * 1 minor enhancement
248
+ * release gem on gemcutter and code on github
249
+
250
+
251
+ == 0.1.15 - 28 Aug 2009
252
+
253
+ * 1 minor enhancement
254
+ * avoid namespace collision on replace by renaming mapping#replace -> mapping#replacement [nruth]
255
+
256
+
257
+ == 0.1.14 - 9 July 2009
258
+
259
+ * 1 minor enhancement
260
+ * update specs and features for latest cucumber and machinist changes
261
+
262
+
263
+ == 0.1.13 - 16 June 2009
264
+
265
+ * 2 minor enhancements
266
+ * model! and created_model! raise an error if pickle name can't be found
267
+ * path_to_pickle uses the above to give back a better error message
268
+
269
+
270
+ == 0.1.12 - 7 Apr 2009
271
+
272
+ * 2 minor enhancements
273
+ * rationalised Rakefile
274
+ * update World extensions for latest cucumber changes
275
+
276
+
277
+ == 0.1.11 - 22 Feb 2009
278
+
279
+ * 2 minor enhancements
280
+ * Pickle now supports multiple machinist blueprints
281
+ * Fix confusing adapter/adaptor comment generator comment
282
+
283
+
284
+ == 0.1.10 - 13 Feb 2009
285
+
286
+ * 2 minor enhancements
287
+ * Made pickle paths generator compatible with latest cucumber
288
+ * Simplified and Rakefile, including auto push api docs to gh-pages on ci build
289
+
290
+
291
+ == 0.1.9 - 29 Jan 2009
292
+
293
+ * 1 minor enhancement
294
+ * Pickle::Adapter.model_classes excludes those without tables
295
+
296
+
297
+ == 0.1.8 - 29 Jan 2009
298
+
299
+ * API change
300
+ * pickle_path becomes path_to_pickle, to avoid named route clashes
301
+
302
+ * 2 minor enhancements
303
+ * Updated features for cucumber 0.2 compat
304
+ * Made paths allow for optional possesives
305
+
306
+
307
+ == 0,1,7
308
+
309
+ * 2 API changes
310
+ * script/generate pickle path[s] now amends the features/support/paths.rb file
311
+ instead of creating pge_to_path and path_steps.
312
+
313
+ * pickle_email_steps is renamed email_steps
314
+
315
+
316
+ == 0.1.6
317
+
318
+ * 1 API change
319
+ * to use pickle env.rb should contain "require 'pickle/world'". You should remove all trace of
320
+ pickle from features/support/env.rb and re run script/generate pickle
321
+
322
+ * 2 major enhancements
323
+
324
+ * generate email steps with `script/generate pickle email`
325
+ email steps allow you to do things like this:
326
+
327
+ Then 2 emails should be delivered
328
+ And the first email should be delivered to fred@gmail.com
329
+ And the 2nd email should be delivered to the user: "ethel"
330
+
331
+ Then 1 email should be delivered with subject: "Activate your account"
332
+ And the email should link to the user's page
333
+
334
+ take a look at features/step_definitions/pickle_email_steps.rb
335
+
336
+ * generate path steps with `script/generate pickle path`
337
+ path steps allow you to do things like this
338
+
339
+ When I go to the comment's page
340
+ Then I should be at the user's new comment page
341
+
342
+ take a look at features/step_definitions/pickle_path_steps.rb, and modify page_to_path to suit your needs
343
+
344
+ * 4 minor enhancements
345
+ * Improved documentation
346
+ * abstract models no longer kill pickle
347
+ * Actually test that the generators work
348
+ * Made Pickle::Session a plain ole mixin, as a separate class was unnecessary
349
+ * Pickle uses the cucumber World API
350
+
351
+
352
+ == 0.1.5
353
+
354
+ * API change
355
+ * CaptureModel, etc are now 'capture_model' methods
356
+
357
+ * 3 major enhancements
358
+ * Steps for asserting that <n> models exist, matching certain criteria
359
+ * Steps for asserting associations added to generated pickle steps
360
+ 'Then the user should be in the post's commenters'
361
+ 'Then the forum: "awesome" should be the 2nd post's forum'
362
+ * configuration can now occur any time before a step is defined, which makes
363
+ for much more intuitive env.rb
364
+
365
+ * 2 minor enhancement
366
+ * predicate matching is less prone to step conflicts because we preload a
367
+ big list of all the predicate and column methods
368
+ * field values now handle booleans and numerics
369
+
370
+
371
+ == 0.1.4
372
+
373
+ * 1 major enhancement
374
+ * You can create multiple models with ease, for eg.
375
+ 'Given 10 users exist with role: "admin"'
376
+
377
+ * 1 minor enhancement
378
+ * You can do Pickle.configure (just like Webrat.configure)
379
+
380
+
381
+ == 0.1.3 - Bugfix release
382
+
383
+ * 1 minor enhancement
384
+ * make generated steps compatible with Rails 2.1
385
+
386
+
387
+ == 0.1.2
388
+
389
+ * 2 major enhancements
390
+ * create your pickle steps with script/generate pickle
391
+ * Adapter based architecture, supports Machinist, FactoryGirl, and vanilla ActiveRecord
392
+
393
+ * 1 minor enhancement
394
+ * model_names now defaults to subclasses of AR::Base
395
+ * #original_model => #created_model
396
+
397
+
398
+ == 0.1.1
399
+
400
+ * 1 major enhancement:
401
+ * made pickle a github gem
402
+
403
+ * 1 minor enhancement:
404
+ * Added intentions for pickle in README.textile
405
+
406
+
407
+ == Prior to gems
408
+
409
+ * Initial release: everything is subject to sweeping change
data/License.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008-2010 Ian White - ian.w.white@gmail.com
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:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
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.