├── .github └── workflows │ ├── doc-build.yml │ ├── release.yml │ ├── snapshot.yml │ └── test.yml ├── .gitignore ├── LICENSE ├── README.md ├── bin └── run_generative_tests.clj ├── epl-v10.html ├── pom.xml ├── project.clj └── src ├── main └── clojure │ └── clojure │ └── data │ └── fressian.clj └── test └── clojure └── clojure └── data └── fressian_test.clj /.github/workflows/doc-build.yml: -------------------------------------------------------------------------------- 1 | name: Build API Docs 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | call-doc-build-workflow: 8 | uses: clojure/build.ci/.github/workflows/doc-build.yml@master 9 | with: 10 | project: clojure/data.fressian 11 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release on demand 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | releaseVersion: 7 | description: "Version to release" 8 | required: true 9 | snapshotVersion: 10 | description: "Snapshot version after release" 11 | required: true 12 | 13 | jobs: 14 | call-release: 15 | uses: clojure/build.ci/.github/workflows/release.yml@master 16 | with: 17 | releaseVersion: ${{ github.event.inputs.releaseVersion }} 18 | snapshotVersion: ${{ github.event.inputs.snapshotVersion }} 19 | secrets: inherit -------------------------------------------------------------------------------- /.github/workflows/snapshot.yml: -------------------------------------------------------------------------------- 1 | name: Snapshot on demand 2 | 3 | on: [workflow_dispatch] 4 | 5 | jobs: 6 | call-snapshot: 7 | uses: clojure/build.ci/.github/workflows/snapshot.yml@master 8 | secrets: inherit 9 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: [push] 4 | 5 | jobs: 6 | call-test: 7 | uses: clojure/build.ci/.github/workflows/test.yml@master 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Eclipse Public License - v 1.0 2 | 3 | THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC 4 | LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM 5 | CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 6 | 7 | 1. DEFINITIONS 8 | 9 | "Contribution" means: 10 | 11 | a) in the case of the initial Contributor, the initial code and documentation 12 | distributed under this Agreement, and 13 | b) in the case of each subsequent Contributor: 14 | i) changes to the Program, and 15 | ii) additions to the Program; 16 | 17 | where such changes and/or additions to the Program originate from and are 18 | distributed by that particular Contributor. A Contribution 'originates' 19 | from a Contributor if it was added to the Program by such Contributor 20 | itself or anyone acting on such Contributor's behalf. Contributions do not 21 | include additions to the Program which: (i) are separate modules of 22 | software distributed in conjunction with the Program under their own 23 | license agreement, and (ii) are not derivative works of the Program. 24 | 25 | "Contributor" means any person or entity that distributes the Program. 26 | 27 | "Licensed Patents" mean patent claims licensable by a Contributor which are 28 | necessarily infringed by the use or sale of its Contribution alone or when 29 | combined with the Program. 30 | 31 | "Program" means the Contributions distributed in accordance with this 32 | Agreement. 33 | 34 | "Recipient" means anyone who receives the Program under this Agreement, 35 | including all Contributors. 36 | 37 | 2. GRANT OF RIGHTS 38 | a) Subject to the terms of this Agreement, each Contributor hereby grants 39 | Recipient a non-exclusive, worldwide, royalty-free copyright license to 40 | reproduce, prepare derivative works of, publicly display, publicly 41 | perform, distribute and sublicense the Contribution of such Contributor, 42 | if any, and such derivative works, in source code and object code form. 43 | b) Subject to the terms of this Agreement, each Contributor hereby grants 44 | Recipient a non-exclusive, worldwide, royalty-free patent license under 45 | Licensed Patents to make, use, sell, offer to sell, import and otherwise 46 | transfer the Contribution of such Contributor, if any, in source code and 47 | object code form. This patent license shall apply to the combination of 48 | the Contribution and the Program if, at the time the Contribution is 49 | added by the Contributor, such addition of the Contribution causes such 50 | combination to be covered by the Licensed Patents. The patent license 51 | shall not apply to any other combinations which include the Contribution. 52 | No hardware per se is licensed hereunder. 53 | c) Recipient understands that although each Contributor grants the licenses 54 | to its Contributions set forth herein, no assurances are provided by any 55 | Contributor that the Program does not infringe the patent or other 56 | intellectual property rights of any other entity. Each Contributor 57 | disclaims any liability to Recipient for claims brought by any other 58 | entity based on infringement of intellectual property rights or 59 | otherwise. As a condition to exercising the rights and licenses granted 60 | hereunder, each Recipient hereby assumes sole responsibility to secure 61 | any other intellectual property rights needed, if any. For example, if a 62 | third party patent license is required to allow Recipient to distribute 63 | the Program, it is Recipient's responsibility to acquire that license 64 | before distributing the Program. 65 | d) Each Contributor represents that to its knowledge it has sufficient 66 | copyright rights in its Contribution, if any, to grant the copyright 67 | license set forth in this Agreement. 68 | 69 | 3. REQUIREMENTS 70 | 71 | A Contributor may choose to distribute the Program in object code form under 72 | its own license agreement, provided that: 73 | 74 | a) it complies with the terms and conditions of this Agreement; and 75 | b) its license agreement: 76 | i) effectively disclaims on behalf of all Contributors all warranties 77 | and conditions, express and implied, including warranties or 78 | conditions of title and non-infringement, and implied warranties or 79 | conditions of merchantability and fitness for a particular purpose; 80 | ii) effectively excludes on behalf of all Contributors all liability for 81 | damages, including direct, indirect, special, incidental and 82 | consequential damages, such as lost profits; 83 | iii) states that any provisions which differ from this Agreement are 84 | offered by that Contributor alone and not by any other party; and 85 | iv) states that source code for the Program is available from such 86 | Contributor, and informs licensees how to obtain it in a reasonable 87 | manner on or through a medium customarily used for software exchange. 88 | 89 | When the Program is made available in source code form: 90 | 91 | a) it must be made available under this Agreement; and 92 | b) a copy of this Agreement must be included with each copy of the Program. 93 | Contributors may not remove or alter any copyright notices contained 94 | within the Program. 95 | 96 | Each Contributor must identify itself as the originator of its Contribution, 97 | if 98 | any, in a manner that reasonably allows subsequent Recipients to identify the 99 | originator of the Contribution. 100 | 101 | 4. COMMERCIAL DISTRIBUTION 102 | 103 | Commercial distributors of software may accept certain responsibilities with 104 | respect to end users, business partners and the like. While this license is 105 | intended to facilitate the commercial use of the Program, the Contributor who 106 | includes the Program in a commercial product offering should do so in a manner 107 | which does not create potential liability for other Contributors. Therefore, 108 | if a Contributor includes the Program in a commercial product offering, such 109 | Contributor ("Commercial Contributor") hereby agrees to defend and indemnify 110 | every other Contributor ("Indemnified Contributor") against any losses, 111 | damages and costs (collectively "Losses") arising from claims, lawsuits and 112 | other legal actions brought by a third party against the Indemnified 113 | Contributor to the extent caused by the acts or omissions of such Commercial 114 | Contributor in connection with its distribution of the Program in a commercial 115 | product offering. The obligations in this section do not apply to any claims 116 | or Losses relating to any actual or alleged intellectual property 117 | infringement. In order to qualify, an Indemnified Contributor must: 118 | a) promptly notify the Commercial Contributor in writing of such claim, and 119 | b) allow the Commercial Contributor to control, and cooperate with the 120 | Commercial Contributor in, the defense and any related settlement 121 | negotiations. The Indemnified Contributor may participate in any such claim at 122 | its own expense. 123 | 124 | For example, a Contributor might include the Program in a commercial product 125 | offering, Product X. That Contributor is then a Commercial Contributor. If 126 | that Commercial Contributor then makes performance claims, or offers 127 | warranties related to Product X, those performance claims and warranties are 128 | such Commercial Contributor's responsibility alone. Under this section, the 129 | Commercial Contributor would have to defend claims against the other 130 | Contributors related to those performance claims and warranties, and if a 131 | court requires any other Contributor to pay any damages as a result, the 132 | Commercial Contributor must pay those damages. 133 | 134 | 5. NO WARRANTY 135 | 136 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN 137 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR 138 | IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, 139 | NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each 140 | Recipient is solely responsible for determining the appropriateness of using 141 | and distributing the Program and assumes all risks associated with its 142 | exercise of rights under this Agreement , including but not limited to the 143 | risks and costs of program errors, compliance with applicable laws, damage to 144 | or loss of data, programs or equipment, and unavailability or interruption of 145 | operations. 146 | 147 | 6. DISCLAIMER OF LIABILITY 148 | 149 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY 150 | CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, 151 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION 152 | LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 153 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 154 | ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE 155 | EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY 156 | OF SUCH DAMAGES. 157 | 158 | 7. GENERAL 159 | 160 | If any provision of this Agreement is invalid or unenforceable under 161 | applicable law, it shall not affect the validity or enforceability of the 162 | remainder of the terms of this Agreement, and without further action by the 163 | parties hereto, such provision shall be reformed to the minimum extent 164 | necessary to make such provision valid and enforceable. 165 | 166 | If Recipient institutes patent litigation against any entity (including a 167 | cross-claim or counterclaim in a lawsuit) alleging that the Program itself 168 | (excluding combinations of the Program with other software or hardware) 169 | infringes such Recipient's patent(s), then such Recipient's rights granted 170 | under Section 2(b) shall terminate as of the date such litigation is filed. 171 | 172 | All Recipient's rights under this Agreement shall terminate if it fails to 173 | comply with any of the material terms or conditions of this Agreement and does 174 | not cure such failure in a reasonable period of time after becoming aware of 175 | such noncompliance. If all Recipient's rights under this Agreement terminate, 176 | Recipient agrees to cease use and distribution of the Program as soon as 177 | reasonably practicable. However, Recipient's obligations under this Agreement 178 | and any licenses granted by Recipient relating to the Program shall continue 179 | and survive. 180 | 181 | Everyone is permitted to copy and distribute copies of this Agreement, but in 182 | order to avoid inconsistency the Agreement is copyrighted and may only be 183 | modified in the following manner. The Agreement Steward reserves the right to 184 | publish new versions (including revisions) of this Agreement from time to 185 | time. No one other than the Agreement Steward has the right to modify this 186 | Agreement. The Eclipse Foundation is the initial Agreement Steward. The 187 | Eclipse Foundation may assign the responsibility to serve as the Agreement 188 | Steward to a suitable separate entity. Each new version of the Agreement will 189 | be given a distinguishing version number. The Program (including 190 | Contributions) may always be distributed subject to the version of the 191 | Agreement under which it was received. In addition, after a new version of the 192 | Agreement is published, Contributor may elect to distribute the Program 193 | (including its Contributions) under the new version. Except as expressly 194 | stated in Sections 2(a) and 2(b) above, Recipient receives no rights or 195 | licenses to the intellectual property of any Contributor under this Agreement, 196 | whether expressly, by implication, estoppel or otherwise. All rights in the 197 | Program not expressly granted under this Agreement are reserved. 198 | 199 | This Agreement is governed by the laws of the State of New York and the 200 | intellectual property laws of the United States of America. No party to this 201 | Agreement will bring a legal action under this Agreement more than one year 202 | after the cause of action arose. Each party waives its rights to a jury trial in 203 | any resulting litigation. 204 | 205 | 206 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # data.fressian 2 | 3 | Read and write fressian data. See https://github.com/Datomic/fressian/wiki 4 | 5 | # Releases and Dependency Information 6 | 7 | [CLI/`deps.edn`](https://clojure.org/reference/deps_edn) dependency information: 8 | ```clojure 9 | org.clojure/data.fressian {:mvn/version "1.1.0"} 10 | ``` 11 | 12 | [Leiningen](https://github.com/technomancy/leiningen) dependency information: 13 | 14 | [org.clojure/data.fressian "1.1.0"] 15 | 16 | [Maven](http://maven.apache.org/) dependency information: 17 | 18 | 19 | org.clojure 20 | data.fressian 21 | 1.1.0 22 | 23 | 24 | Other versions: 25 | 26 | * [All Released Versions](https://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.clojure%22%20AND%20a%3A%22data.fressian%22) 27 | * [Development Snapshots](https://oss.sonatype.org/index.html#nexus-search;gav~org.clojure~data.fressian~~~) 28 | * [Development Snapshot Repositories](https://dev.clojure.org/display/doc/Maven+Settings+and+Repositories) 29 | 30 | # Usage 31 | 32 | [API Documentation](https://clojure.github.io/data.fressian/) 33 | 34 | Basic examples: 35 | 36 | ```clojure 37 | (require '[clojure.data.fressian :as fress]) 38 | 39 | ;; read / write objects 40 | (fress/write x) 41 | (fress/read) 42 | 43 | ;; create reader/write on input/output streams 44 | (fress/create-reader is) 45 | (fress/create-writer os) 46 | ``` 47 | 48 | It is also possible to create custom tags and handlers. For more information see [Creating custom handlers](https://github.com/clojure/data.fressian/wiki/Creating-custom-handlers) for details. 49 | 50 | # Developer Information 51 | 52 | * [GitHub project](https://github.com/clojure/data.fressian) 53 | * [Bug Tracker](https://clojure.atlassian.net/browse/DFRS) 54 | * [Continuous Integration](https://github.com/clojure/data.fressian/actions/workflows/test.yml) 55 | 56 | 57 | # Copyright and License 58 | 59 | Copyright (c) Rich Hickey, Nu North America, Inc. All rights reserved. The use and 60 | distribution terms for this software are covered by the Eclipse Public 61 | License 1.0 (https://opensource.org/license/epl-1-0/) witch can 62 | be found in the file epl-v10.html at the root of this distribution. 63 | By using this software in any fashion, you are agreeing to be bound by 64 | the terms of this license. You must not remove this notice, or any 65 | other, from this software. 66 | -------------------------------------------------------------------------------- /bin/run_generative_tests.clj: -------------------------------------------------------------------------------- 1 | (set! *warn-on-reflection* true) 2 | (when-not (System/getProperty "clojure.test.generative.msec") 3 | (System/setProperty "clojure.test.generative.msec" "30000")) 4 | (require '[clojure.test.generative.runner :as runner]) 5 | (runner/-main "src/test") 6 | -------------------------------------------------------------------------------- /epl-v10.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Eclipse Public License - Version 1.0 8 | 25 | 26 | 27 | 28 | 29 | 30 |

