Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Main #11

Open
wants to merge 191 commits into
base: main
Choose a base branch
from
Open

Main #11

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
191 commits
Select commit Hold shift + click to select a range
7cf0e04
24.11.02 fix broken tests
belamenso Nov 2, 2024
81f1ced
Merge pull request #2 from belamenso/24.11.02-fix-broken-tests
belamenso Nov 2, 2024
7792823
Merge branch 'aherlihy:main' into main
belamenso Nov 10, 2024
c87539c
Docker instrumentation for DBs and tests
belamenso Nov 13, 2024
a3334b8
Check connection to the DBs
belamenso Nov 13, 2024
2a2bbbb
Testsuite separation is now via MUnit tags
belamenso Nov 15, 2024
1d823b4
Also instument the H2 DB
belamenso Nov 15, 2024
8d29f44
test: rename integration test for clarity
belamenso Nov 15, 2024
5c8b3dc
Development section of the README
belamenso Nov 15, 2024
2d39fdd
Better connection tests for H2
belamenso Nov 17, 2024
b9f73c2
Seal Ord
belamenso Nov 17, 2024
e1a0859
Dialect specialization for string literals and quoting identifiers
belamenso Nov 17, 2024
ec61dcf
Optimized string literal quoting
belamenso Nov 18, 2024
1c2043a
Helper funtions to invoke DBs
belamenso Nov 18, 2024
52c774a
Refactor LIKE string quoting tests for clarity
belamenso Nov 18, 2024
e4e0942
Config (for now just case conversions), fix implicit propagation
belamenso Nov 18, 2024
265e518
DB test: add parametrization over all backends
belamenso Nov 18, 2024
d9b901f
Rename munit tag `expensiveTest` -> `needsDBs`
belamenso Nov 18, 2024
1007440
test: we can send and receive unicode
belamenso Nov 18, 2024
a3b70ed
A comment
belamenso Nov 18, 2024
4d71194
whitespace
belamenso Nov 18, 2024
6b1aa54
tests: db connection helpers also need a version without implicits fo…
belamenso Nov 18, 2024
014e7dd
Dialect feature: fetch random float between 0 and 1
belamenso Nov 18, 2024
854c00c
docker: update info message
belamenso Nov 18, 2024
81d80ae
dialect: sqlite: add random float
belamenso Nov 19, 2024
c09831a
dialect: add randomUUID()
belamenso Nov 19, 2024
a9d736d
dialect feature: randomInt(a, b)
belamenso Nov 19, 2024
2deefbc
dialect: string lengths
belamenso Nov 19, 2024
39b0a5f
tests: helper method to test single expression
belamenso Nov 19, 2024
60c4518
remove mistaken import
belamenso Nov 19, 2024
8350d14
dialect: string upper/lower
belamenso Nov 19, 2024
7295e8c
Dialect generation binds as late as possible
belamenso Nov 19, 2024
b184e46
comment
belamenso Nov 19, 2024
baea56f
implement XOR and test boolean operators, we have terrible precedence…
belamenso Nov 19, 2024
3db7298
a comment
belamenso Nov 19, 2024
6c7a245
a comment
belamenso Nov 19, 2024
fced269
a comment
belamenso Nov 19, 2024
26226a0
remove debug println
belamenso Nov 19, 2024
fc311b0
handle precedence to omit unnecessary ()s
belamenso Nov 19, 2024
a4d7b4c
credit Claude with information extraction tasks from documentation
belamenso Nov 19, 2024
99227a3
Add DataGrip configuration to README.md
belamenso Nov 19, 2024
bac2948
DataGrip configuration screenshot
belamenso Nov 19, 2024
f930dd0
a warning comment
belamenso Nov 19, 2024
d4b12c2
cache QueryIRNode.toSQLString
belamenso Nov 19, 2024
7e76307
readme: current tooling problems
belamenso Nov 19, 2024
5329d4e
update README.md
belamenso Nov 19, 2024
92ab394
add Expr.Minus and workarounds around a scala compiler bug
belamenso Nov 19, 2024
7b13c21
tests: precedence
belamenso Nov 19, 2024
1145015
update README.md
belamenso Nov 19, 2024
6cdf5c2
update README.md
belamenso Nov 19, 2024
6cf7f57
tests: broken dialect selection
belamenso Nov 19, 2024
297483c
work around a parsing bug in Metals
belamenso Nov 19, 2024
5779dee
test: toQueryIR, toSQLString caching
belamenso Nov 19, 2024
c29add2
comments: todos
belamenso Nov 19, 2024
83f1000
whitespace
belamenso Nov 19, 2024
c0d6971
dialects: random* operations are now late-binding
belamenso Nov 19, 2024
90c889f
dialect: finish refactoring of random
belamenso Nov 20, 2024
7a57508
does markdown handle comments?
belamenso Nov 21, 2024
1bf34d5
create documentation/development.md
belamenso Nov 21, 2024
68e6d4e
scala version = 3.5.2
belamenso Nov 21, 2024
4b56629
remove unused code
belamenso Nov 21, 2024
4b2de75
fix the postgresql driver registration issue
belamenso Nov 21, 2024
d8f3654
remove unused import
belamenso Nov 21, 2024
6d753e5
add lit(), True, False
belamenso Nov 21, 2024
1ca7b31
CASE statements
belamenso Nov 21, 2024
97a86f9
enforce arg # for CASE with type system
belamenso Nov 21, 2024
98b560b
basic string operations
belamenso Nov 21, 2024
2052172
string.reverse
belamenso Nov 21, 2024
5daa59f
string.repeat
belamenso Nov 21, 2024
8af0732
string.{lpad, rpad}
belamenso Nov 21, 2024
2bac1ec
string.findPosition
belamenso Nov 21, 2024
a9d7146
remove printlns, use lit() to supress warnings
belamenso Nov 21, 2024
c62adcf
dialect: octet_length generation simplified
belamenso Nov 22, 2024
3b5b5ee
SQL snippets now have precedence metadata
belamenso Nov 22, 2024
5dede04
do not repeat the parameters in macro-like snippets
belamenso Nov 22, 2024
f9e6ffc
RandomFloat is everywhere, no need to be a feature
belamenso Nov 23, 2024
b0595e6
first draft of documentation generation
belamenso Nov 23, 2024
cc0caca
more case conversions handled
belamenso Nov 24, 2024
e329c00
documentation: polyfill tracking, returning sql
belamenso Nov 24, 2024
e7c1fde
first draft of nulls
belamenso Nov 24, 2024
362350a
a comment
belamenso Nov 24, 2024
a3c69be
attempt to use Github CI
belamenso Nov 25, 2024
dca23c0
rename workflows
belamenso Nov 25, 2024
d6d2840
`docker compose` not `docker-compose`
belamenso Nov 25, 2024
0f94b56
do not install docker compose
belamenso Nov 25, 2024
aa8ca34
CI: change directory permissions
belamenso Nov 25, 2024
db8a1e6
CI: better test failure parsing
belamenso Nov 25, 2024
5f9873c
some mathematical operations
belamenso Nov 26, 2024
5839511
first draft of null-safe equality
belamenso Nov 26, 2024
611cf81
=== equality can be weakly-typed if the dialect allows it
belamenso Nov 26, 2024
e2016fd
H2 does not have weakly-typed equality
belamenso Nov 26, 2024
fd3213a
towards per-dialect equality semantics
belamenso Nov 26, 2024
eef06ff
fix failing tests
belamenso Nov 26, 2024
28af743
equality semantics is now fully dialect-specific
belamenso Nov 26, 2024
4812a45
simplify numeric comparisons
belamenso Nov 26, 2024
a760ea8
simplify arithmetic operations
belamenso Nov 26, 2024
a479d9c
driver converts fetched values to native types again
belamenso Dec 1, 2024
6efe023
remove that println
belamenso Dec 1, 2024
3b0180b
Gte works now
belamenso Dec 1, 2024
56da5d9
a way to handle NULLS gracefully: Option
belamenso Dec 1, 2024
9b61ea7
driver: use int column indices
belamenso Dec 1, 2024
fc84a66
something towards Option.map, unclear if correct
belamenso Dec 1, 2024
4b2e4e9
some printlns
belamenso Dec 1, 2024
525bc81
tables do not need to be named when generated from a case class
belamenso Dec 1, 2024
e03a4c2
a comment
belamenso Dec 1, 2024
fbc8420
remove line that doesn't work on github CI
belamenso Dec 1, 2024
cf36b35
casts to a predefined set of types
belamenso Dec 1, 2024
2f8cca6
a comment
belamenso Dec 1, 2024
87629db
switch to main for github ci
belamenso Dec 21, 2024
cdc5dc4
scala version is now 3.6.2
belamenso Dec 21, 2024
160f1db
no need for special munit version anymore
belamenso Dec 21, 2024
6630fe9
polyfill debugging behind a macro
belamenso Dec 26, 2024
bf78f7d
Windows testing comment
belamenso Dec 26, 2024
0fa585e
elision doesn't seem to work
belamenso Dec 26, 2024
f2b9781
actually working conditional compilation
belamenso Dec 27, 2024
f0aad2d
Create LICENSE
belamenso Dec 27, 2024
9cd48e5
java naming convention for files
belamenso Dec 28, 2024
9e160c6
remove `drop` because it is confusing
belamenso Dec 28, 2024
ea08d9c
polyfill tracking by itself
belamenso Dec 28, 2024
c326b65
seal ExprShape again
belamenso Dec 28, 2024
8ef1ffd
comments
belamenso Dec 28, 2024
9520d44
runRaw
belamenso Dec 28, 2024
3dfa347
build.sbt comments
belamenso Dec 28, 2024
3752ec1
small Query refactoring
belamenso Dec 29, 2024
20159a4
whitespace
belamenso Dec 29, 2024
f458fff
comments
belamenso Dec 29, 2024
f46a34a
do not use deprecated implicits
belamenso Dec 29, 2024
d3a0d66
pretty printer is up to date
belamenso Dec 29, 2024
52bc31f
sql rendering: more efficient, only one cache
belamenso Dec 29, 2024
c13e329
queries are now parametrized
belamenso Dec 29, 2024
b66f44f
parametrized arguments treated depending on type
belamenso Dec 29, 2024
a7da132
Config should provide defaults
belamenso Dec 29, 2024
33cedb8
development note
belamenso Dec 29, 2024
0019974
use $n over ? when idiomatic
belamenso Dec 30, 2024
831fe61
we don't need .single(), use pattern matching
belamenso Dec 30, 2024
251c623
driver works with arbitrary named tuples
belamenso Dec 30, 2024
24c7d39
window functions
belamenso Dec 30, 2024
cdbdda3
comments
belamenso Dec 31, 2024
f1093c9
comments about group by
belamenso Dec 31, 2024
c8d65a4
seal AggrExpr
belamenso Dec 31, 2024
e8f2b79
scalafmt, remove from git-blame
belamenso Dec 31, 2024
cbefc23
aggregations now also allow literals
belamenso Dec 31, 2024
f28a255
VALUES()
belamenso Dec 31, 2024
590452d
between on numerics
belamenso Jan 1, 2025
6949f51
comparable types
belamenso Jan 1, 2025
9f2fd38
Contains, type improvements, values
belamenso Jan 1, 2025
6c1e6cb
remove warning
belamenso Jan 1, 2025
dc5fd1a
better typing of contains, works across dialects
belamenso Jan 1, 2025
f0a3d41
INSERT INTO with nice type-safety
belamenso Jan 1, 2025
5fbbd38
insert works with case classes
belamenso Jan 1, 2025
96744a9
insert into from select
belamenso Jan 1, 2025
370760f
rename to TypeOperations
belamenso Jan 1, 2025
a5785af
deal with that ExprShape overloading issue
belamenso Jan 1, 2025
ae4f03f
Some basic types
belamenso Jan 1, 2025
650d8b3
bytes
belamenso Jan 1, 2025
9026710
octet_length(blob)
belamenso Jan 1, 2025
0b45571
merge deletes
belamenso Jan 5, 2025
2c9729f
merge updates
belamenso Jan 5, 2025
30fa23a
a comment
belamenso Jan 5, 2025
a90c38a
CanBeEqualed more generic
belamenso Jan 5, 2025
d146203
make the reference counters Longs
belamenso Jan 5, 2025
a89a4ad
integral/integral division should ALWAYS be floating
belamenso Jan 5, 2025
79a51ba
merge branch selectDesc
belamenso Jan 5, 2025
32ae965
merge branch joins-no-tests
belamenso Jan 6, 2025
2f75019
Option.map
belamenso Jan 6, 2025
75af2ab
aggregation typing
belamenso Jan 6, 2025
71b6100
enable affine recursion restriction
belamenso Jan 7, 2025
13b5b94
comment
belamenso Jan 7, 2025
d2208d7
restrict optional operations
belamenso Jan 7, 2025
3eb95ab
some simple benchmarks
belamenso Jan 9, 2025
b062a90
naming
belamenso Jan 9, 2025
2bea407
rename Query.Value
belamenso Jan 12, 2025
146065a
add profiling results of query generation
belamenso Jan 12, 2025
fce434b
SELECT expressions
belamenso Jan 16, 2025
9d56944
more time and date functions
belamenso Jan 16, 2025
4c05a3d
some more implicitNotFound
belamenso Jan 16, 2025
2fac983
a comment
belamenso Jan 16, 2025
0d2c40c
better array/list support
belamenso Jan 19, 2025
1139a42
remove profiling results
belamenso Jan 19, 2025
fd13996
re-enable caching at the query level
belamenso Jan 19, 2025
667ab8a
un-ignore precedence testing for double division
belamenso Jan 19, 2025
f4f6b9f
split QueryIRNode into files
belamenso Jan 19, 2025
979edb0
add 0-based array indexing
belamenso Jan 19, 2025
06309af
parametrize changing inputs to preserve caching benefits
belamenso Jan 19, 2025
8c4e959
make literals final
belamenso Jan 19, 2025
b2bdf22
projecting a whole row uses more universal syntax
belamenso Jan 19, 2025
05cc534
draft of readme
belamenso Jan 19, 2025
34ba0a8
draft of readme: limits of compile-time checking
belamenso Jan 19, 2025
9b53c31
readme typo
belamenso Jan 19, 2025
ec3aee2
readme toc
belamenso Jan 19, 2025
66ee42d
typos
belamenso Jan 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.dockerignore
.git/
.gitignore
target/
project/target/
test-results/
*.md
*.log
.bloop/
.metals/
.bsp/
1 change: 1 addition & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
c8d65a4ff19efdcb98bfa81f26e5a13f0c5e417e
54 changes: 54 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Test

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
test:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Create directories and set permissions
run: |
mkdir -p test-results
mkdir -p target
sudo chown -R 1000:1000 test-results
sudo chown -R 1000:1000 target
sudo chmod -R 777 test-results
sudo chmod -R 777 target

