yamlkeysdiff (empty) → 0.5.0
raw patch · 5 files changed
+459/−0 lines, 5 filesdep +basedep +containersdep +parsecsetup-changed
Dependencies added: base, containers, parsec, text, unordered-containers, yaml
Files
- LICENSE +296/−0
- README.rst +53/−0
- Setup.hs +2/−0
- src/Main.hs +78/−0
- yamlkeysdiff.cabal +30/−0
+ LICENSE view
@@ -0,0 +1,296 @@+ European Union Public Licence+ V. 1.1++ EUPL (c) the European Community 2007+++This European Union Public Licence (the "EUPL") applies to the Work or Software+(as defined below) which is provided under the terms of this Licence. Any use+of the Work, other than as authorised under this Licence is prohibited (to the+extent such use is covered by a right of the copyright holder of the Work).++The Original Work is provided under the terms of this Licence when the Licensor+(as defined below) has placed the following notice immediately following the+copyright notice for the Original Work:++ Licensed under the EUPL V.1.1++or has expressed by any other mean his willingness to license under the EUPL.+++ 1. Definitions++In this Licence, the following terms have the following meaning:++ * The Licence: this Licence.++ * The Original Work or the Software: the software distributed and/or+ communicated by the Licensor under this Licence, available as Source Code+ and also as Executable Code as the case may be.++ * Derivative Works: the works or software that could be created by the+ Licensee, based upon the Original Work or modifications thereof. This+ Licence does not define the extent of modification or dependence on the+ Original Work required in order to classify a work as a Derivative Work;+ this extent is determined by copyright law applicable in the country+ mentioned in Article 15.++ * The Work: the Original Work and/or its Derivative Works.++ * The Source Code: the human-readable form of the Work which is the most+ convenient for people to study and modify.++ * The Executable Code: any code which has generally been compiled and which is+ meant to be interpreted by a computer as a program.++ * The Licensor: the natural or legal person that distributes and/or+ communicates the Work under the Licence.++ * Contributor(s): any natural or legal person who modifies the Work under the+ Licence, or otherwise contributes to the creation of a Derivative Work.++ * The Licensee or "You": any natural or legal person who makes any usage of+ the Software under the terms of the Licence.++ * Distribution and/or Communication: any act of selling, giving, lending,+ renting, distributing, communicating, transmitting, or otherwise making+ available, on-line or off-line, copies of the Work or providing access to+ its essential functionalities at the disposal of any other natural or legal+ person.+++ 2. Scope of the rights granted by the Licence++The Licensor hereby grants You a world-wide, royalty-free, non-exclusive,+sublicensable licence to do the following, for the duration of copyright vested+in the Original Work:++ * use the Work in any circumstance and for all usage,+ * reproduce the Work,+ * modify the Original Work, and make Derivative Works based upon the Work,+ * communicate to the public, including the right to make available or display+ the Work or copies thereof to the public and perform publicly, as the case+ may be, the Work,+ * distribute the Work or copies thereof,+ * lend and rent the Work or copies thereof,+ * sub-license rights in the Work or copies thereof.++Those rights can be exercised on any media, supports and formats, whether now+known or later invented, as far as the applicable law permits so.++In the countries where moral rights apply, the Licensor waives his right to+exercise his moral right to the extent allowed by law in order to make+effective the licence of the economic rights here above listed.++The Licensor grants to the Licensee royalty-free, non exclusive usage rights to+any patents held by the Licensor, to the extent necessary to make use of the+rights granted on the Work under this Licence.+++ 3. Communication of the Source Code++The Licensor may provide the Work either in its Source Code form, or as+Executable Code. If the Work is provided as Executable Code, the Licensor+provides in addition a machine-readable copy of the Source Code of the Work+along with each copy of the Work that the Licensor distributes or indicates, in+a notice following the copyright notice attached to the Work, a repository+where the Source Code is easily and freely accessible for as long as the+Licensor continues to distribute and/or communicate the Work.+++ 4. Limitations on copyright++Nothing in this Licence is intended to deprive the Licensee of the benefits+from any exception or limitation to the exclusive rights of the rights owners+in the Original Work or Software, of the exhaustion of those rights or of other+applicable limitations thereto.+++ 5. Obligations of the Licensee++The grant of the rights mentioned above is subject to some restrictions and+obligations imposed on the Licensee. Those obligations are the following:++ - Attribution right: the Licensee shall keep intact all copyright, patent or+ trademarks notices and all notices that refer to the Licence and to the+ disclaimer of warranties. The Licensee must include a copy of such notices+ and a copy of the Licence with every copy of the Work he/she distributes+ and/or communicates. The Licensee must cause any Derivative Work to carry+ prominent notices stating that the Work has been modified and the date of+ modification.++ - Copyleft clause: If the Licensee distributes and/or communicates copies of+ the Original Works or Derivative Works based upon the Original Work, this+ Distribution and/or Communication will be done under the terms of this+ Licence or of a later version of this Licence unless the Original Work is+ expressly distributed only under this version of the Licence. The Licensee+ (becoming Licensor) cannot offer or impose any additional terms or+ conditions on the Work or Derivative Work that alter or restrict the terms+ of the Licence.++ - Compatibility clause: If the Licensee Distributes and/or Communicates+ Derivative Works or copies thereof based upon both the Original Work and+ another work licensed under a Compatible Licence, this Distribution and/or+ Communication can be done under the terms of this Compatible Licence. For+ the sake of this clause, "Compatible Licence" refers to the licences listed+ in the appendix attached to this Licence. Should the Licensee's obligations+ under the Compatible Licence conflict with his/her obligations under this+ Licence, the obligations of the Compatible Licence shall prevail.++ - Provision of Source Code: When distributing and/or communicating copies of+ the Work, the Licensee will provide a machine-readable copy of the Source+ Code or indicate a repository where this Source will be easily and freely+ available for as long as the Licensee continues to distribute and/or+ communicate the Work. Legal Protection: This Licence does not grant+ permission to use the trade names, trademarks, service marks, or names of+ the Licensor, except as required for reasonable and customary use in+ describing the origin of the Work and reproducing the content of the+ copyright notice.+++ 6. Chain of Authorship++The original Licensor warrants that the copyright in the Original Work granted+hereunder is owned by him/her or licensed to him/her and that he/she has the+power and authority to grant the Licence.++Each Contributor warrants that the copyright in the modifications he/she brings+to the Work are owned by him/her or licensed to him/her and that he/she has the+power and authority to grant the Licence.++Each time You accept the Licence, the original Licensor and subsequent+Contributors grant You a licence to their contributions to the Work, under the+terms of this Licence.+++ 7. Disclaimer of Warranty++The Work is a work in progress, which is continuously improved by numerous+contributors. It is not a finished work and may therefore contain defects or+"bugs" inherent to this type of software development.++For the above reason, the Work is provided under the Licence on an "as is"+basis and without warranties of any kind concerning the Work, including without+limitation merchantability, fitness for a particular purpose, absence of+defects or errors, accuracy, non-infringement of intellectual property rights+other than copyright as stated in Article 6 of this Licence.++This disclaimer of warranty is an essential part of the Licence and a condition+for the grant of any rights to the Work.+++ 8. Disclaimer of Liability++Except in the cases of wilful misconduct or damages directly caused to natural+persons, the Licensor will in no event be liable for any direct or indirect,+material or moral, damages of any kind, arising out of the Licence or of the+use of the Work, including without limitation, damages for loss of goodwill,+work stoppage, computer failure or malfunction, loss of data or any commercial+damage, even if the Licensor has been advised of the possibility of such+damage. However, the Licensor will be liable under statutory product liability+laws as far such laws apply to the Work.+++ 9. Additional agreements++While distributing the Original Work or Derivative Works, You may choose to+conclude an additional agreement to offer, and charge a fee for, acceptance of+support, warranty, indemnity, or other liability obligations and/or services+consistent with this Licence. However, in accepting such obligations, You may+act only on your own behalf and on your sole responsibility, not on behalf of+the original Licensor or any other Contributor, and only if You agree to+indemnify, defend, and hold each Contributor harmless for any liability+incurred by, or claims asserted against such Contributor by the fact You have+accepted any such warranty or additional liability.+++ 10. Acceptance of the Licence++The provisions of this Licence can be accepted by clicking on an icon "I agree"+placed under the bottom of a window displaying the text of this Licence or by+affirming consent in any other similar way, in accordance with the rules of+applicable law. Clicking on that icon indicates your clear and irrevocable+acceptance of this Licence and all of its terms and conditions.++Similarly, you irrevocably accept this Licence and all of its terms and+conditions by exercising any rights granted to You by Article 2 of this+Licence, such as the use of the Work, the creation by You of a Derivative Work+or the Distribution and/or Communication by You of the Work or copies thereof.+++ 11. Information to the public++In case of any Distribution and/or Communication of the Work by means of+electronic communication by You (for example, by offering to download the Work+from a remote location) the distribution channel or media (for example, a+website) must at least provide to the public the information requested by the+applicable law regarding the Licensor, the Licence and the way it may be+accessible, concluded, stored and reproduced by the Licensee.+++ 12. Termination of the Licence++The Licence and the rights granted hereunder will terminate automatically upon+any breach by the Licensee of the terms of the Licence.++Such a termination will not terminate the licences of any person who has+received the Work from the Licensee under the Licence, provided such persons+remain in full compliance with the Licence.+++ 13. Miscellaneous++Without prejudice of Article 9 above, the Licence represents the complete+agreement between the Parties as to the Work licensed hereunder.++If any provision of the Licence is invalid or unenforceable under applicable+law, this will not affect the validity or enforceability of the Licence as a+whole. Such provision will be construed and/or reformed so as necessary to make+it valid and enforceable.++The European Commission may publish other linguistic versions and/or new+versions of this Licence, so far this is required and reasonable, without+reducing the scope of the rights granted by the Licence. New versions of the+Licence will be published with a unique version number.++All linguistic versions of this Licence, approved by the European Commission,+have identical value. Parties can take advantage of the linguistic version of+their choice.+++ 14. Jurisdiction++Any litigation resulting from the interpretation of this License, arising+between the European Commission, as a Licensor, and any Licensee, will be+subject to the jurisdiction of the Court of Justice of the European+Communities, as laid down in article 238 of the Treaty establishing the+European Community.++Any litigation arising between Parties, other than the European Commission, and+resulting from the interpretation of this License, will be subject to the+exclusive jurisdiction of the competent court where the Licensor resides or+conducts its primary business.+++ 15. Applicable Law++This Licence shall be governed by the law of the European Union country where+the Licensor resides or has his registered office.++This licence shall be governed by the Belgian law if:++ * a litigation arises between the European Commission, as a Licensor, and any+ Licensee;+ * the Licensor, other than the European Commission, has no residence or+ registered office inside a European Union country.+++ Appendix++"Compatible Licences" according to article 5 EUPL are:++ * GNU General Public License (GNU GPL) v. 2+ * Open Software License (OSL) v. 2.1, v. 3.0+ * Common Public License v. 1.0+ * Eclipse Public License v. 1.0+ * Cecill v. 2.0
+ README.rst view
@@ -0,0 +1,53 @@+YAMLKeysDiff+============++Command line tools to generate a fast and human readable diff::+++ $ cat a.yml+ a: hello+ b: world+ d:+ a: a+ b: b+ A: A+ $ cat b.yml+ a: world+ c: hello+ d:+ a: a+ b: b+ c: c+ $ yamlkeysdiff a.yml b.yml+ > b+ < c+ > d:A+ < d:c+ $ yamlkeysdiff "a.yml#d" "b.yml#d"+ > A+ < c++Installation+------------++::++ $ cabal sandbox init # Always use sandboxes (like python virtual env)+ $ cabal install --only-dependencies # Install the package dependencies+ # if this fails, try:+ # cabal install --only-dependencies --force-reinstalls+ $ cabal configure+ $ cabal build+ $ ./dist/build/yamlkeysdiff/yamlkeysdiff++You can also do that with::++ $ make all+++TODO+----++* Add tests+* Don't compare the subkeys when the parent key is missing+* Write a generic diff function which can diff many files
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ src/Main.hs view
@@ -0,0 +1,78 @@+-- Copyright (c) 2015 Antoine Catton+--+-- This file is part of YAMLKeysDiff and is distributed under EUPLv1.1,+-- see the LICENSE file for more information. If a LICENSE file wasn't+-- provided with this piece of software, you will find a copy at:+-- <http://ec.europa.eu/idabc/eupl.html>+--+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE+-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN+-- THE SOFTWARE.++import System.Environment (getArgs, getProgName)+import System.Exit (exitWith, ExitCode(ExitSuccess, ExitFailure))+import qualified Data.Yaml as Yaml+import qualified Data.List as List+import qualified Data.Either as Either+import qualified Data.HashMap.Lazy as HashMap+import Control.Monad (foldM)+import Data.Text (pack)++import qualified YamlKeysDiff.Opts as Opts+import YamlKeysDiff.Filename (parseFileName)+import YamlKeysDiff.Diff (diff, isSimilar)++decodeFilename :: String -> IO (FilePath, [String])+decodeFilename fileName =+ case parseFileName fileName of+ Either.Right a -> return a+ Either.Left e ->+ ioError $ userError $ "couldn't parse filename " ++ fileName+++decodeFile :: FilePath -> IO Yaml.Value+decodeFile path = do+ (fileName, keys) <- decodeFilename path+ maybeContent <- Yaml.decodeFile fileName+ content <- case maybeContent of+ Just c -> return c+ Nothing -> ioError $ userError $ "couldn't decode file " ++ fileName+ case getValue keys content of+ Just v -> return v+ Nothing -> ioError $ userError $ "couldn't find the key " ++ List.intercalate ":" keys++getValue :: [String] -> Yaml.Value -> Maybe Yaml.Value+getValue keys value =+ let getKey key value =+ case value of+ Yaml.Object obj -> HashMap.lookup key obj+ _ -> Nothing+ in foldM (flip getKey) value $ map pack keys++getFiles :: [String] -> IO (String, String)+getFiles args =+ case args of+ [a, b] -> return (a, b)+ _ -> ioError (userError "Please specify two files")++main :: IO ()+main = do+ progName <- getProgName+ argv <- getArgs+ (flags, args) <- Opts.getOptions progName argv+ if List.elem Opts.Help flags then+ putStr $ Opts.usage progName+ else do+ formattingFunction <- Opts.getFormattingFunction flags+ (filePathA, filePathB) <- getFiles args+ contentA <- decodeFile filePathA+ contentB <- decodeFile filePathB+ let diffLines = diff contentA contentB+ putStr $ formattingFunction diffLines+ -- FIXME: ioError also exit with 1+ exitWith $ if all isSimilar diffLines then ExitSuccess+ else (ExitFailure 1)
+ yamlkeysdiff.cabal view
@@ -0,0 +1,30 @@+-- Initial yamlkeysdiff.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/++name: yamlkeysdiff+version: 0.5.0+synopsis: Compares the keys from two yaml files+-- description: +homepage: https://github.com/acatton/yamlkeysdiff+license: OtherLicense+license-file: LICENSE+author: Antoine Catton+maintainer: devel@antoine.catton.fr+-- copyright: +category: Utilities+build-type: Simple+extra-source-files: README.rst+cabal-version: >=1.10++executable yamlkeysdiff+ main-is: Main.hs+ -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.8,+ containers >= 0.5 && <0.6,+ parsec >=3.1 && <3.2,+ unordered-containers >=0.2 && <0.3,+ text >=0.11 && <0.12,+ yaml >=0.8 && <0.9+ hs-source-dirs: src+ default-language: Haskell2010