Eclipse Public License - v 1.0

31 | 32 |

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE 33 | PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR 34 | DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS 35 | AGREEMENT.

36 | 37 |

1. DEFINITIONS

38 | 39 |

"Contribution" means:

40 | 41 |

a) in the case of the initial Contributor, the initial 42 | code and documentation distributed under this Agreement, and

43 |

b) in the case of each subsequent Contributor:

44 |

i) changes to the Program, and

45 |

ii) additions to the Program;

46 |

where such changes and/or additions to the Program 47 | originate from and are distributed by that particular Contributor. A 48 | Contribution 'originates' from a Contributor if it was added to the 49 | Program by such Contributor itself or anyone acting on such 50 | Contributor's behalf. Contributions do not include additions to the 51 | Program which: (i) are separate modules of software distributed in 52 | conjunction with the Program under their own license agreement, and (ii) 53 | are not derivative works of the Program.

54 | 55 |

"Contributor" means any person or entity that distributes 56 | the Program.

57 | 58 |

"Licensed Patents" mean patent claims licensable by a 59 | Contributor which are necessarily infringed by the use or sale of its 60 | Contribution alone or when combined with the Program.

61 | 62 |

"Program" means the Contributions distributed in accordance 63 | with this Agreement.

64 | 65 |

"Recipient" means anyone who receives the Program under 66 | this Agreement, including all Contributors.

