queue_classic 3.1.0.RC1 → 4.0.0.pre.beta1

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 (44) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +192 -0
  3. data/.gitignore +11 -0
  4. data/CHANGELOG.md +192 -0
  5. data/CODE_OF_CONDUCT.md +46 -0
  6. data/CONTRIBUTING.md +17 -0
  7. data/Gemfile +12 -0
  8. data/LICENSE.txt +20 -0
  9. data/{readme.md → README.md} +120 -83
  10. data/Rakefile +16 -0
  11. data/lib/generators/queue_classic/install_generator.rb +6 -0
  12. data/lib/generators/queue_classic/templates/add_queue_classic.rb +3 -1
  13. data/lib/generators/queue_classic/templates/update_queue_classic_3_0_0.rb +3 -1
  14. data/lib/generators/queue_classic/templates/update_queue_classic_3_0_2.rb +3 -1
  15. data/lib/generators/queue_classic/templates/update_queue_classic_3_1_0.rb +3 -1
  16. data/lib/generators/queue_classic/templates/update_queue_classic_4_0_0.rb +11 -0
  17. data/lib/queue_classic/config.rb +86 -0
  18. data/lib/queue_classic/conn_adapter.rb +37 -16
  19. data/lib/queue_classic/queue.rb +76 -18
  20. data/lib/queue_classic/railtie.rb +2 -0
  21. data/lib/queue_classic/setup.rb +24 -7
  22. data/lib/queue_classic/tasks.rb +7 -8
  23. data/lib/queue_classic/version.rb +5 -0
  24. data/lib/queue_classic/worker.rb +18 -12
  25. data/lib/queue_classic.rb +50 -58
  26. data/queue_classic.gemspec +25 -0
  27. data/sql/create_table.sql +7 -14
  28. data/sql/ddl.sql +6 -82
  29. data/sql/downgrade_from_4_0_0.sql +88 -0
  30. data/sql/update_to_3_0_0.sql +5 -5
  31. data/sql/update_to_3_1_0.sql +6 -6
  32. data/sql/update_to_4_0_0.sql +6 -0
  33. data/test/benchmark_test.rb +15 -12
  34. data/test/config_test.rb +123 -0
  35. data/test/helper.rb +47 -3
  36. data/test/helper.sql +25 -0
  37. data/test/lib/queue_classic_rails_connection_test.rb +16 -10
  38. data/test/lib/queue_classic_test.rb +15 -3
  39. data/test/lib/queue_classic_test_with_activerecord_typecast.rb +21 -0
  40. data/test/queue_test.rb +127 -4
  41. data/test/rails-tests/.gitignore +2 -0
  42. data/test/rails-tests/rails523.sh +23 -0
  43. data/test/worker_test.rb +153 -35
  44. metadata +51 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4280312436762af6532d5ba73b94063e2f3fdfcf
4
- data.tar.gz: 8ad63234d7e013a19238e6fbf1722c9eb688af8b
2
+ SHA256:
3
+ metadata.gz: 1e57fa8cff0c8e6772dda85c9e4a83c5b851f3dc4e5093d36d53b5607bdad99c
4
+ data.tar.gz: '06691d8784eaed7f920319e1e413d2ac0fde11797673726022ee4c99713e7687'
5
5
  SHA512:
6
- metadata.gz: 6b528e1cb1e85ec03e7ccecd36e20394bd578d6e912a8ae531c253ef0ad0c2e996dcb5a53be56650af09c117be67410e3562dcfd37f067b323fb0584c0b6f841
7
- data.tar.gz: 02f999edfa7d92a9286b31970e1ef999dc0a37e0355b6f3bd50454b790c154295cfb0db541d9274f3f624486d305c31bbc19db49deb8d026fd69bdf9fcf24603
6
+ metadata.gz: 58822f3b1458c8ee9f10c8e54784a357b48cfee4ee7bd8dae0b722a0ba2a21f2e994f20df58b7160627a0c210d03f616598c92d314afd763773fbb1b784472d2
7
+ data.tar.gz: 30c9691284a280ef1efd234a9a404f97421349b620b083aaefa0d2350f6f8a079b980610a1cd787cf05c04ffadc935bc16c9f3f199cdc685de585b84f18b9198
@@ -0,0 +1,192 @@
1
+ version: 2
2
+ jobs:
3
+ test_fresh_install_rails_5_2_3:
4
+ parallelism: 2
5
+ docker:
6
+ - image: circleci/ruby:2.6
7
+ environment:
8
+ RAILS_ENV: test
9
+ RACK_ENV: test
10
+ POSTGRES_USER: root
11
+ PGHOST: 127.0.0.1
12
+ DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
13
+ QC_DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
14
+ QC_BENCHMARK: true
15
+ QC_BENCHMARK_MAX_TIME_DEQUEUE: 60
16
+ - image: circleci/postgres:9.6.6-alpine
17
+ steps:
18
+ - checkout
19
+ - run:
20
+ name: Install rails, add QC and run migrations
21
+ command: |
22
+ cd test/rails-tests/
23
+ sh rails523.sh
24
+ test_ruby_2_4:
25
+ docker:
26
+ - image: circleci/ruby:2.4
27
+ environment:
28
+ RAILS_ENV: test
29
+ RACK_ENV: test
30
+ POSTGRES_USER: root
31
+ PGHOST: 127.0.0.1
32
+ DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
33
+ QC_DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
34
+ QC_BENCHMARK: true
35
+ QC_BENCHMARK_MAX_TIME_DEQUEUE: 60
36
+ - image: circleci/postgres:9.6.6-alpine
37
+ steps:
38
+ - checkout
39
+ - run:
40
+ name: Install env dependencies
41
+ command: |
42
+ sudo apt-get update
43
+ sudo apt-get install postgresql-client
44
+ - restore_cache:
45
+ key: v1-qc-bundler-{{ checksum "Gemfile" }}-{{ checksum "queue_classic.gemspec"
46
+ }}
47
+ - run:
48
+ name: Install Ruby gems
49
+ command: |
50
+ bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3
51
+ - save_cache:
52
+ key: v1-qc-bundler-{{ checksum "Gemfile" }}-{{ checksum "queue_classic.gemspec"
53
+ }}
54
+ paths:
55
+ - ~/project/vendor/bundle
56
+ - run:
57
+ name: Minitest
58
+ command: |
59
+ bundle exec rake
60
+ - store_artifacts:
61
+ path: test/reports/
62
+ - store_test_results:
63
+ path: test/reports/
64
+ test_ruby_2_5:
65
+ docker:
66
+ - image: circleci/ruby:2.5
67
+ environment:
68
+ RAILS_ENV: test
69
+ RACK_ENV: test
70
+ POSTGRES_USER: root
71
+ PGHOST: 127.0.0.1
72
+ DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
73
+ QC_DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
74
+ QC_BENCHMARK: true
75
+ QC_BENCHMARK_MAX_TIME_DEQUEUE: 60
76
+ - image: circleci/postgres:9.6.6-alpine
77
+ steps:
78
+ - checkout
79
+ - run:
80
+ name: Install env dependencies
81
+ command: |
82
+ sudo apt-get update
83
+ sudo apt-get install postgresql-client
84
+ - restore_cache:
85
+ key: v1-qc-bundler-{{ checksum "Gemfile" }}-{{ checksum "queue_classic.gemspec"
86
+ }}
87
+ - run:
88
+ name: Install Ruby gems
89
+ command: |
90
+ bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3
91
+ - save_cache:
92
+ key: v1-qc-bundler-{{ checksum "Gemfile" }}-{{ checksum "queue_classic.gemspec"
93
+ }}
94
+ paths:
95
+ - ~/project/vendor/bundle
96
+ - run:
97
+ name: Minitest
98
+ command: |
99
+ bundle exec rake
100
+ - store_artifacts:
101
+ path: test/reports/
102
+ - store_test_results:
103
+ path: test/reports/
104
+ test_ruby_2_6:
105
+ docker:
106
+ - image: circleci/ruby:2.6
107
+ environment:
108
+ RAILS_ENV: test
109
+ RACK_ENV: test
110
+ POSTGRES_USER: root
111
+ PGHOST: 127.0.0.1
112
+ DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
113
+ QC_DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
114
+ QC_BENCHMARK: true
115
+ QC_BENCHMARK_MAX_TIME_DEQUEUE: 60
116
+ - image: circleci/postgres:9.6.6-alpine
117
+ steps:
118
+ - checkout
119
+ - run:
120
+ name: Install env dependencies
121
+ command: |
122
+ sudo apt-get update
123
+ sudo apt-get install postgresql-client
124
+ - restore_cache:
125
+ key: v1-qc-bundler-{{ checksum "Gemfile" }}-{{ checksum "queue_classic.gemspec"
126
+ }}
127
+ - run:
128
+ name: Install Ruby gems
129
+ command: |
130
+ bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3
131
+ - save_cache:
132
+ key: v1-qc-bundler-{{ checksum "Gemfile" }}-{{ checksum "queue_classic.gemspec"
133
+ }}
134
+ paths:
135
+ - ~/project/vendor/bundle
136
+ - run:
137
+ name: Minitest
138
+ command: |
139
+ bundle exec rake
140
+ - store_artifacts:
141
+ path: test/reports/
142
+ - store_test_results:
143
+ path: test/reports/
144
+ test_ruby_2_7:
145
+ docker:
146
+ - image: circleci/ruby:2.7
147
+ environment:
148
+ RAILS_ENV: test
149
+ RACK_ENV: test
150
+ POSTGRES_USER: root
151
+ PGHOST: 127.0.0.1
152
+ DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
153
+ QC_DATABASE_URL: postgres://postgres@127.0.0.1/circle_test
154
+ QC_BENCHMARK: true
155
+ QC_BENCHMARK_MAX_TIME_DEQUEUE: 60
156
+ - image: circleci/postgres:9.6.6-alpine
157
+ steps:
158
+ - checkout
159
+ - run:
160
+ name: Install env dependencies
161
+ command: |
162
+ sudo apt-get update
163
+ sudo apt-get install postgresql-client
164
+ - restore_cache:
165
+ key: v1-qc-bundler-{{ checksum "Gemfile" }}-{{ checksum "queue_classic.gemspec"
166
+ }}
167
+ - run:
168
+ name: Install Ruby gems
169
+ command: |
170
+ bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3
171
+ - save_cache:
172
+ key: v1-qc-bundler-{{ checksum "Gemfile" }}-{{ checksum "queue_classic.gemspec"
173
+ }}
174
+ paths:
175
+ - ~/project/vendor/bundle
176
+ - run:
177
+ name: Minitest
178
+ command: |
179
+ bundle exec rake
180
+ - store_artifacts:
181
+ path: test/reports/
182
+ - store_test_results:
183
+ path: test/reports/
184
+ workflows:
185
+ version: 2
186
+ test:
187
+ jobs:
188
+ - test_ruby_2_4
189
+ - test_ruby_2_5
190
+ - test_ruby_2_6
191
+ - test_ruby_2_7
192
+ - test_fresh_install_rails_5_2_3
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ .db
2
+ .ruby-version
3
+ .bundle
4
+ .rvmrc
5
+ etc/
6
+ *.gem
7
+ .env
8
+ Gemfile.lock
9
+ tips-and-tricks.md
10
+ test/reports/
11
+ vendor/
data/CHANGELOG.md ADDED
@@ -0,0 +1,192 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [4.0.0-alpha1] - 2019-07-18
6
+
7
+ Updates:
8
+ - [Change to only support >= Postgres 9.6. We will be bringing in newer changes and testing on only 9.6+ going forward.](https://github.com/QueueClassic/queue_classic/pull/307)
9
+ - [Change to only support currently supported Ruby versions: 2.4, 2.5 and 2.6.](https://github.com/QueueClassic/queue_classic/pull/305)
10
+ - [Use skip-locked](https://github.com/QueueClassic/queue_classic/pull/303)
11
+ - [Add abilty to count ready and scheduled jobs](https://github.com/QueueClassic/queue_classic/pull/255)
12
+
13
+ Bug fixes:
14
+ - [Switched project to use CircleCI, as it's way more consistent speed wise](https://github.com/QueueClassic/queue_classic/pull/304)
15
+ - [Automatically retry after a connection reset #294](https://github.com/QueueClassic/queue_classic/pull/294)
16
+ - [Add tests for installing fresh on rails 5.2.3 + running migrations](https://github.com/QueueClassic/queue_classic/pull/308)
17
+ - [Don't recuse Time.now errors](https://github.com/QueueClassic/queue_classic/pull/310)
18
+ - Use the jsonb type for the args column from now on. If not available, fall back to json or text.
19
+ - `enqueue`, `enqueue_at`, `enqueue_in` return job hash with id.
20
+ - Fixed a bug in the offset calculation of `.enqueue_at`.
21
+
22
+ ## [3.0.0rc] - 2014-01-07
23
+
24
+ - Improved signal handling
25
+
26
+ ## [3.0.0beta] - 2014-01-06
27
+
28
+ - Workers can process many queues.
29
+
30
+ ## [2.2.3] - 2013-10-24
31
+
32
+ - Update pg dependency to 0.17.0
33
+
34
+ ## [2.3.0beta] - 2013-09-05 YANKED
35
+
36
+ - Concurrent job processing.
37
+
38
+ ## [2.2.2] - 2013-08-04
39
+
40
+ - Update pg dependency to 0.16.0
41
+
42
+ ## [2.2.1] - 2013-07-12
43
+
44
+ - Force listen/notify on worker
45
+ - Notifications happen inside PostgreSQL trigger
46
+ - Add rake task for generating rails migrations
47
+ - Fix bug related to listening worker
48
+
49
+ ## [2.2.0] - 2013-07-02
50
+
51
+ - Use json from the stdlib in place of MultiJson.
52
+ - Use postgresql's json type for the args column if json type is available
53
+ - QC::Worker#handle_failure logs the job and the error
54
+ - QC.default_queue= to set your own default queue. (can be used
55
+ in testing to configure a mock queue)
56
+ - QC.log now reports time elapsed in milliseconds.
57
+
58
+ ## [2.1.4]
59
+
60
+ - Update pg dependency to 0.15.1
61
+ - Document logging behaviour
62
+
63
+ ## [2.1.3]
64
+
65
+ - Use MultiJson (Ezekiel Templin: #106)
66
+
67
+ ## [2.1.2]
68
+
69
+ - Use 64bit ints as default data types in PostgreSQL
70
+ - Add process method in worker
71
+ - Allow percent-encoded socket paths in DATABASE_URL
72
+
73
+ ## [2.1.1]
74
+
75
+ - Update pg gem version
76
+
77
+ ## [2.1.0]
78
+
79
+ - Wrap connection execution in mutex making it thread safe
80
+ - Cleanup logging
81
+ - Refactor worker class making it more extensible
82
+ - Added rdoc style docs for worker class
83
+
84
+ ## [2.0.5]
85
+
86
+ - Allow term signal to halt the lock_job function
87
+
88
+ ## [2.0.4]
89
+
90
+ - Provider a connection setter.
91
+
92
+ ## [2.0.3]
93
+
94
+ - Fix typo :(
95
+
96
+ ## [2.0.2]
97
+
98
+ - Remove scrolls dependency
99
+ - Fix issue with notify not working on non-default queues
100
+
101
+ ## [2.0.1]
102
+
103
+ ## [2.0.0]
104
+
105
+ - Simpler setup via QC::Setup.create (rake qc:create) & QC::Setup.drop (rake
106
+ qc:drop)
107
+ - Simpler abstractions in implementation
108
+ - Better support for instrumentation via log_yield hook in QC module
109
+ - Multiple queues use one table with a queue_name column
110
+
111
+ ## [1.0.2]
112
+
113
+ - Update to latest okjson as the current has bugs
114
+
115
+ ## [1.0.1]
116
+
117
+ - Using OkJson instead of any sort of rubygem
118
+ - Remove html from docs
119
+ - Use parameterised queries
120
+ - Don't set application name by default
121
+ - Injection attack bug fixed in lock_head()
122
+ - Notificaiton get sent on seperate chans for disjoint queues
123
+
124
+ ## [1.0.0rc1] - 2011-08-29
125
+
126
+ - Removed json gem and relying on ruby 1.9.2's stdlib
127
+ - Added better documentation
128
+
129
+ ## [0.3.6pre]
130
+
131
+ - Added listen/notify support configured by $QC_LISTENING_WORKER otherwise uses Kernel.sleep()
132
+
133
+ ## [0.3.5pre] - 2011-08-27
134
+
135
+ - Removed debug statement. Mistake!
136
+
137
+ ## [0.3.4pre]
138
+
139
+ - Added logging configured by $VERBOSE or $QC_VERBOSE.
140
+ - Added a method setup_child that gets called right after a worker forks.
141
+ - Removed database helper methods: create_table, drop_table, silence_warnings.
142
+ - Removed queue connection helper methods. Status should be discoverd by psql or the likes.
143
+
144
+ ## [0.3.3pre]
145
+
146
+ - Removed PUB/SUB
147
+ - Added GC after working a job
148
+ - Added support for a database_url other than $DATABASE_URL. $QC_DATABASE_URL
149
+ - Added exp backoff configured by $QC_MAX_LOCK_ATTEMPTS (default = 5)
150
+ - Added option for forking worker configured by $QC_FORK_WORKER (default = false)
151
+
152
+ ## [0.3.2] - 2011-08-03
153
+
154
+ - Fixed bug which caused workers to consume 2 connections. Now they only consume 1
155
+ - Added a rake file for tests
156
+ - Added support for postgres:///db_name DATABASE_URLs
157
+
158
+ ## [0.3.1] - 2011-04-27
159
+
160
+ - Added query interface for introspection success
161
+ - Moved the locking of jobs into the DB as a PG function. SELECT lock_head()
162
+ - Added requirement for DB connection. MUST BE URI i.e. DATABASE_URL=postgres://user:pass@localhost/db_name
163
+ - Added rake qc:create_queue. This task will add a new table. Use this for multiple queues.
164
+ - Added a bit of randomness to the lock_head() function. Helps you scale to a hilarious number of workers.
165
+ - Added support for trapping INT and TERM signals in the worker. ^C to stop after finished and ^C^C to kill.
166
+ - Renamed the jobs table to queue_classic_jobs
167
+ - Renamed the jobs channel to queue_classic_jobs
168
+ - Added support for multiple queues
169
+
170
+ ## [0.2.2] - 2011-02-26
171
+
172
+ - Fixed problems with enqueueing a list of parameters.
173
+
174
+ ## [0.2.1] - 2011-02-22
175
+
176
+ - Added method for handling errors.
177
+ - Added ability to enqueue a Job instance. Makes retrying jobs easier.
178
+ - Added delete_all.
179
+ - Fixed connection algorithm. 1 connection per process.
180
+ - Fixed API for enqueue. Now accepting 1 arg or many args.
181
+
182
+ ## [0.2.0] - 2011-02-17
183
+
184
+ - Beta Release
185
+ - Added method for handling failed jobs
186
+ - Added Benchmarks
187
+ - Removed logging
188
+ - Moved the Job class into it's own file
189
+
190
+ ## [0.1.6] - 2011-02-03
191
+
192
+ - Early release
@@ -0,0 +1,46 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+ ## Our Standards
8
+
9
+ Examples of behavior that contributes to creating a positive environment include:
10
+
11
+ * Using welcoming and inclusive language
12
+ * Being respectful of differing viewpoints and experiences
13
+ * Gracefully accepting constructive criticism
14
+ * Focusing on what is best for the community
15
+ * Showing empathy towards other community members
16
+
17
+ Examples of unacceptable behavior by participants include:
18
+
19
+ * The use of sexualized language or imagery and unwelcome sexual attention or advances
20
+ * Trolling, insulting/derogatory comments, and personal or political attacks
21
+ * Public or private harassment
22
+ * Publishing others' private information, such as a physical or electronic address, without explicit permission
23
+ * Other conduct which could reasonably be considered inappropriate in a professional setting
24
+
25
+ ## Our Responsibilities
26
+
27
+ Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
28
+
29
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
30
+
31
+ ## Scope
32
+
33
+ This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
34
+
35
+ ## Enforcement
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at isitaboat+qc@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
38
+
39
+ Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
40
+
41
+ ## Attribution
42
+
43
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
44
+
45
+ [homepage]: http://contributor-covenant.org
46
+ [version]: http://contributor-covenant.org/version/1/4/
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,17 @@
1
+ queue_classic is a volunteer effort. We encourage you to pitch in.
2
+
3
+ 1. Fork queue_classic
4
+ 2. Create a topic branch - `git checkout -b my_branch`
5
+ 3. Push to your branch - `git push origin my_branch`
6
+ 4. Send us a pull-request for your topic branch
7
+ 5. That's it!
8
+
9
+ If you make code changes, please check that your patch:
10
+
11
+ 1. has tests
12
+ 2. works on Rails and non-Rails projects
13
+ 3. updates documentation
14
+
15
+ Thanks! :heart:
16
+
17
+ queue_classic Team
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org' do
4
+ gem 'rake'
5
+
6
+ gemspec
7
+
8
+ group :test do
9
+ gem 'minitest', '~> 5.8'
10
+ gem 'minitest-reporters'
11
+ end
12
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
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.