- name: Build and run tests
run: |
docker compose --profile dbs --profile tests up \
--build \
--exit-code-from main \
--abort-on-container-exit

- name: Upload test results
if: always() # Run even if tests fail
uses: actions/upload-artifact@v4
with:
name: test-results
path: test-results/
retention-days: 14

- name: Check test output for failures
run: |
if grep -q "Passed: Total .*, Failed 0, Errors 0," test-results/test-output_*.log; then
echo "All tests passed!"
exit 0
else
echo "Tests failed!"
exit 1
fi

1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,4 @@ cs

# Coursier test product
compiler/test-coursier/run/*.jar
/test-results/
18 changes: 18 additions & 0 deletions .scalafmt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
version = 3.8.3
runner.dialect = scala3future
maxColumn = 120
rewrite.trailingCommas.style = keep
indent.main = 2
align.preset = some
project.git = true // do we really want this?
lineEndings = unix
spaces {
beforeContextBoundColon = IfMultipleBounds
inImportCurlyBraces = false
}
rewrite.imports.sort = ascii
rewrite.imports.expand = true
newlines.source = keep
comments.wrap = no
newlines.beforeOpenParenDefnSite = unfold

43 changes: 43 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
FROM debian:12

# Install all packages in one layer, including sbt repository setup
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
unzip \
netcat-openbsd \
sqlite3 \
ca-certificates \
gnupg && \
echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | tee /etc/apt/sources.list.d/sbt.list && \
curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | apt-key add && \
curl -L https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.deb -o jdk.deb && \
apt-get update && \
apt-get install -y --no-install-recommends \
./jdk.deb \
sbt && \
rm jdk.deb && \
rm -rf /var/lib/apt/lists/*

# Install DuckDB
RUN curl -L https://github.com/duckdb/duckdb/releases/download/v0.8.1/duckdb_cli-linux-amd64.zip -o duckdb.zip \
&& unzip duckdb.zip \
&& mv duckdb /usr/local/bin/ \
&& chmod +x /usr/local/bin/duckdb \
&& rm duckdb.zip

# Run as a non-root user
RUN useradd -m -s /bin/bash appuser \
&& mkdir -p /app /test-results \
&& chown -R appuser:appuser /app /test-results

USER appuser
WORKDIR /app
COPY --chown=appuser:appuser build.sbt ./
COPY --chown=appuser:appuser project ./project
RUN sbt update
COPY --chown=appuser:appuser start.sh /start.sh
RUN chmod +x /start.sh

CMD ["/start.sh"]

201 changes: 201 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.

"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:

(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.

You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Loading