67 | 68 |

2. GRANT OF RIGHTS

69 | 70 |

a) Subject to the terms of this Agreement, each 71 | Contributor hereby grants Recipient a non-exclusive, worldwide, 72 | royalty-free copyright license to reproduce, prepare derivative works 73 | of, publicly display, publicly perform, distribute and sublicense the 74 | Contribution of such Contributor, if any, and such derivative works, in 75 | source code and object code form.

76 | 77 |

b) Subject to the terms of this Agreement, each 78 | Contributor hereby grants Recipient a non-exclusive, worldwide, 79 | royalty-free patent license under Licensed Patents to make, use, sell, 80 | offer to sell, import and otherwise transfer the Contribution of such 81 | Contributor, if any, in source code and object code form. This patent 82 | license shall apply to the combination of the Contribution and the 83 | Program if, at the time the Contribution is added by the Contributor, 84 | such addition of the Contribution causes such combination to be covered 85 | by the Licensed Patents. The patent license shall not apply to any other 86 | combinations which include the Contribution. No hardware per se is 87 | licensed hereunder.

88 | 89 |

c) Recipient understands that although each Contributor 90 | grants the licenses to its Contributions set forth herein, no assurances 91 | are provided by any Contributor that the Program does not infringe the 92 | patent or other intellectual property rights of any other entity. Each 93 | Contributor disclaims any liability to Recipient for claims brought by 94 | any other entity based on infringement of intellectual property rights 95 | or otherwise. As a condition to exercising the rights and licenses 96 | granted hereunder, each Recipient hereby assumes sole responsibility to 97 | secure any other intellectual property rights needed, if any. For 98 | example, if a third party patent license is required to allow Recipient 99 | to distribute the Program, it is Recipient's responsibility to acquire 100 | that license before distributing the Program.

