├── .gitignore ├── LICENSE.txt ├── Makefile ├── README.md ├── clojure ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── doc │ └── intro.md ├── project.clj ├── src │ ├── determinism │ │ ├── core.clj │ │ ├── dao.clj │ │ ├── help.clj │ │ ├── proxy.clj │ │ ├── replay.clj │ │ ├── scoper.clj │ │ └── stub.clj │ └── logback.xml └── test │ └── determinism │ └── core_test.clj └── sql └── schema.sql /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | *.db 3 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Eclipse Public License - v 2.0 2 | 3 | THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE 4 | PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION 5 | OF THE PROGRAM 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 content 12 | Distributed under this Agreement, and 13 | 14 | b) in the case of each subsequent Contributor: 15 | i) changes to the Program, and 16 | ii) additions to the Program; 17 | where such changes and/or additions to the Program originate from 18 | and are Distributed by that particular Contributor. A Contribution 19 | "originates" from a Contributor if it was added to the Program by 20 | such Contributor itself or anyone acting on such Contributor's behalf. 21 | Contributions do not include changes or additions to the Program that 22 | are not Modified Works. 23 | 24 | "Contributor" means any person or entity that Distributes the Program. 25 | 26 | "Licensed Patents" mean patent claims licensable by a Contributor which 27 | are necessarily infringed by the use or sale of its Contribution alone 28 | or when combined with the Program. 29 | 30 | "Program" means the Contributions Distributed in accordance with this 31 | Agreement. 32 | 33 | "Recipient" means anyone who receives the Program under this Agreement 34 | or any Secondary License (as applicable), including Contributors. 35 | 36 | "Derivative Works" shall mean any work, whether in Source Code or other 37 | form, that is based on (or derived from) the Program and for which the 38 | editorial revisions, annotations, elaborations, or other modifications 39 | represent, as a whole, an original work of authorship. 40 | 41 | "Modified Works" shall mean any work in Source Code or other form that 42 | results from an addition to, deletion from, or modification of the 43 | contents of the Program, including, for purposes of clarity any new file 44 | in Source Code form that contains any contents of the Program. Modified 45 | Works shall not include works that contain only declarations, 46 | interfaces, types, classes, structures, or files of the Program solely 47 | in each case in order to link to, bind by name, or subclass the Program 48 | or Modified Works thereof. 49 | 50 | "Distribute" means the acts of a) distributing or b) making available 51 | in any manner that enables the transfer of a copy. 52 | 53 | "Source Code" means the form of a Program preferred for making 54 | modifications, including but not limited to software source code, 55 | documentation source, and configuration files. 56 | 57 | "Secondary License" means either the GNU General Public License, 58 | Version 2.0, or any later versions of that license, including any 59 | exceptions or additional permissions as identified by the initial 60 | Contributor. 61 | 62 | 2. GRANT OF RIGHTS 63 | 64 | a) Subject to the terms of this Agreement, each Contributor hereby 65 | grants Recipient a non-exclusive, worldwide, royalty-free copyright 66 | license to reproduce, prepare Derivative Works of, publicly display, 67 | publicly perform, Distribute and sublicense the Contribution of such 68 | Contributor, if any, and such Derivative Works. 69 | 70 | b) Subject to the terms of this Agreement, each Contributor hereby 71 | grants Recipient a non-exclusive, worldwide, royalty-free patent 72 | license under Licensed Patents to make, use, sell, offer to sell, 73 | import and otherwise transfer the Contribution of such Contributor, 74 | if any, in Source Code or other form. This patent license shall 75 | apply to the combination of the Contribution and the Program if, at 76 | the time the Contribution is added by the Contributor, such addition 77 | of the Contribution causes such combination to be covered by the 78 | Licensed Patents. The patent license shall not apply to any other 79 | combinations which include the Contribution. No hardware per se is 80 | licensed hereunder. 81 | 82 | c) Recipient understands that although each Contributor grants the 83 | licenses to its Contributions set forth herein, no assurances are 84 | provided by any Contributor that the Program does not infringe the 85 | patent or other intellectual property rights of any other entity. 86 | Each Contributor disclaims any liability to Recipient for claims 87 | brought by any other entity based on infringement of intellectual 88 | property rights or otherwise. As a condition to exercising the 89 | rights and licenses granted hereunder, each Recipient hereby 90 | assumes sole responsibility to secure any other intellectual 91 | property rights needed, if any. For example, if a third party 92 | patent license is required to allow Recipient to Distribute the 93 | Program, it is Recipient's responsibility to acquire that license 94 | before distributing the Program. 95 | 96 | d) Each Contributor represents that to its knowledge it has 97 | sufficient copyright rights in its Contribution, if any, to grant 98 | the copyright license set forth in this Agreement. 99 | 100 | e) Notwithstanding the terms of any Secondary License, no 101 | Contributor makes additional grants to any Recipient (other than 102 | those set forth in this Agreement) as a result of such Recipient's 103 | receipt of the Program under the terms of a Secondary License 104 | (if permitted under the terms of Section 3). 105 | 106 | 3. REQUIREMENTS 107 | 108 | 3.1 If a Contributor Distributes the Program in any form, then: 109 | 110 | a) the Program must also be made available as Source Code, in 111 | accordance with section 3.2, and the Contributor must accompany 112 | the Program with a statement that the Source Code for the Program 113 | is available under this Agreement, and informs Recipients how to 114 | obtain it in a reasonable manner on or through a medium customarily 115 | used for software exchange; and 116 | 117 | b) the Contributor may Distribute the Program under a license 118 | different than this Agreement, provided that such license: 119 | i) effectively disclaims on behalf of all other Contributors all 120 | warranties and conditions, express and implied, including 121 | warranties or conditions of title and non-infringement, and 122 | implied warranties or conditions of merchantability and fitness 123 | for a particular purpose; 124 | 125 | ii) effectively excludes on behalf of all other Contributors all 126 | liability for damages, including direct, indirect, special, 127 | incidental and consequential damages, such as lost profits; 128 | 129 | iii) does not attempt to limit or alter the recipients' rights 130 | in the Source Code under section 3.2; and 131 | 132 | iv) requires any subsequent distribution of the Program by any 133 | party to be under a license that satisfies the requirements 134 | of this section 3. 135 | 136 | 3.2 When the Program is Distributed as Source Code: 137 | 138 | a) it must be made available under this Agreement, or if the 139 | Program (i) is combined with other material in a separate file or 140 | files made available under a Secondary License, and (ii) the initial 141 | Contributor attached to the Source Code the notice described in 142 | Exhibit A of this Agreement, then the Program may be made available 143 | under the terms of such Secondary Licenses, and 144 | 145 | b) a copy of this Agreement must be included with each copy of 146 | the Program. 147 | 148 | 3.3 Contributors may not remove or alter any copyright, patent, 149 | trademark, attribution notices, disclaimers of warranty, or limitations 150 | of liability ("notices") contained within the Program from any copy of 151 | the Program which they Distribute, provided that Contributors may add 152 | their own appropriate notices. 153 | 154 | 4. COMMERCIAL DISTRIBUTION 155 | 156 | Commercial distributors of software may accept certain responsibilities 157 | with respect to end users, business partners and the like. While this 158 | license is intended to facilitate the commercial use of the Program, 159 | the Contributor who includes the Program in a commercial product 160 | offering should do so in a manner which does not create potential 161 | liability for other Contributors. Therefore, if a Contributor includes 162 | the Program in a commercial product offering, such Contributor 163 | ("Commercial Contributor") hereby agrees to defend and indemnify every 164 | other Contributor ("Indemnified Contributor") against any losses, 165 | damages and costs (collectively "Losses") arising from claims, lawsuits 166 | and other legal actions brought by a third party against the Indemnified 167 | Contributor to the extent caused by the acts or omissions of such 168 | Commercial Contributor in connection with its distribution of the Program 169 | in a commercial product offering. The obligations in this section do not 170 | apply to any claims or Losses relating to any actual or alleged 171 | intellectual property infringement. In order to qualify, an Indemnified 172 | Contributor must: a) promptly notify the Commercial Contributor in 173 | writing of such claim, and b) allow the Commercial Contributor to control, 174 | and cooperate with the Commercial Contributor in, the defense and any 175 | related settlement negotiations. The Indemnified Contributor may 176 | participate in any such claim at its own expense. 177 | 178 | For example, a Contributor might include the Program in a commercial 179 | product offering, Product X. That Contributor is then a Commercial 180 | Contributor. If that Commercial Contributor then makes performance 181 | claims, or offers warranties related to Product X, those performance 182 | claims and warranties are such Commercial Contributor's responsibility 183 | alone. Under this section, the Commercial Contributor would have to 184 | defend claims against the other Contributors related to those performance 185 | claims and warranties, and if a court requires any other Contributor to 186 | pay any damages as a result, the Commercial Contributor must pay 187 | those damages. 188 | 189 | 5. NO WARRANTY 190 | 191 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT 192 | PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" 193 | BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR 194 | IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF 195 | TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR 196 | PURPOSE. Each Recipient is solely responsible for determining the 197 | appropriateness of using and distributing the Program and assumes all 198 | risks associated with its exercise of rights under this Agreement, 199 | including but not limited to the risks and costs of program errors, 200 | compliance with applicable laws, damage to or loss of data, programs 201 | or equipment, and unavailability or interruption of operations. 202 | 203 | 6. DISCLAIMER OF LIABILITY 204 | 205 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT 206 | PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS 207 | SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 208 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST 209 | PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 210 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 211 | ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE 212 | EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE 213 | POSSIBILITY OF SUCH DAMAGES. 214 | 215 | 7. GENERAL 216 | 217 | If any provision of this Agreement is invalid or unenforceable under 218 | applicable law, it shall not affect the validity or enforceability of 219 | the remainder of the terms of this Agreement, and without further 220 | action by the parties hereto, such provision shall be reformed to the 221 | minimum extent necessary to make such provision valid and enforceable. 222 | 223 | If Recipient institutes patent litigation against any entity 224 | (including a cross-claim or counterclaim in a lawsuit) alleging that the 225 | Program itself (excluding combinations of the Program with other software 226 | or hardware) infringes such Recipient's patent(s), then such Recipient's 227 | rights granted under Section 2(b) shall terminate as of the date such 228 | litigation is filed. 229 | 230 | All Recipient's rights under this Agreement shall terminate if it 231 | fails to comply with any of the material terms or conditions of this 232 | Agreement and does not cure such failure in a reasonable period of 233 | time after becoming aware of such noncompliance. If all Recipient's 234 | rights under this Agreement terminate, Recipient agrees to cease use 235 | and distribution of the Program as soon as reasonably practicable. 236 | However, Recipient's obligations under this Agreement and any licenses 237 | granted by Recipient relating to the Program shall continue and survive. 238 | 239 | Everyone is permitted to copy and distribute copies of this Agreement, 240 | but in order to avoid inconsistency the Agreement is copyrighted and 241 | may only be modified in the following manner. The Agreement Steward 242 | reserves the right to publish new versions (including revisions) of 243 | this Agreement from time to time. No one other than the Agreement 244 | Steward has the right to modify this Agreement. The Eclipse Foundation 245 | is the initial Agreement Steward. The Eclipse Foundation may assign the 246 | responsibility to serve as the Agreement Steward to a suitable separate 247 | entity. Each new version of the Agreement will be given a distinguishing 248 | version number. The Program (including Contributions) may always be 249 | Distributed subject to the version of the Agreement under which it was 250 | received. In addition, after a new version of the Agreement is published, 251 | Contributor may elect to Distribute the Program (including its 252 | Contributions) under the new version. 253 | 254 | Except as expressly stated in Sections 2(a) and 2(b) above, Recipient 255 | receives no rights or licenses to the intellectual property of any 256 | Contributor under this Agreement, whether expressly, by implication, 257 | estoppel or otherwise. All rights in the Program not expressly granted 258 | under this Agreement are reserved. Nothing in this Agreement is intended 259 | to be enforceable by any entity that is not a Contributor or Recipient. 260 | No third-party beneficiary rights are created under this Agreement. 261 | 262 | Exhibit A - Form of Secondary Licenses Notice 263 | 264 | "This Source Code may also be made available under the following 265 | Secondary Licenses when the conditions for such availability set forth 266 | in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), 267 | version(s), and exceptions or additional permissions here}." 268 | 269 | Simply including a copy of this Agreement, including this Exhibit A 270 | is not sufficient to license the Source Code under Secondary Licenses. 271 | 272 | If it is not possible or desirable to put the notice in a particular 273 | file, then You may include the notice in a location (such as a LICENSE 274 | file in a relevant directory) where a recipient would be likely to 275 | look for such a notice. 276 | 277 | You may add additional accurate notices of copyright ownership. 278 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: determinism.db 2 | 3 | determinism.db: sql/schema.sql 4 | @cat $< | sqlite3 $@ 5 | 6 | clean: 7 | -rm -fr determinism.db 8 | 9 | query: 10 | echo -e ".headers on\n.mode column\n.width 40 10 34 10 24\nselect * from det where identity like '%javascript%' order by identity ;" | sqlite3 determinism.db 11 | 12 | .PHONY: clean query 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # determinism 2 | 3 | NOTE: This is ALPHA level software. It's available to garner interest 4 | and such, but please understand there is a lot more to do on this. 5 | 6 | [![Clojars Project](https://img.shields.io/clojars/v/ahungry/determinism.svg)](https://clojars.org/ahungry/determinism) 7 | [![cljdoc badge](https://cljdoc.org/badge/ahungry/determinism)](https://cljdoc.org/d/ahungry/determinism) 8 | 9 | > Determinism is the philosophical belief that all events are determined 10 | > completely by previously existing causes. 11 | 12 | This aims to be a development tool for programming, where a code base 13 | may be targetted for monitoring functions, and as each function is 14 | hit, it will record the data the function received (input) as well as 15 | the output the function generated. 16 | 17 | # Installation 18 | 19 | Just add into your project.clj or deps: 20 | 21 | [![Clojars Project](http://clojars.org/ahungry/determinism/latest-version.svg)](http://clojars.org/ahungry/determinism) 22 | 23 | Then when you want to use it, import it as: 24 | 25 | ```clojure 26 | (ns your-package 27 | (:require [determinism.help :as help] 28 | [determinism.dao :as dao] 29 | [determinism.proxy :as proxy] 30 | [determinism.replay :as replay])) 31 | ``` 32 | 33 | # Idea 34 | 35 | Given you had a codebase defined as such: 36 | 37 | ```clojure 38 | (ns determinism.stub) 39 | 40 | (defn javascript-like-plus 41 | "Given an X and Y, join strings or add them." 42 | [x y] 43 | (if (or (string? x) 44 | (string? y)) 45 | (str x y) 46 | (+ x y))) 47 | 48 | (defn main [] 49 | (javascript-like-plus 1 2) 50 | (javascript-like-plus 3 4) 51 | (javascript-like-plus "x" "y") 52 | (javascript-like-plus 2 "y") 53 | (javascript-like-plus "x" 3)) 54 | ``` 55 | 56 | and you wrapped it in this way: 57 | 58 | ```clojure 59 | (proxy/all-by-re #"determinism\.stub") 60 | (stub/main) 61 | (proxy/record-flush) 62 | ``` 63 | 64 | You will be able to review the results of code execution in a format 65 | such as: 66 | 67 | ```sh 68 | identity input input_types output output_type date 69 | ---------------------------------------- ---------- ---------------------------------- ---------- ------------------------ -------------------------- 70 | #'determinism.stub/javascript-like-plus [1 2] [java.lang.Long java.lang.Long] 3 class java.lang.Long 2019-09-01T00:48:03.820992 71 | #'determinism.stub/javascript-like-plus [3 4] [java.lang.Long java.lang.Long] 7 class java.lang.Long 2019-09-01T00:48:03.894416 72 | #'determinism.stub/javascript-like-plus ["x" "y"] [java.lang.String java.lang.String xy class java.lang.String 2019-09-01T00:48:03.903399 73 | #'determinism.stub/javascript-like-plus [2 "y"] [java.lang.Long java.lang.String] 2y class java.lang.String 2019-09-01T00:48:03.912170 74 | #'determinism.stub/javascript-like-plus ["x" 3] [java.lang.String java.lang.Long] x3 class java.lang.String 2019-09-01T00:48:03.921038 75 | ``` 76 | 77 | # Features 78 | 79 | ## Replayability 80 | 81 | In the codebase, you can "replay" previous results and ensure the 82 | I/O matches known I/O as such: 83 | 84 | ```clojure 85 | (require '[determinism.replay :as replay]) 86 | (replay/replay-all) 87 | 88 | ;; Evaluates to: 89 | {"#'determinism.stub/bar-map" {:pass 1}, 90 | "#'determinism.stub/foo-map" {:pass 1}, 91 | "#'determinism.stub/javascript-like-plus" {:pass 5}, 92 | "#'determinism.stub/main" {:pass 1}} 93 | ``` 94 | 95 | This should end up acting as a live-check equivalent to unit testing 96 | or spec based approaches (the more you instrument your code and send 97 | the results to the database at ~/.local/share/ahungry-determinism.db, 98 | the more the system can assist in regression-proofing and enabling a 99 | faster development workflow). 100 | 101 | ## Inspection 102 | 103 | You can use the help module to pull in more information the system has 104 | recorded or knows about your data: 105 | 106 | ```clojure 107 | (require '[determinism.help :as help]) 108 | (help/get-types #'determinism.stub/javascript-like-plus) 109 | 110 | ;; Will evaluate to (all the known input combinations of types): 111 | ([java.lang.Long java.lang.Long] 112 | [java.lang.Long java.lang.String] 113 | [java.lang.String java.lang.Long] 114 | [java.lang.String java.lang.String]) 115 | ``` 116 | 117 | You can also pull in a wide set of type information based on a regex 118 | query for matching functions: 119 | 120 | ```clojure 121 | (help/get-types-apropos "determinism.stub") 122 | 123 | ;; Evals to: 124 | ({:identity "#'determinism.stub/javascript-like-plus", 125 | :types ([java.lang.Long java.lang.Long] 126 | [java.lang.Long java.lang.String] 127 | [java.lang.String java.lang.Long] 128 | [java.lang.String java.lang.String])} 129 | {:identity "#'determinism.stub/foo-map", 130 | :types ([clojure.lang.PersistentArrayMap])} 131 | {:identity "#'determinism.stub/bar-map", 132 | :types ([clojure.lang.PersistentArrayMap])} 133 | {:identity "#'determinism.stub/main", :types ([])}) 134 | ``` 135 | 136 | # License 137 | 138 | Copyright © 2019 Matthew Carter 139 | 140 | This program and the accompanying materials are made available under the 141 | terms of the Eclipse Public License 2.0 which is available at 142 | http://www.eclipse.org/legal/epl-2.0. 143 | 144 | This Source Code may also be made available under the following Secondary 145 | Licenses when the conditions for such availability set forth in the Eclipse 146 | Public License, v. 2.0 are satisfied: GNU General Public License as published by 147 | the Free Software Foundation, either version 2 of the License, or (at your 148 | option) any later version, with the GNU Classpath Exception which is available 149 | at https://www.gnu.org/software/classpath/license.html. 150 | -------------------------------------------------------------------------------- /clojure/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /classes 3 | /checkouts 4 | profiles.clj 5 | pom.xml 6 | pom.xml.asc 7 | *.jar 8 | *.class 9 | /.lein-* 10 | /.nrepl-port 11 | .hgignore 12 | .hg/ 13 | -------------------------------------------------------------------------------- /clojure/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/). 3 | 4 | ## [Unreleased] 5 | ### Changed 6 | - Add a new arity to `make-widget-async` to provide a different widget shape. 7 | 8 | ## [0.1.1] - 2019-08-26 9 | ### Changed 10 | - Documentation on how to make the widgets. 11 | 12 | ### Removed 13 | - `make-widget-sync` - we're all async, all the time. 14 | 15 | ### Fixed 16 | - Fixed widget maker to keep working when daylight savings switches over. 17 | 18 | ## 0.1.0 - 2019-08-26 19 | ### Added 20 | - Files from the new template. 21 | - Widget maker public API - `make-widget-sync`. 22 | 23 | [Unreleased]: https://github.com/your-name/determinism/compare/0.1.1...HEAD 24 | [0.1.1]: https://github.com/your-name/determinism/compare/0.1.0...0.1.1 25 | -------------------------------------------------------------------------------- /clojure/LICENSE: -------------------------------------------------------------------------------- 1 | Eclipse Public License - v 2.0 2 | 3 | THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE 4 | PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION 5 | OF THE PROGRAM 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 content 12 | Distributed under this Agreement, and 13 | 14 | b) in the case of each subsequent Contributor: 15 | i) changes to the Program, and 16 | ii) additions to the Program; 17 | where such changes and/or additions to the Program originate from 18 | and are Distributed by that particular Contributor. A Contribution 19 | "originates" from a Contributor if it was added to the Program by 20 | such Contributor itself or anyone acting on such Contributor's behalf. 21 | Contributions do not include changes or additions to the Program that 22 | are not Modified Works. 23 | 24 | "Contributor" means any person or entity that Distributes the Program. 25 | 26 | "Licensed Patents" mean patent claims licensable by a Contributor which 27 | are necessarily infringed by the use or sale of its Contribution alone 28 | or when combined with the Program. 29 | 30 | "Program" means the Contributions Distributed in accordance with this 31 | Agreement. 32 | 33 | "Recipient" means anyone who receives the Program under this Agreement 34 | or any Secondary License (as applicable), including Contributors. 35 | 36 | "Derivative Works" shall mean any work, whether in Source Code or other 37 | form, that is based on (or derived from) the Program and for which the 38 | editorial revisions, annotations, elaborations, or other modifications 39 | represent, as a whole, an original work of authorship. 40 | 41 | "Modified Works" shall mean any work in Source Code or other form that 42 | results from an addition to, deletion from, or modification of the 43 | contents of the Program, including, for purposes of clarity any new file 44 | in Source Code form that contains any contents of the Program. Modified 45 | Works shall not include works that contain only declarations, 46 | interfaces, types, classes, structures, or files of the Program solely 47 | in each case in order to link to, bind by name, or subclass the Program 48 | or Modified Works thereof. 49 | 50 | "Distribute" means the acts of a) distributing or b) making available 51 | in any manner that enables the transfer of a copy. 52 | 53 | "Source Code" means the form of a Program preferred for making 54 | modifications, including but not limited to software source code, 55 | documentation source, and configuration files. 56 | 57 | "Secondary License" means either the GNU General Public License, 58 | Version 2.0, or any later versions of that license, including any 59 | exceptions or additional permissions as identified by the initial 60 | Contributor. 61 | 62 | 2. GRANT OF RIGHTS 63 | 64 | a) Subject to the terms of this Agreement, each Contributor hereby 65 | grants Recipient a non-exclusive, worldwide, royalty-free copyright 66 | license to reproduce, prepare Derivative Works of, publicly display, 67 | publicly perform, Distribute and sublicense the Contribution of such 68 | Contributor, if any, and such Derivative Works. 69 | 70 | b) Subject to the terms of this Agreement, each Contributor hereby 71 | grants Recipient a non-exclusive, worldwide, royalty-free patent 72 | license under Licensed Patents to make, use, sell, offer to sell, 73 | import and otherwise transfer the Contribution of such Contributor, 74 | if any, in Source Code or other form. This patent license shall 75 | apply to the combination of the Contribution and the Program if, at 76 | the time the Contribution is added by the Contributor, such addition 77 | of the Contribution causes such combination to be covered by the 78 | Licensed Patents. The patent license shall not apply to any other 79 | combinations which include the Contribution. No hardware per se is 80 | licensed hereunder. 81 | 82 | c) Recipient understands that although each Contributor grants the 83 | licenses to its Contributions set forth herein, no assurances are 84 | provided by any Contributor that the Program does not infringe the 85 | patent or other intellectual property rights of any other entity. 86 | Each Contributor disclaims any liability to Recipient for claims 87 | brought by any other entity based on infringement of intellectual 88 | property rights or otherwise. As a condition to exercising the 89 | rights and licenses granted hereunder, each Recipient hereby 90 | assumes sole responsibility to secure any other intellectual 91 | property rights needed, if any. For example, if a third party 92 | patent license is required to allow Recipient to Distribute the 93 | Program, it is Recipient's responsibility to acquire that license 94 | before distributing the Program. 95 | 96 | d) Each Contributor represents that to its knowledge it has 97 | sufficient copyright rights in its Contribution, if any, to grant 98 | the copyright license set forth in this Agreement. 99 | 100 | e) Notwithstanding the terms of any Secondary License, no 101 | Contributor makes additional grants to any Recipient (other than 102 | those set forth in this Agreement) as a result of such Recipient's 103 | receipt of the Program under the terms of a Secondary License 104 | (if permitted under the terms of Section 3). 105 | 106 | 3. REQUIREMENTS 107 | 108 | 3.1 If a Contributor Distributes the Program in any form, then: 109 | 110 | a) the Program must also be made available as Source Code, in 111 | accordance with section 3.2, and the Contributor must accompany 112 | the Program with a statement that the Source Code for the Program 113 | is available under this Agreement, and informs Recipients how to 114 | obtain it in a reasonable manner on or through a medium customarily 115 | used for software exchange; and 116 | 117 | b) the Contributor may Distribute the Program under a license 118 | different than this Agreement, provided that such license: 119 | i) effectively disclaims on behalf of all other Contributors all 120 | warranties and conditions, express and implied, including 121 | warranties or conditions of title and non-infringement, and 122 | implied warranties or conditions of merchantability and fitness 123 | for a particular purpose; 124 | 125 | ii) effectively excludes on behalf of all other Contributors all 126 | liability for damages, including direct, indirect, special, 127 | incidental and consequential damages, such as lost profits; 128 | 129 | iii) does not attempt to limit or alter the recipients' rights 130 | in the Source Code under section 3.2; and 131 | 132 | iv) requires any subsequent distribution of the Program by any 133 | party to be under a license that satisfies the requirements 134 | of this section 3. 135 | 136 | 3.2 When the Program is Distributed as Source Code: 137 | 138 | a) it must be made available under this Agreement, or if the 139 | Program (i) is combined with other material in a separate file or 140 | files made available under a Secondary License, and (ii) the initial 141 | Contributor attached to the Source Code the notice described in 142 | Exhibit A of this Agreement, then the Program may be made available 143 | under the terms of such Secondary Licenses, and 144 | 145 | b) a copy of this Agreement must be included with each copy of 146 | the Program. 147 | 148 | 3.3 Contributors may not remove or alter any copyright, patent, 149 | trademark, attribution notices, disclaimers of warranty, or limitations 150 | of liability ("notices") contained within the Program from any copy of 151 | the Program which they Distribute, provided that Contributors may add 152 | their own appropriate notices. 153 | 154 | 4. COMMERCIAL DISTRIBUTION 155 | 156 | Commercial distributors of software may accept certain responsibilities 157 | with respect to end users, business partners and the like. While this 158 | license is intended to facilitate the commercial use of the Program, 159 | the Contributor who includes the Program in a commercial product 160 | offering should do so in a manner which does not create potential 161 | liability for other Contributors. Therefore, if a Contributor includes 162 | the Program in a commercial product offering, such Contributor 163 | ("Commercial Contributor") hereby agrees to defend and indemnify every 164 | other Contributor ("Indemnified Contributor") against any losses, 165 | damages and costs (collectively "Losses") arising from claims, lawsuits 166 | and other legal actions brought by a third party against the Indemnified 167 | Contributor to the extent caused by the acts or omissions of such 168 | Commercial Contributor in connection with its distribution of the Program 169 | in a commercial product offering. The obligations in this section do not 170 | apply to any claims or Losses relating to any actual or alleged 171 | intellectual property infringement. In order to qualify, an Indemnified 172 | Contributor must: a) promptly notify the Commercial Contributor in 173 | writing of such claim, and b) allow the Commercial Contributor to control, 174 | and cooperate with the Commercial Contributor in, the defense and any 175 | related settlement negotiations. The Indemnified Contributor may 176 | participate in any such claim at its own expense. 177 | 178 | For example, a Contributor might include the Program in a commercial 179 | product offering, Product X. That Contributor is then a Commercial 180 | Contributor. If that Commercial Contributor then makes performance 181 | claims, or offers warranties related to Product X, those performance 182 | claims and warranties are such Commercial Contributor's responsibility 183 | alone. Under this section, the Commercial Contributor would have to 184 | defend claims against the other Contributors related to those performance 185 | claims and warranties, and if a court requires any other Contributor to 186 | pay any damages as a result, the Commercial Contributor must pay 187 | those damages. 188 | 189 | 5. NO WARRANTY 190 | 191 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT 192 | PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" 193 | BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR 194 | IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF 195 | TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR 196 | PURPOSE. Each Recipient is solely responsible for determining the 197 | appropriateness of using and distributing the Program and assumes all 198 | risks associated with its exercise of rights under this Agreement, 199 | including but not limited to the risks and costs of program errors, 200 | compliance with applicable laws, damage to or loss of data, programs 201 | or equipment, and unavailability or interruption of operations. 202 | 203 | 6. DISCLAIMER OF LIABILITY 204 | 205 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT 206 | PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS 207 | SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 208 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST 209 | PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 210 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 211 | ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE 212 | EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE 213 | POSSIBILITY OF SUCH DAMAGES. 214 | 215 | 7. GENERAL 216 | 217 | If any provision of this Agreement is invalid or unenforceable under 218 | applicable law, it shall not affect the validity or enforceability of 219 | the remainder of the terms of this Agreement, and without further 220 | action by the parties hereto, such provision shall be reformed to the 221 | minimum extent necessary to make such provision valid and enforceable. 222 | 223 | If Recipient institutes patent litigation against any entity 224 | (including a cross-claim or counterclaim in a lawsuit) alleging that the 225 | Program itself (excluding combinations of the Program with other software 226 | or hardware) infringes such Recipient's patent(s), then such Recipient's 227 | rights granted under Section 2(b) shall terminate as of the date such 228 | litigation is filed. 229 | 230 | All Recipient's rights under this Agreement shall terminate if it 231 | fails to comply with any of the material terms or conditions of this 232 | Agreement and does not cure such failure in a reasonable period of 233 | time after becoming aware of such noncompliance. If all Recipient's 234 | rights under this Agreement terminate, Recipient agrees to cease use 235 | and distribution of the Program as soon as reasonably practicable. 236 | However, Recipient's obligations under this Agreement and any licenses 237 | granted by Recipient relating to the Program shall continue and survive. 238 | 239 | Everyone is permitted to copy and distribute copies of this Agreement, 240 | but in order to avoid inconsistency the Agreement is copyrighted and 241 | may only be modified in the following manner. The Agreement Steward 242 | reserves the right to publish new versions (including revisions) of 243 | this Agreement from time to time. No one other than the Agreement 244 | Steward has the right to modify this Agreement. The Eclipse Foundation 245 | is the initial Agreement Steward. The Eclipse Foundation may assign the 246 | responsibility to serve as the Agreement Steward to a suitable separate 247 | entity. Each new version of the Agreement will be given a distinguishing 248 | version number. The Program (including Contributions) may always be 249 | Distributed subject to the version of the Agreement under which it was 250 | received. In addition, after a new version of the Agreement is published, 251 | Contributor may elect to Distribute the Program (including its 252 | Contributions) under the new version. 253 | 254 | Except as expressly stated in Sections 2(a) and 2(b) above, Recipient 255 | receives no rights or licenses to the intellectual property of any 256 | Contributor under this Agreement, whether expressly, by implication, 257 | estoppel or otherwise. All rights in the Program not expressly granted 258 | under this Agreement are reserved. Nothing in this Agreement is intended 259 | to be enforceable by any entity that is not a Contributor or Recipient. 260 | No third-party beneficiary rights are created under this Agreement. 261 | 262 | Exhibit A - Form of Secondary Licenses Notice 263 | 264 | "This Source Code may also be made available under the following 265 | Secondary Licenses when the conditions for such availability set forth 266 | in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), 267 | version(s), and exceptions or additional permissions here}." 268 | 269 | Simply including a copy of this Agreement, including this Exhibit A 270 | is not sufficient to license the Source Code under Secondary Licenses. 271 | 272 | If it is not possible or desirable to put the notice in a particular 273 | file, then You may include the notice in a location (such as a LICENSE 274 | file in a relevant directory) where a recipient would be likely to 275 | look for such a notice. 276 | 277 | You may add additional accurate notices of copyright ownership. 278 | -------------------------------------------------------------------------------- /clojure/README.md: -------------------------------------------------------------------------------- 1 | # determinism 2 | 3 | FIXME: description 4 | 5 | ## Installation 6 | 7 | Download from http://example.com/FIXME. 8 | 9 | ## Usage 10 | 11 | FIXME: explanation 12 | 13 | $ java -jar determinism-0.1.0-standalone.jar [args] 14 | 15 | ## Options 16 | 17 | FIXME: listing of options this app accepts. 18 | 19 | ## Examples 20 | 21 | ... 22 | 23 | ### Bugs 24 | 25 | ... 26 | 27 | ### Any Other Sections 28 | ### That You Think 29 | ### Might be Useful 30 | 31 | ## License 32 | 33 | Copyright © 2019 FIXME 34 | 35 | This program and the accompanying materials are made available under the 36 | terms of the Eclipse Public License 2.0 which is available at 37 | http://www.eclipse.org/legal/epl-2.0. 38 | 39 | This Source Code may also be made available under the following Secondary 40 | Licenses when the conditions for such availability set forth in the Eclipse 41 | Public License, v. 2.0 are satisfied: GNU General Public License as published by 42 | the Free Software Foundation, either version 2 of the License, or (at your 43 | option) any later version, with the GNU Classpath Exception which is available 44 | at https://www.gnu.org/software/classpath/license.html. 45 | -------------------------------------------------------------------------------- /clojure/doc/intro.md: -------------------------------------------------------------------------------- 1 | # Introduction to determinism 2 | 3 | TODO: write [great documentation](http://jacobian.org/writing/what-to-write/) 4 | -------------------------------------------------------------------------------- /clojure/project.clj: -------------------------------------------------------------------------------- 1 | (defproject ahungry/determinism "0.0.2" 2 | :description "Library for instrumenting a codebase in a unique way." 3 | :url "https://github.com/ahungry/determinism" 4 | :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0" 5 | :url "https://www.eclipse.org/legal/epl-2.0/"} 6 | :dependencies [ 7 | ;; Language related 8 | [org.clojure/clojure "1.10.0"] 9 | [clojure.java-time "0.3.2"] 10 | 11 | ;; Config related 12 | [ahungry/xdg-rc "0.0.4"] 13 | 14 | ;; Database related 15 | [org.clojure/java.jdbc "0.3.5"] 16 | [org.xerial/sqlite-jdbc "3.7.2"] 17 | 18 | ;; Parsing related 19 | [cheshire "5.9.0"] 20 | 21 | ;; Logging related 22 | [ch.qos.logback/logback-classic "1.2.3"] 23 | [org.clojure/tools.logging "0.5.0"] 24 | ] 25 | :main ^:skip-aot determinism.core 26 | :target-path "target/%s" 27 | :repl-options {:init-ns determinism.core} 28 | :profiles {:uberjar {:aot :all}}) 29 | -------------------------------------------------------------------------------- /clojure/src/determinism/core.clj: -------------------------------------------------------------------------------- 1 | (ns determinism.core 2 | (:require 3 | [clojure.tools.logging :as log] 4 | [clojure.test :as t] 5 | [clojure.spec.alpha :as s] 6 | [clojure.spec.gen.alpha :as gen] 7 | [clojure.spec.test.alpha :as stest] 8 | [determinism.proxy :as proxy] 9 | [determinism.stub :as stub] 10 | [determinism.dao :as dao] 11 | [determinism.replay :as replay] 12 | [determinism.help :as help] 13 | ) 14 | (:gen-class)) 15 | 16 | 17 | (defn -main 18 | "I don't do a whole lot ... yet." 19 | [& args] 20 | (log/info "Begin") 21 | (dao/make-db) 22 | (proxy/all-by-re #"determinism\.stub") 23 | (stub/main) 24 | (proxy/record-flush) 25 | (log/info "End")) 26 | 27 | (defn try-again [] 28 | (replay/replay-all)) 29 | 30 | (defn get-help [] 31 | (help/get-types #'determinism.stub/javascript-like-plus)) 32 | 33 | (defn get-help-apropos [] 34 | (help/get-types-apropos "determinism.stub")) 35 | -------------------------------------------------------------------------------- /clojure/src/determinism/dao.clj: -------------------------------------------------------------------------------- 1 | (ns determinism.dao 2 | (:require 3 | [clojure.repl :refer :all] 4 | [clojure.tools.logging :as log] 5 | [clojure.java.jdbc :as jdbc] 6 | [java-time :as t] 7 | [cheshire.core :as cheshire] 8 | [xdg-rc.core :as xdg-rc] 9 | ) 10 | (:gen-class)) 11 | 12 | (defn data-dir-db [] 13 | (str (xdg-rc/get-xdg-data-dir) "/ahungry-determinism.db")) 14 | 15 | (def db 16 | {:classname "org.sqlite.JDBC" 17 | :subprotocol "sqlite" 18 | :subname (data-dir-db)}) 19 | 20 | (defn make-db [] 21 | (jdbc/execute! db ["CREATE TABLE IF NOT EXISTS det ( 22 | identity, input, input_types, output, output_type, date);"])) 23 | 24 | (defn time-now [] 25 | (str (t/local-date-time))) 26 | 27 | (defn q 28 | "Wrapper for basic querying, with logging incorporated. 29 | SS = jdbc interface (vec: sql + args)." 30 | [ss] 31 | (let [result (apply jdbc/query db [ss])] 32 | (log/debug ss) 33 | (log/debug result) 34 | result)) 35 | 36 | (defn get-all [] (q ["select * from det"])) 37 | 38 | (defn maybe-seq [x] 39 | (if (seq? x) 40 | (into [] x) 41 | x)) 42 | 43 | (defn serializer [x] 44 | (->> x 45 | ;; cheshire/generate-string 46 | ;; cheshire/parse-string 47 | maybe-seq 48 | str)) 49 | 50 | (defn add [{:keys [identity input input-types output output-type]}] 51 | (jdbc/insert! db "det" 52 | {:identity identity 53 | :input 54 | (serializer input) 55 | :input_types 56 | (serializer input-types) 57 | :output 58 | (serializer output) 59 | :output_type 60 | (serializer output-type) 61 | ;; (cheshire/generate-string output-type) 62 | :date (time-now)})) 63 | 64 | (defn re-make-term [term] #(re-find (re-pattern (str "(?i).*" term ".*")) %)) 65 | 66 | (defn search-by-name [term] 67 | (->> (get-all) 68 | (filter #(re-find (re-pattern (str "(?i).*" term ".*")) (:identity %))))) 69 | 70 | (defn get-by-identity [s] 71 | (q ["select * from det where identity = ?" s])) 72 | 73 | (defn test-1 [] 74 | (get-by-identity "#'determinism.stub/javascript-like-plus")) 75 | 76 | (defn get-inputs-by-name [s] 77 | (->> (search-by-name s) 78 | (map :input_types) 79 | (map read-string) 80 | distinct)) 81 | 82 | (defn apropos-identities [s] 83 | (->> (search-by-name s) 84 | (map :identity) 85 | distinct)) 86 | -------------------------------------------------------------------------------- /clojure/src/determinism/help.clj: -------------------------------------------------------------------------------- 1 | (ns determinism.help 2 | (:require 3 | [clojure.test :as t] 4 | [clojure.repl :refer :all] 5 | [clojure.tools.logging :as log] 6 | [determinism.dao :as dao] 7 | ) 8 | (:gen-class)) 9 | 10 | 11 | (defn get-types 12 | "Pull in the available type information for a symbol." 13 | [x] 14 | (->> (dao/get-by-identity (str x)) 15 | (map :input_types) 16 | (map read-string) 17 | distinct 18 | sort)) 19 | 20 | (defn get-types-with-info [x] 21 | {:identity x 22 | :types (get-types x)}) 23 | 24 | (defn get-types-apropos 25 | "Do a loose search on some input/keyword and get all found type info." 26 | [x] 27 | (->> (dao/apropos-identities (str x)) 28 | (map get-types-with-info))) 29 | -------------------------------------------------------------------------------- /clojure/src/determinism/proxy.clj: -------------------------------------------------------------------------------- 1 | (ns determinism.proxy 2 | (:require 3 | [clojure.tools.logging :as log] 4 | [clojure.test :as t] 5 | [determinism.dao :as dao] 6 | [determinism.scoper :as scoper] 7 | ) 8 | (:gen-class)) 9 | 10 | (def *proxy-records (atom [])) 11 | 12 | (defn record-flush 13 | "Dump the records to some storage." 14 | [] 15 | (doall (map (fn [m] 16 | (log/info m) 17 | (dao/add m)) @*proxy-records))) 18 | 19 | (defn proxy-fn 20 | "Wrap I/O monitoring around a given function." 21 | [recall-identity] 22 | (fn 23 | [f] 24 | (fn [& r] 25 | (let [result (apply f r) 26 | info {:identity recall-identity 27 | ;; (identity f) 28 | :input r 29 | :input-types (str (into [] (map type r))) 30 | :output result 31 | :output-type (str (type result))}] 32 | (swap! *proxy-records conj info) 33 | result)))) 34 | 35 | ;; TODO: Get this global wrapper code working...pretty close I think. 36 | (defn proxy-def-x 37 | "Redefine a function with the wrapper around it. k = Symbol, v = Var to Fn." 38 | [[k v]] 39 | (binding [*ns* 'determinism.dao] 40 | (eval 41 | `(def ~k ~(proxy-fn (deref v)))))) 42 | 43 | (defn proxy-def 44 | "Redefine a function with the wrapper around it. k = Symbol, v = Var to Fn." 45 | [v] 46 | (prn "Wrapping for determinism: " (identity v)) 47 | (alter-var-root v (proxy-fn v))) 48 | 49 | (defn all-by-re [re] 50 | (->> (scoper/everything-filtered re) 51 | (map proxy-def) 52 | doall 53 | )) 54 | -------------------------------------------------------------------------------- /clojure/src/determinism/replay.clj: -------------------------------------------------------------------------------- 1 | (ns determinism.replay 2 | (:require 3 | [clojure.test :as t] 4 | [clojure.repl :refer :all] 5 | [clojure.tools.logging :as log] 6 | [determinism.dao :as dao] 7 | ) 8 | (:gen-class)) 9 | 10 | (def *report (atom {})) 11 | 12 | (defn is-fn? [x] 13 | (and (var? x) 14 | (t/function? (deref x)))) 15 | 16 | (defn is-callable? 17 | "See if our stringly IDENTIFIER can be called with some coercion." 18 | [identifier] 19 | (try 20 | (let [id (if (string? identifier) 21 | (read-string identifier) 22 | identifier)] 23 | (is-fn? (eval id))) 24 | (catch Exception e nil))) 25 | 26 | (defn inc-or-one [n] (if (nil? n) 1 (inc n))) 27 | 28 | (defn read-string-or-not [s] 29 | (try (read-string s) 30 | (catch Exception e s))) 31 | 32 | ;; TODO: Add an interactive strategy to swap old input saved with new input. 33 | ;; TODO: Do not do the read-string if the value type for a slot was in fact string. 34 | (defn execute-previous-input 35 | "Given a previous record, re-run the inputs and ensure the output 36 | remains the same as it did in a prior evocation." 37 | [{:keys [identity input output]}] 38 | (let [in (read-string-or-not input) 39 | out (read-string-or-not output) 40 | id (read-string identity) 41 | f (deref (eval id)) 42 | res (apply f in)] 43 | (if (or (= out res) 44 | (= output res)) 45 | (swap! *report update-in [identity :pass] inc-or-one) 46 | (do 47 | (prn "Failed on: " out res) 48 | (swap! *report update-in [identity :fail] inc-or-one)) 49 | ) 50 | )) 51 | 52 | (defn execute-previous-inputs [id] 53 | (->> (dao/search-by-name (str id)) 54 | (map execute-previous-input) 55 | doall) 56 | @*report) 57 | 58 | (defn replay 59 | "Given an IDENTIFIER, replay the known inputs and see if they produce 60 | the same outputs." 61 | [identifier] 62 | (when-not (is-callable? identifier) 63 | (throw (Throwable. "That IDENTIFIER does not exist as a callable IFn!"))) 64 | (execute-previous-inputs identifier)) 65 | 66 | (defn replay-all 67 | "Attempt to replay all known and existent functions/symbols." 68 | [] 69 | (reset! *report {}) 70 | (->> (dao/get-all) 71 | (map :identity) 72 | distinct 73 | (filter is-callable?) 74 | (map replay) 75 | doall) 76 | @*report) 77 | -------------------------------------------------------------------------------- /clojure/src/determinism/scoper.clj: -------------------------------------------------------------------------------- 1 | (ns determinism.scoper 2 | (:require 3 | [clojure.tools.logging :as log] 4 | [clojure.test :as t] 5 | ) 6 | (:gen-class)) 7 | 8 | (defn everything 9 | "Get all the symbols we can find." 10 | [] 11 | (->> (all-ns) 12 | (mapcat ns-publics) 13 | )) 14 | 15 | (defn re-vs-symbol 16 | "Filter regex vs a symbol." 17 | [re] 18 | (fn [s] 19 | (re-find re (str s)))) 20 | 21 | (defn inner-fn? [x] 22 | (and (= clojure.lang.Var (type x)) 23 | (t/function? (deref x)))) 24 | 25 | (defn everything-filtered 26 | "Usually you would want just your project symbols, so calling with RE of: 27 | `determinism\\..*?/' for instance will match all symbols in this project, 28 | and rarely any else." 29 | [re] 30 | (->> (filter (re-vs-symbol re) (everything)) 31 | (map #(get % 1)) 32 | (filter inner-fn?))) 33 | 34 | (defn active-ns 35 | "Get the symbols that are just in this namespace (well, the active one anyways)." 36 | [] 37 | (->> *ns* (ns-publics))) 38 | -------------------------------------------------------------------------------- /clojure/src/determinism/stub.clj: -------------------------------------------------------------------------------- 1 | (ns determinism.stub 2 | (:require 3 | [clojure.tools.logging :as log] 4 | [determinism.proxy :as proxy] 5 | ) 6 | (:gen-class)) 7 | 8 | (defn javascript-like-plus 9 | "Given an X and Y, join strings or add them." 10 | [x y] 11 | (if (or (string? x) 12 | (string? y)) 13 | (str x y) 14 | (+ x y))) 15 | 16 | ;; "A prime example of data chaining pitfall - it passes data along, but what data? 17 | ;; Maybe not relevant at this point in time, but it could be in the future." 18 | (defn foo-map [m] 19 | (update-in m [:foo :bar] inc)) 20 | 21 | (defn bar-map [m] 22 | (-> (foo-map m) 23 | (update-in [:foo :bar] inc))) 24 | 25 | (defn hof-sample [f g] 26 | (fn [x] (f (g x)))) 27 | 28 | (defn main [] 29 | (javascript-like-plus 1 2) 30 | (javascript-like-plus 3 4) 31 | (javascript-like-plus "x" "y") 32 | (javascript-like-plus 2 "y") 33 | (javascript-like-plus "x" 3) 34 | (hof-sample inc inc) 35 | (bar-map {:foo {:bar 5 :baz 9}})) 36 | -------------------------------------------------------------------------------- /clojure/src/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-10contextName %logger{36} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | determinism.log 13 | true 14 | 16 | 17 | 18 | %-4relative [%thread] %-5level %logger{35} - %msg%n 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /clojure/test/determinism/core_test.clj: -------------------------------------------------------------------------------- 1 | (ns determinism.core-test 2 | (:require [clojure.test :refer :all] 3 | [determinism.core :refer :all])) 4 | 5 | (deftest a-test 6 | (testing "FIXME, I fail." 7 | (is (= 0 1)))) 8 | -------------------------------------------------------------------------------- /sql/schema.sql: -------------------------------------------------------------------------------- 1 | -- -*- mode: sql; sql-product: sqlite; -*- 2 | 3 | -- We want to track all function calls inputs and outputs. 4 | 5 | BEGIN; 6 | 7 | -- Is this a mess, or is it OK? Its basically going to chain with 8 | -- each node requiring an extra column. 9 | 10 | CREATE TABLE det ( 11 | identity 12 | , input 13 | , input_types 14 | , output 15 | , output_type 16 | , date 17 | ); 18 | 19 | INSERT INTO det (identity, input, input_types, output, output_type, date) 20 | VALUES 21 | ('hello', 'Matt', 'string', 'Hello Matt', 'string', '2019-01-01 12:00:00') 22 | , ('bye', '42', 'integer', 'Bye 42', 'string', '2019-01-01 12:00:00') 23 | ; 24 | 25 | -- Pretty print 26 | .headers on 27 | .mode column 28 | 29 | select * from det; 30 | 31 | COMMIT; 32 | --------------------------------------------------------------------------------