101 | 102 |

d) Each Contributor represents that to its knowledge it 103 | has sufficient copyright rights in its Contribution, if any, to grant 104 | the copyright license set forth in this Agreement.

105 | 106 |

3. REQUIREMENTS

107 | 108 |

A Contributor may choose to distribute the Program in object code 109 | form under its own license agreement, provided that:

110 | 111 |

a) it complies with the terms and conditions of this 112 | Agreement; and

113 | 114 |

b) its license agreement:

115 | 116 |

i) effectively disclaims on behalf of all Contributors 117 | all warranties and conditions, express and implied, including warranties 118 | or conditions of title and non-infringement, and implied warranties or 119 | conditions of merchantability and fitness for a particular purpose;

120 | 121 |

ii) effectively excludes on behalf of all Contributors 122 | all liability for damages, including direct, indirect, special, 123 | incidental and consequential damages, such as lost profits;

124 | 125 |

iii) states that any provisions which differ from this 126 | Agreement are offered by that Contributor alone and not by any other 127 | party; and

128 | 129 |

iv) states that source code for the Program is available 130 | from such Contributor, and informs licensees how to obtain it in a 131 | reasonable manner on or through a medium customarily used for software 132 | exchange.

133 | 134 |

When the Program is made available in source code form:

135 | 136 |

a) it must be made available under this Agreement; and

137 | 138 |

b) a copy of this Agreement must be included with each 139 | copy of the Program.

140 | 141 |

Contributors may not remove or alter any copyright notices contained 142 | within the Program.

143 | 144 |

Each Contributor must identify itself as the originator of its 145 | Contribution, if any, in a manner that reasonably allows subsequent 146 | Recipients to identify the originator of the Contribution.

147 | 148 |

4. COMMERCIAL DISTRIBUTION

149 | 150 |

Commercial distributors of software may accept certain 151 | responsibilities with respect to end users, business partners and the 152 | like. While this license is intended to facilitate the commercial use of 153 | the Program, the Contributor who includes the Program in a commercial 154 | product offering should do so in a manner which does not create 155 | potential liability for other Contributors. Therefore, if a Contributor 156 | includes the Program in a commercial product offering, such Contributor 157 | ("Commercial Contributor") hereby agrees to defend and 158 | indemnify every other Contributor ("Indemnified Contributor") 159 | against any losses, damages and costs (collectively "Losses") 160 | arising from claims, lawsuits and other legal actions brought by a third 161 | party against the Indemnified Contributor to the extent caused by the 162 | acts or omissions of such Commercial Contributor in connection with its 163 | distribution of the Program in a commercial product offering. The 164 | obligations in this section do not apply to any claims or Losses 165 | relating to any actual or alleged intellectual property infringement. In 166 | order to qualify, an Indemnified Contributor must: a) promptly notify 167 | the Commercial Contributor in writing of such claim, and b) allow the 168 | Commercial Contributor to control, and cooperate with the Commercial 169 | Contributor in, the defense and any related settlement negotiations. The 170 | Indemnified Contributor may participate in any such claim at its own 171 | expense.

172 | 173 |

For example, a Contributor might include the Program in a commercial 174 | product offering, Product X. That Contributor is then a Commercial 175 | Contributor. If that Commercial Contributor then makes performance 176 | claims, or offers warranties related to Product X, those performance 177 | claims and warranties are such Commercial Contributor's responsibility 178 | alone. Under this section, the Commercial Contributor would have to 179 | defend claims against the other Contributors related to those 180 | performance claims and warranties, and if a court requires any other 181 | Contributor to pay any damages as a result, the Commercial Contributor 182 | must pay those damages.

183 | 184 |

5. NO WARRANTY

185 | 186 |

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS 187 | PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 188 | OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, 189 | ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY 190 | OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely 191 | responsible for determining the appropriateness of using and 192 | distributing the Program and assumes all risks associated with its 193 | exercise of rights under this Agreement , including but not limited to 194 | the risks and costs of program errors, compliance with applicable laws, 195 | damage to or loss of data, programs or equipment, and unavailability or 196 | interruption of operations.

197 | 198 |

6. DISCLAIMER OF LIABILITY

199 | 200 |

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT 201 | NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, 202 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING 203 | WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF 204 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 205 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR 206 | DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED 207 | HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

208 | 209 |

7. GENERAL

210 | 211 |

If any provision of this Agreement is invalid or unenforceable under 212 | applicable law, it shall not affect the validity or enforceability of 213 | the remainder of the terms of this Agreement, and without further action 214 | by the parties hereto, such provision shall be reformed to the minimum 215 | extent necessary to make such provision valid and enforceable.

216 | 217 |

If Recipient institutes patent litigation against any entity 218 | (including a cross-claim or counterclaim in a lawsuit) alleging that the 219 | Program itself (excluding combinations of the Program with other 220 | software or hardware) infringes such Recipient's patent(s), then such 221 | Recipient's rights granted under Section 2(b) shall terminate as of the 222 | date such litigation is filed.

223 | 224 |

All Recipient's rights under this Agreement shall terminate if it 225 | fails to comply with any of the material terms or conditions of this 226 | Agreement and does not cure such failure in a reasonable period of time 227 | after becoming aware of such noncompliance. If all Recipient's rights 228 | under this Agreement terminate, Recipient agrees to cease use and 229 | distribution of the Program as soon as reasonably practicable. However, 230 | Recipient's obligations under this Agreement and any licenses granted by 231 | Recipient relating to the Program shall continue and survive.

232 | 233 |

Everyone is permitted to copy and distribute copies of this 234 | Agreement, but in order to avoid inconsistency the Agreement is 235 | copyrighted and may only be modified in the following manner. The 236 | Agreement Steward reserves the right to publish new versions (including 237 | revisions) of this Agreement from time to time. No one other than the 238 | Agreement Steward has the right to modify this Agreement. The Eclipse 239 | Foundation is the initial Agreement Steward. The Eclipse Foundation may 240 | assign the responsibility to serve as the Agreement Steward to a 241 | suitable separate entity. Each new version of the Agreement will be 242 | given a distinguishing version number. The Program (including 243 | Contributions) may always be distributed subject to the version of the 244 | Agreement under which it was received. In addition, after a new version 245 | of the Agreement is published, Contributor may elect to distribute the 246 | Program (including its Contributions) under the new version. Except as 247 | expressly stated in Sections 2(a) and 2(b) above, Recipient receives no 248 | rights or licenses to the intellectual property of any Contributor under 249 | this Agreement, whether expressly, by implication, estoppel or 250 | otherwise. All rights in the Program not expressly granted under this 251 | Agreement are reserved.

252 | 253 |

This Agreement is governed by the laws of the State of New York and 254 | the intellectual property laws of the United States of America. No party 255 | to this Agreement will bring a legal action under this Agreement more 256 | than one year after the cause of action arose. Each party waives its 257 | rights to a jury trial in any resulting litigation.

258 | 259 | 260 | 261 | 262 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | data.fressian 5 | 1.1.1-SNAPSHOT 6 | data.fressian 7 | Read/write Fressian from Clojure 8 | https://github.com/clojure/data.fressian 9 | 10 | 11 | 12 | Stuart Halloway 13 | stu@cognitect.com 14 | http://cognitect.com/ 15 | -5 16 | 17 | 18 | 19 | 20 | org.clojure 21 | pom.contrib 22 | 1.3.0 23 | 24 | 25 | 26 | scm:git:git@github.com:clojure/data.fressian 27 | scm:git:git@github.com:clojure/data.fressian 28 | git@github.com:clojure/data.fressian.git 29 | HEAD 30 | 31 | 32 | 33 | 34 | org.clojure 35 | clojure 36 | 1.9.0 37 | 38 | 39 | org.fressian 40 | fressian 41 | 0.6.8 42 | 43 | 44 | org.clojure 45 | test.generative 46 | 1.1.0 47 | test 48 | 49 | 50 | 51 | 52 | 53 | ${basedir}/src 54 | 55 | 56 | com.theoryinpractise 57 | clojure-maven-plugin 58 | 1.7.1 59 | 60 | 61 | src/main/clojure 62 | 63 | 64 | src/test/clojure 65 | 66 | bin/run_generative_tests.clj 67 | 68 | !.* 69 | 70 | true 71 | 72 | 73 | 74 | test-clojure 75 | test 76 | 77 | test 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /project.clj: -------------------------------------------------------------------------------- 1 | (defproject org.clojure/data.fressian "0.2.1-SNAPSHOT" 2 | :description "Read/write Fressian from Clojure." 3 | :url "https://github.com/clojure/data.fressian" 4 | :license {:name "Eclipse Public License - v 1.0" 5 | :url "http://www.eclipse.org/legal/epl-v10.html"} 6 | :dependencies [[org.clojure/clojure "1.9.0"] 7 | [org.fressian/fressian "0.6.8"] 8 | [org.clojure/test.generative "1.1.0" :scope "test"]] 9 | :jvm-opts ["-Xmx2g" "-server"]) 10 | -------------------------------------------------------------------------------- /src/main/clojure/clojure/data/fressian.clj: -------------------------------------------------------------------------------- 1 | ;; Copyright (c) Rich Hickey, Cognitect, Inc. All rights reserved. The use 2 | ;; and distribution terms for this software are covered by the Eclipse 3 | ;; Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) 4 | ;; which can be found in the file epl-v10.html at the root of this 5 | ;; distribution. By using this software in any fashion, you are 6 | ;; agreeing to be bound by the terms of this license. You must not 7 | ;; remove this notice, or any other, from this software. 8 | 9 | (ns ^{:author "Stuart Halloway" 10 | :doc "Read/write fressian data. See http://www.edn-format.org/"} 11 | clojure.data.fressian 12 | (:refer-clojure :exclude (read)) 13 | (:require 14 | [clojure.java.io :as io] 15 | [clojure.string :as str]) 16 | (:import 17 | [clojure.lang IRecord Ratio] 18 | [java.io InputStream OutputStream] 19 | [java.nio ByteBuffer] 20 | [org.fressian FressianWriter StreamingWriter FressianReader TaggedObject Writer Reader] 21 | [org.fressian.handlers WriteHandler ReadHandler ILookup WriteHandlerLookup] 22 | [org.fressian.impl ByteBufferInputStream BytesOutputStream InheritanceLookup])) 23 | 24 | (set! *warn-on-reflection* true) 25 | 26 | (defn- write-named [tag ^Writer w s] 27 | (.writeTag w tag 2) 28 | (.writeObject w (namespace s) true) 29 | (.writeObject w (name s) true)) 30 | 31 | 32 | (defn- ^ByteBuffer bytestream->buf 33 | "Return a readable buf over the current internal state of a 34 | BytesOutputStream." 35 | [^BytesOutputStream stream] 36 | (ByteBuffer/wrap (.internalBuffer stream) 0 (.length stream))) 37 | 38 | (defprotocol FressianReadable 39 | (to-input-stream [obj] "Implementation detail.")) 40 | 41 | (extend-protocol FressianReadable 42 | Object 43 | (to-input-stream 44 | [obj] 45 | (io/input-stream obj)) 46 | 47 | ByteBuffer 48 | (to-input-stream 49 | [bb] 50 | (io/input-stream (ByteBufferInputStream. bb)))) 51 | 52 | (defn associative-lookup 53 | "Build an ILookup from an associative collection." 54 | [o] 55 | (reify ILookup 56 | (valAt [_ k] (get o k)))) 57 | 58 | (defn inheritance-lookup 59 | "Returns an inheritance aware lookup based on lookup that will match 60 | subclasses as well as exact matches. Will walk inheritance hierarchy 61 | once per new type encountered to find the best match, then cache 62 | results." 63 | [lookup] 64 | (InheritanceLookup. lookup)) 65 | 66 | (defn- class-sym 67 | "Returns the class name of inst as a symbol." 68 | [^Object inst] 69 | (-> inst (.getClass) (.getName) symbol)) 70 | 71 | (def clojure-write-handlers 72 | "Standard set of write handlers for Clojure data." 73 | {Character 74 | {"char" 75 | (reify WriteHandler 76 | (write [_ w ch] 77 | (.writeTag w "char" 1) 78 | (.writeInt w (int ch))))} 79 | Ratio 80 | {"ratio" 81 | (reify WriteHandler 82 | (write [_ w n] 83 | (.writeTag w "ratio" 2) 84 | (.writeObject w (.numerator ^Ratio n)) 85 | (.writeObject w (.denominator ^Ratio n))))} 86 | 87 | IRecord 88 | {"clojure/record" 89 | (reify WriteHandler 90 | (write [_ w rec] 91 | (.writeTag w "record" 2) 92 | (.writeObject w (class-sym rec) true) 93 | (.writeTag w "map" 1) 94 | (.beginClosedList ^StreamingWriter w) 95 | (reduce-kv 96 | (fn [^Writer w k v] 97 | (.writeObject w k true) 98 | (.writeObject w v)) 99 | w 100 | rec) 101 | (.endList ^StreamingWriter w)))} 102 | 103 | clojure.lang.Keyword 104 | {"key" 105 | (reify WriteHandler 106 | (write [_ w s] 107 | (write-named "key" w s)))} 108 | 109 | clojure.lang.BigInt 110 | {"bigint" 111 | (reify WriteHandler 112 | (write [this w d] 113 | (let [^BigInteger bi (if (instance? clojure.lang.BigInt d) 114 | (.toBigInteger ^clojure.lang.BigInt d) 115 | d)] 116 | (.writeTag w "bigint" 1) 117 | (.writeBytes w (.toByteArray bi)))))} 118 | 119 | clojure.lang.Symbol 120 | {"sym" 121 | (reify WriteHandler 122 | (write [_ w s] 123 | (write-named "sym" w s)))}}) 124 | 125 | (defn field-caching-writer 126 | "Returns a record writer that caches values for keys 127 | matching cache-pred, which is typically specified 128 | as a set, e.g. (field-caching-writer #{:color})" 129 | [cache-pred] 130 | (reify WriteHandler 131 | (write [_ w rec] 132 | (.writeTag w "record" 2) 133 | (.writeObject w (class-sym rec) true) 134 | (.writeTag w "map" 1) 135 | (.beginClosedList ^StreamingWriter w) 136 | (reduce-kv 137 | (fn [^Writer w k v] 138 | (.writeObject w k true) 139 | (.writeObject w v (boolean (cache-pred k)))) 140 | w 141 | rec) 142 | (.endList ^StreamingWriter w)))) 143 | 144 | (defn- record-map-constructor-name 145 | "Return the map constructor for a record" 146 | [rname] 147 | (let [comps (str/split (str rname) #"\.")] 148 | (symbol (->> (butlast comps) (map #(str/replace % "_" "-")) 149 | (str/join ".")) 150 | (str "map->" (last comps))))) 151 | 152 | (def clojure-read-handlers 153 | "Standard set of read handlers for Clojure data." 154 | {"bigint" 155 | (reify ReadHandler 156 | (read [_ rdr tag component-count] 157 | (let [^bytes bibytes (.readObject rdr)] 158 | (bigint (BigInteger. bibytes))))) 159 | 160 | "byte" 161 | (reify ReadHandler (read [_ rdr tag component-count] 162 | (byte (.readObject rdr)))) 163 | 164 | "record" 165 | (reify ReadHandler (read [_ rdr tag component-count] 166 | (let [rname (.readObject rdr) 167 | rmap (.readObject rdr)] 168 | (if-let [rcons (resolve (record-map-constructor-name rname))] 169 | (rcons rmap) 170 | (TaggedObject. "record" (into-array Object [rname rmap])))))) 171 | 172 | "char" 173 | (reify ReadHandler (read [_ rdr tag component-count] 174 | (char (.readObject rdr)))) 175 | 176 | "ratio" 177 | (reify ReadHandler (read [_ rdr tag component-count] 178 | (Ratio. (biginteger (.readObject rdr)) 179 | (biginteger (.readObject rdr))))) 180 | "key" 181 | (reify ReadHandler (read [_ rdr tag component-count] 182 | (keyword (.readObject rdr) (.readObject rdr)))) 183 | "sym" 184 | (reify ReadHandler (read [_ rdr tag component-count] 185 | (symbol (.readObject rdr) (.readObject rdr)))) 186 | "map" 187 | (reify ReadHandler (read [_ rdr tag component-count] 188 | (let [kvs ^java.util.List (.readObject rdr)] 189 | (if (< (.size kvs) 16) 190 | (clojure.lang.PersistentArrayMap. (.toArray kvs)) 191 | (clojure.lang.PersistentHashMap/create (seq kvs))))))}) 192 | 193 | (defn ^Writer create-writer 194 | "Create a fressian writer targeting out. Handlers must be 195 | a nested map of type => tag => WriteHandler wrapped with 196 | associative-lookup and inheritance-lookup. See 197 | clojure-write-handlers for an example." 198 | [^OutputStream out & {:keys [handlers]}] 199 | (FressianWriter. out (or handlers (-> clojure-write-handlers associative-lookup inheritance-lookup)))) 200 | 201 | (defn ^Reader create-reader 202 | "Create a fressian reader targeting in, which must be compatible 203 | with clojure.java.io/input-stream. Handlers must be a map of 204 | tag => ReadHandler wrapped in associative-lookup. See 205 | clojure-read-handlers for an example." 206 | [^InputStream in & {:keys [handlers checksum?]}] 207 | (FressianReader. in 208 | (or handlers (associative-lookup clojure-read-handlers)) 209 | (boolean checksum?))) 210 | 211 | (defn read-object 212 | "Read a single object from a fressian reader." 213 | [^Reader rdr] 214 | (.readObject rdr)) 215 | 216 | (defn write-object 217 | "Write a single object to a fressian reader. Returns the reader." 218 | [^Writer writer obj] 219 | (.writeObject writer obj)) 220 | 221 | (defn read 222 | "Convenience method for reading a single fressian object. 223 | Takes same options as create-reader. Readable can be 224 | any type supported by clojure.java.io/input-stream, or 225 | a ByteBuffer." 226 | [readable & options] 227 | (.readObject ^Reader (apply create-reader (to-input-stream readable) options))) 228 | 229 | (defn ^ByteBuffer write 230 | "Convenience method for writing a single object. Returns a 231 | byte buffer. Options are the same as for create-reader, 232 | with one additional option. If footer? is specified, will 233 | write a fressian footer after writing the object." 234 | ([obj & options] 235 | (let [{:keys [footer?]} (when options (apply hash-map options)) 236 | bos (BytesOutputStream.) 237 | writer ^Writer (apply create-writer bos options)] 238 | (.writeObject writer obj) 239 | (when footer? 240 | (.writeFooter writer)) 241 | (bytestream->buf bos)))) 242 | 243 | (defn tagged-object? 244 | "Returns true if o is a tagged object, which will occur when 245 | the reader does not recognized a specific type. Use tag 246 | and tagged-value to access the contents of a tagged-object." 247 | [o] 248 | (instance? TaggedObject o)) 249 | 250 | (defn tag 251 | "Returns the tag if object is a tagged-object, else nil." 252 | [^TaggedObject obj] 253 | (when (tagged-object? obj) 254 | (.getTag obj))) 255 | 256 | (defn tagged-value 257 | "Returns the value (an Object arrray) wrapped by obj, or nil 258 | if obj is not a tagged object." 259 | [^TaggedObject obj] 260 | (when (tagged-object? obj) 261 | (.getValue obj))) 262 | 263 | (defn ^Writer write-footer 264 | [^Writer writer] 265 | (.writeFooter writer)) 266 | 267 | (defn ^Writer begin-closed-list 268 | "Begin writing a fressianed list. To end the list, call end-list. 269 | Used to write sequential data whose size is not known in advance." 270 | [^StreamingWriter writer] 271 | (.beginClosedList writer)) 272 | 273 | (defn ^Writer end-list 274 | "Ends a list begun with begin-closed-list." 275 | [^StreamingWriter writer] 276 | (.endList writer)) 277 | 278 | (defn ^Writer begin-open-list 279 | "Advanced. Writes fressian code to begin an open list. An 280 | open list can be terminated either by a call to end-list, 281 | or by simply closing the stream. Used to write sequential 282 | data whose size is not known in advance, in contexts where 283 | stream failure can safely be interpreted as end of list." 284 | [^StreamingWriter writer] 285 | (.beginOpenList writer)) 286 | 287 | 288 | -------------------------------------------------------------------------------- /src/test/clojure/clojure/data/fressian_test.clj: -------------------------------------------------------------------------------- 1 | ;; Copyright (c) Rich Hickey, Cognitect, Inc. All rights reserved. The use 2 | ;; and distribution terms for this software are covered by the Eclipse 3 | ;; Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) 4 | ;; which can be found in the file epl-v10.html at the root of this 5 | ;; distribution. By using this software in any fashion, you are 6 | ;; agreeing to be bound by the terms of this license. You must not 7 | ;; remove this notice, or any other, from this software. 8 | 9 | (ns clojure.data.fressian-test 10 | (:import clojure.lang.Ratio) 11 | (:require 12 | [clojure.data.fressian :as fress] 13 | [clojure.data.generators :as gen] 14 | [clojure.test.generative :refer (defspec)])) 15 | 16 | (defn roundtrip 17 | [x] 18 | (-> x fress/write fress/read)) 19 | 20 | (def clojure-fressianable 21 | gen/anything) 22 | 23 | (defn gen-ratio 24 | [] 25 | (Ratio. (gen/bigdec) (gen/bigdec))) 26 | 27 | (def keyword-pool 28 | "Pool keywords so generation does not exhaust permgen" 29 | (delay 30 | (binding [gen/*rnd* (java.util.Random. 42)] 31 | (into [] (repeatedly 1000 gen/keyword))))) 32 | 33 | (defn keyword-from-pool 34 | [] 35 | (gen/rand-nth @keyword-pool)) 36 | 37 | (def symbol-pool 38 | "Pool symbols so generation does not exhaust permgen" 39 | (delay 40 | (binding [gen/*rnd* (java.util.Random. 42)] 41 | (into [] (repeatedly 1000 gen/symbol))))) 42 | 43 | (defn symbol-from-pool 44 | [] 45 | (gen/rand-nth @keyword-pool)) 46 | 47 | (defrecord ExampleRecord [^long f1 ^char f2 f3]) 48 | 49 | (defn gen-example-record 50 | [] 51 | (ExampleRecord. (gen/long) (gen/char) (keyword-from-pool))) 52 | 53 | (defn data-with-handler 54 | "Generate data that has data.fressian specific handler" 55 | [] 56 | (gen/one-of gen/char 57 | gen/ratio 58 | gen/bigint 59 | gen-example-record 60 | symbol-from-pool 61 | keyword-from-pool)) 62 | 63 | (defspec test-roundtrip-anything 64 | roundtrip 65 | [^{:tag `clojure-fressianable} o] 66 | (when-not (= o %) 67 | (throw (ex-info "object != readback" {:object o :readback %}))) 68 | (when-not (= % o) 69 | (throw (ex-info "readback != object" {:object o :readback %}))) 70 | ;; metadata not supported yet 71 | #_(when-not (= (meta o) (meta %)) 72 | (throw (ex-info "(meta obj) != (meta readback)" {:object o :readback %})))) 73 | 74 | (defspec test-roundtrip-handlers 75 | roundtrip 76 | [^{:tag `data-with-handler} o]) 77 | 78 | 79 | --------------------------------------------------------------------------------