diff --git a/.travis.yml b/.travis.yml index 91d9131d..11491551 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: python python: - - "2.7" - "3.6" install: @@ -9,14 +8,3 @@ install: script: - bin/py.test -vvs - -notifications: - irc: - channels: - - "chat.freenode.net#aboutcode" - on_success: change - on_failure: always - use_notice: true - skip_join: true - template: - - "%{repository_slug}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} : %{build_url}" diff --git a/NOTICE b/NOTICE index ca2e3789..1dc38bb9 100644 --- a/NOTICE +++ b/NOTICE @@ -1,4 +1,4 @@ - Copyright (c) 2013-2020 nexB Inc. http://www.nexb.com/ - All rights reserved. + Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/README.rst b/README.rst index 4cdea6eb..fc79c34f 100644 --- a/README.rst +++ b/README.rst @@ -20,7 +20,7 @@ In addition, this tool is able to generate attribution notices and identify redistributable source code used in your project to help you comply with open source licenses conditions. -This version of the AboutCode Toolkit follows the ABOUT specification version 3.1.4 at: +This version of the AboutCode Toolkit follows the ABOUT specification version 3.2.1 at: https://github.com/nexB/aboutcode-toolkit/blob/develop/SPECIFICATION.rst @@ -38,7 +38,7 @@ Build and tests status REQUIREMENTS ------------ -The AboutCode Toolkit is tested with Python 2.7 and 3.6 on Linux, Mac and Windows. +The AboutCode Toolkit is tested with Python 3 only on Linux, Mac and Windows. You will need to install a Python interpreter if you do not have one already installed. diff --git a/about.ABOUT b/about.ABOUT index 074fe24f..29647dff 100644 --- a/about.ABOUT +++ b/about.ABOUT @@ -1,6 +1,6 @@ about_resource: . name: AboutCode-toolkit -version: 5.1.0 +version: 6.0.0 author: Jillian Daguil, Chin Yeung Li, Philippe Ombredanne, Thomas Druez copyright: Copyright (c) 2013-2020 nexB Inc. description: | diff --git a/about.bat b/about.bat index 93c45b85..03294d80 100644 --- a/about.bat +++ b/about.bat @@ -1,5 +1,5 @@ @echo OFF -@rem Copyright (c) 2014 nexB Inc. http://www.nexb.com/ - All rights reserved. +@rem Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. @rem diff --git a/appveyor.yml b/appveyor.yml index 73215e06..d863702c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,9 +9,3 @@ test_script: - set - bin/activate - pytest -vvs tests - -on_success: - - "python etc/scripts/irc-notify.py aboutcode [{project_name}:{branch}] {short_commit}: \"{message}\" ({author}) {color_green}Succeeded,Details: {build_url},Commit: {commit_url}" - -on_failure: - - "python etc/scripts/irc-notify.py aboutcode [{project_name}:{branch}] {short_commit}: \"{message}\" ({author}) {color_red}Failed,Details: {build_url},Commit: {commit_url}" diff --git a/etc/conf/base.txt b/etc/conf/base.txt index b6fe4c05..6e9aade0 100644 --- a/etc/conf/base.txt +++ b/etc/conf/base.txt @@ -6,15 +6,15 @@ pip wincertstore # used for templating -jinja2>=2.9.6 -MarkupSafe>=1.0.0 +jinja2 +MarkupSafe -click==6.7 +click # used by schematics six -PyYAML >= 3.0, < 4.0 +saneyaml attrs # license expression support diff --git a/etc/conf/win.txt b/etc/conf/win.txt deleted file mode 100644 index d73c1744..00000000 --- a/etc/conf/win.txt +++ /dev/null @@ -1 +0,0 @@ -wincertstore==0.2 diff --git a/etc/configure.py b/etc/configure.py index 253f7e30..5118e3c8 100644 --- a/etc/configure.py +++ b/etc/configure.py @@ -1,6 +1,6 @@ #!/usr/bin/python -# Copyright (c) 2018 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. """ This script is a configuration helper to select pip requirement files to install diff --git a/etc/scripts/gpl-2.0.LICENSE b/etc/scripts/gpl-2.0.LICENSE deleted file mode 100644 index d815b29b..00000000 --- a/etc/scripts/gpl-2.0.LICENSE +++ /dev/null @@ -1,339 +0,0 @@ -GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. \ No newline at end of file diff --git a/etc/scripts/irc-notify.py b/etc/scripts/irc-notify.py deleted file mode 100644 index 9da17184..00000000 --- a/etc/scripts/irc-notify.py +++ /dev/null @@ -1,154 +0,0 @@ -""" -From: https://raw.githubusercontent.com/gridsync/gridsync/def54f8166089b733d166665fdabcad4cdc526d8/misc/irc-notify.py -and: https://github.com/gridsync/gridsync - -Copyright (C) 2015-2016 Christopher R. Wood - -This program is free software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the Free Software Foundation; -either version 2 of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this -program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, -Fifth Floor, Boston, MA 02110-1301 USA. - -Simple AppVeyor IRC notification script. - -Modified by nexB on October 2016: - - rework the handling of environment variables. - - made the script use functions - - support only Appveyor loading its environment variable to craft IRC notices. - - -The first argument is a Frenode channel. Other arguments passed to the script will be -sent as notice messages content and any {var}-formatted environment variables will be -expanded automatically, replaced with a corresponding Appveyor environment variable -value. se commas to delineate multiple messages. - - -Example: -export APPVEYOR_URL=https://ci.appveyor.com -export APPVEYOR_PROJECT_NAME=attributecode -export APPVEYOR_REPO_COMMIT_AUTHOR=pombredanne -export APPVEYOR_REPO_COMMIT_TIMESTAMP=2016-10-31 -export APPVEYOR_REPO_PROVIDER=gihub -export APPVEYOR_REPO_BRANCH=repo_branch -export APPVEYOR_PULL_REQUEST_TITLE=pull_request_title -export APPVEYOR_BUILD_VERSION=1 -export APPVEYOR_REPO_COMMIT=22c95b72e29248dc4de9b85e590ee18f6f587de8 -export APPVEYOR_REPO_COMMIT_MESSAGE="some IRC test" -export APPVEYOR_ACCOUNT_NAME=nexB -export APPVEYOR_PULL_REQUEST_NUMBER=pull_request_number -export APPVEYOR_REPO_NAME=nexB/attributecode -python etc/scripts/irc-notify.py aboutcode '[{project_name}:{branch}] {short_commit}: "{message}" ({author}) {color_red}Succeeded','Details: {build_url} | Commit: {commit_url}' - -See also https://github.com/gridsync/gridsync/blob/master/appveyor.yml for examples -in Appveyor's YAML: - - on_success: - - "python etc/scripts/irc-notify.py channel [{project_name}:{branch}] {short_commit}: \"{message}\" ({author}) {color_green}Succeeded,Details: {build_url},Commit: {commit_url}" - on_failure: - - "python etc/scripts/irc-notify.py channel [{project_name}:{branch}] {short_commit}: \"{message}\" ({author}) {color_red}Failed,Details: {build_url},Commit: {commit_url}" - -""" - -import os, random, socket, ssl, sys, time - - -def appveyor_vars(): - """ - Return a dict of key value carfted from appveyor environment variables. - """ - from os import environ - - appveyor_url = environ.get('APPVEYOR_URL') - message_extended = environ.get('APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED') - branch = environ.get('APPVEYOR_REPO_BRANCH') - author = environ.get('APPVEYOR_REPO_COMMIT_AUTHOR') - author_email = environ.get('APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL') - timestamp = environ.get('APPVEYOR_REPO_COMMIT_TIMESTAMP') - repo_provider = environ.get('APPVEYOR_REPO_PROVIDER') - project_name = environ.get('APPVEYOR_PROJECT_NAME') - pull_request_title = environ.get('APPVEYOR_PULL_REQUEST_TITLE') - build_version = environ.get('APPVEYOR_BUILD_VERSION') - commit = environ.get('APPVEYOR_REPO_COMMIT') - message = environ.get('APPVEYOR_REPO_COMMIT_MESSAGE') - account_name = environ.get('APPVEYOR_ACCOUNT_NAME') - pull_request_number = environ.get('APPVEYOR_PULL_REQUEST_NUMBER') - repo_name = environ.get('APPVEYOR_REPO_NAME') - - short_commit = commit[:7] - build_url = '{appveyor_url}/project/{account_name}/{project_name}/build/{build_version}'.format(**locals()) - commit_url = 'https://{repo_provider}.com/{repo_name}/commit/{commit}'.format(**locals()) - - vars = dict( - appveyor_url=appveyor_url, - account_name=account_name, - project_name=project_name, - build_version=build_version, - - build_url=build_url, - - repo_provider=repo_provider, - repo_name=repo_name, - branch=branch, - author=author, - author_email=author_email, - timestamp=timestamp, - commit=commit, - short_commit=short_commit, - message=message, - message_extended=message_extended, - - pull_request_title=pull_request_title, - pull_request_number=pull_request_number, - - commit_url=commit_url, - - color_green='\x033', - color_red='\x034', - ) - return vars - - -if __name__ == '__main__': - apvy_vars = appveyor_vars() - - channel = sys.argv[1] - messages = sys.argv[2:] - messages = ' '.join(messages) - messages = messages.split(',') - messages = [msg.format(**apvy_vars).strip() for msg in messages] - - irc_username = 'Appveyor' - irc_nick = irc_username + str(random.randint(1, 9999)) - - # establish connection - irc_sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) - irc_sock.connect((socket.gethostbyname('chat.freenode.net'), 6697)) - irc_sock.send('NICK {0}\r\nUSER {0} * 0 :{0}\r\n'.format(irc_username).encode()) - irc_file = irc_sock.makefile() - - while irc_file: - line = irc_file.readline() - print(line.rstrip()) - response = line.split() - - if response[0] == 'PING': - irc_file.send('PONG {}\r\n'.format(response[1]).encode()) - - elif response[1] == '433': - irc_sock.send('NICK {}\r\n'.format(irc_nick).encode()) - - elif response[1] == '001': - time.sleep(5) - # send notification - for msg in messages: - print('NOTICE #{} :{}'.format(channel, msg)) - irc_sock.send('NOTICE #{} :{}\r\n'.format(channel, msg).encode()) - time.sleep(5) - sys.exit() diff --git a/etc/scripts/irc-notify.py.ABOUT b/etc/scripts/irc-notify.py.ABOUT deleted file mode 100644 index 9d56add7..00000000 --- a/etc/scripts/irc-notify.py.ABOUT +++ /dev/null @@ -1,15 +0,0 @@ -about_resource: irc-notify.py -name: irc-notify.py -version: def54f8166089b733d166665fdabcad4cdc526d8 -copyright: Copyright (C) 2015-2016 Christopher R. Wood -description: Quick and dirty IRC notification script. -download_url: https://raw.githubusercontent.com/gridsync/gridsync/def54f8166089b733d166665fdabcad4cdc526d8/misc/irc-notify.py -homepage_url: https://github.com/gridsync/gridsync -license_expression: gpl-2.0 -licenses: - - file: gpl-2.0.LICENSE - key: gpl-2.0 - name: GNU General Public License 2.0 - url: https://enterprise.dejacode.com/urn/?urn=urn:dje:license:gpl-2.0 -notice_file: irc-notify.py.NOTICE -owner: Christopher R. Wood diff --git a/etc/scripts/irc-notify.py.NOTICE b/etc/scripts/irc-notify.py.NOTICE deleted file mode 100644 index d73fc871..00000000 --- a/etc/scripts/irc-notify.py.NOTICE +++ /dev/null @@ -1,12 +0,0 @@ -This program is free software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this -program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, -Fifth Floor, Boston, MA 02110-1301 USA. \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index c29a174d..599739d0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,11 +1,8 @@ -[bdist_wheel] -universal = 1 - [metadata] license_file = NOTICE [aliases] -release = clean --all sdist --formats=bztar,zip bdist_wheel +release = clean --all sdist bdist_wheel [tool:pytest] norecursedirs = diff --git a/setup.py b/setup.py index a280a0ad..34a4ce2f 100644 --- a/setup.py +++ b/setup.py @@ -1,11 +1,8 @@ #!/usr/bin/env python # -*- encoding: utf-8 -*- -from __future__ import absolute_import -from __future__ import print_function - -from glob import glob import io +from glob import glob from os.path import basename from os.path import dirname from os.path import join @@ -24,7 +21,7 @@ def read(*names, **kwargs): setup( name='aboutcode-toolkit', - version='5.1.0', + version='6.0.0', license='Apache-2.0', description=( 'AboutCode-toolkit is a tool to document the provenance (origin and license) of ' @@ -49,10 +46,11 @@ def read(*names, **kwargs): classifiers=[ 'Development Status :: 4 - Beta', 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3 :: Only', 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Operating System :: OS Independent', @@ -67,23 +65,13 @@ def read(*names, **kwargs): 'attribution', 'software', 'inventory', ], install_requires=[ - 'jinja2 >= 2.9, < 3.0', - + 'jinja2', 'click', - - "backports.csv ; python_version<'3.6'", - - # required by saneyaml - 'PyYAML >= 3.11, <=3.13', - 'saneyaml', - + 'saneyaml >= 0.5.2', 'boolean.py >= 3.5, < 4.0', 'license_expression >= 0.94', 'packageurl_python >= 0.9.0', ], - extras_require={ - ":python_version < '3.6'": ['backports.csv'], - }, entry_points={ 'console_scripts': [ 'about=attributecode.cmd:about', diff --git a/src/attributecode/__init__.py b/src/attributecode/__init__.py index 8f7ec999..2cd1034b 100644 --- a/src/attributecode/__init__.py +++ b/src/attributecode/__init__.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2020 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,29 +14,18 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - from collections import namedtuple import logging import os -try: - # Python 2 - unicode # NOQA -except NameError: # pragma: nocover - # Python 3 - unicode = str # NOQA - import saneyaml -__version__ = '5.1.0' +__version__ = '6.0.0' -__about_spec_version__ = '3.2.0' +__about_spec_version__ = '3.2.1' __copyright__ = """ -Copyright (c) 2013-2020 nexB Inc. All rights reserved. http://dejacode.org +Copyright (c) nexB Inc. All rights reserved. http://dejacode.org Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at @@ -53,12 +42,13 @@ class Error(namedtuple('Error', ['severity', 'message'])): """ An Error data with a severity and message. """ + def __new__(self, severity, message): if message: - if isinstance(message, unicode): + if isinstance(message, str): message = self._clean_string(message) else: - message = self._clean_string(unicode(repr(message), encoding='utf-8')) + message = self._clean_string(repr(message)) message = message.strip('"') return super(Error, self).__new__( @@ -116,7 +106,6 @@ def _clean_string(s): DEBUG = 10 NOTSET = 0 - severities = { CRITICAL : 'CRITICAL', ERROR : 'ERROR', diff --git a/src/attributecode/__main__.py b/src/attributecode/__main__.py index 32a0ce70..b1d85141 100644 --- a/src/attributecode/__main__.py +++ b/src/attributecode/__main__.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2017 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,11 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - - if __name__ == '__main__': # pragma: nocover from attributecode import cmd cmd.about() diff --git a/src/attributecode/api.py b/src/attributecode/api.py index 5eb4cef6..43531789 100644 --- a/src/attributecode/api.py +++ b/src/attributecode/api.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2017 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,30 +14,16 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - import json +from urllib.parse import quote +from urllib.parse import urlencode +from urllib.request import Request +from urllib.request import urlopen +from urllib.error import HTTPError + from attributecode import ERROR from attributecode import Error -from attributecode.util import python2 - - -if python2: # pragma: nocover - from urllib import quote # NOQA - from urllib import urlencode # NOQA - from urllib2 import HTTPError # NOQA - from urllib2 import Request # NOQA - from urllib2 import urlopen # NOQA -else: # pragma: nocover - from urllib.parse import quote # NOQA - from urllib.parse import urlencode # NOQA - from urllib.request import Request # NOQA - from urllib.request import urlopen # NOQA - from urllib.error import HTTPError # NOQA - """ API call helpers diff --git a/src/attributecode/attrib.py b/src/attributecode/attrib.py index 84ced633..b031045e 100644 --- a/src/attributecode/attrib.py +++ b/src/attributecode/attrib.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2020 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,10 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - import collections import datetime import io @@ -30,11 +26,11 @@ from attributecode import ERROR from attributecode import Error from attributecode.licenses import COMMON_LICENSES -from attributecode.model import detect_special_char, parse_license_expression +from attributecode.model import detect_special_char +from attributecode.model import parse_license_expression from attributecode.util import add_unc from attributecode.attrib_util import multi_sort - DEFAULT_TEMPLATE_FILE = os.path.join( os.path.dirname(os.path.realpath(__file__)), '../../templates', 'default_html.template') @@ -141,10 +137,10 @@ def generate(abouts, template=None, variables=None): lic_name_expression_list.append(license_key_and_license_name[segment]) else: lic_name_expression_list.append(segment) - + # Join the license name expression into a single string lic_name_expression = ' '.join(lic_name_expression_list) - + # Add the license name expression string into the about object about.license_name_expression = lic_name_expression @@ -186,6 +182,7 @@ def get_license_file_key(license_text_name): else: return license_text_name + def check_template(template_string): """ Check the syntax of a template. Return an error tuple (line number, diff --git a/src/attributecode/attrib_util.py b/src/attributecode/attrib_util.py index cf665905..689e0cbd 100644 --- a/src/attributecode/attrib_util.py +++ b/src/attributecode/attrib_util.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2018 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,17 +14,12 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - from jinja2 import Environment from jinja2.filters import environmentfilter from jinja2.filters import make_attrgetter from jinja2.filters import ignore_case from jinja2.filters import FilterArgumentError - """ Extra JINJA2 custom filters and other template utilities. """ diff --git a/src/attributecode/cmd.py b/src/attributecode/cmd.py index a88492a2..9ab989eb 100644 --- a/src/attributecode/cmd.py +++ b/src/attributecode/cmd.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2020 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,10 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - from collections import defaultdict from functools import partial import io @@ -26,8 +22,6 @@ import sys import click -# silence unicode literals warnings -click.disable_unicode_literals_warning = True from attributecode import WARNING from attributecode.util import unique @@ -46,9 +40,8 @@ from attributecode.util import filter_errors from attributecode.util import get_temp_dir - __copyright__ = """ - Copyright (c) 2013-2020 nexB Inc and others. All rights reserved. + Copyright (c) nexB Inc and others. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at @@ -59,10 +52,8 @@ See the License for the specific language governing permissions and limitations under the License.""" - prog_name = 'AboutCode-toolkit' - intro = '''%(prog_name)s version %(__version__)s ABOUT spec version: %(__about_spec_version__)s https://aboutcode.org @@ -70,7 +61,6 @@ ''' % locals() - def print_version(): click.echo('Running aboutcode-toolkit version ' + __version__) @@ -79,6 +69,7 @@ class AboutCommand(click.Command): """ An enhanced click Command working around some Click quirk. """ + def main(self, args=None, prog_name=None, complete_var=None, standalone_mode=True, **extra): """ @@ -102,11 +93,11 @@ def about(): Use about --help for help on a command. """ - ###################################################################### # option validators ###################################################################### + def validate_key_values(ctx, param, value): """ Return the a dict of {key: value} if valid or raise a UsageError @@ -133,11 +124,11 @@ def validate_extensions(ctx, param, value, extensions=tuple(('.csv', '.json',))) 'Invalid {param} file extension: must be one of: {msg}'.format(**locals())) return value - ###################################################################### # inventory subcommand ###################################################################### + @about.command(cls=AboutCommand, short_help='Collect the inventory of .ABOUT files to a CSV or JSON file.') @@ -168,7 +159,6 @@ def validate_extensions(ctx, param, value, extensions=tuple(('.csv', '.json',))) help='Show all error and warning messages.') @click.help_option('-h', '--help') - def inventory(location, output, format, quiet, verbose): # NOQA """ Collect the inventory of ABOUT file data as CSV or JSON. @@ -194,11 +184,11 @@ def inventory(location, output, format, quiet, verbose): # NOQA click.echo(msg) sys.exit(errors_count) - ###################################################################### # gen subcommand ###################################################################### + @about.command(cls=AboutCommand, short_help='Generate .ABOUT files from an inventory as CSV or JSON.') @@ -240,7 +230,6 @@ def inventory(location, output, format, quiet, verbose): # NOQA help='Show all error and warning messages.') @click.help_option('-h', '--help') - def gen(location, output, android, fetch_license, reference, quiet, verbose): """ Given a CSV/JSON inventory, generate ABOUT files in the output location. @@ -253,7 +242,7 @@ def gen(location, output, android, fetch_license, reference, quiet, verbose): print_version() click.echo('Generating .ABOUT files...') - #FIXME: This should be checked in the `click` + # FIXME: This should be checked in the `click` if not location.endswith(('.csv', '.json',)): raise click.UsageError('ERROR: Invalid input file extension: must be one .csv or .json.') @@ -273,11 +262,11 @@ def gen(location, output, android, fetch_license, reference, quiet, verbose): click.echo(msg) sys.exit(errors_count) - ###################################################################### # attrib subcommand ###################################################################### + def validate_template(ctx, param, value): if not value: return DEFAULT_TEMPLATE_FILE @@ -329,7 +318,6 @@ def validate_template(ctx, param, value): help='Show all error and warning messages.') @click.help_option('-h', '--help') - def attrib(location, output, template, vartext, quiet, verbose): """ Generate an attribution document at OUTPUT using .ABOUT files at LOCATION. @@ -371,11 +359,11 @@ def attrib(location, output, template, vartext, quiet, verbose): click.echo(msg) sys.exit(errors_count) - ###################################################################### # collect_redist_src subcommand ###################################################################### + @about.command(cls=AboutCommand, short_help='Collect redistributable sources.') @@ -392,7 +380,7 @@ def attrib(location, output, template, vartext, quiet, verbose): @click.option('--from-inventory', metavar='FILE', type=click.Path(exists=True, dir_okay=False, readable=True, resolve_path=True), - help='Path to an inventory CSV/JSON file as the base list for files/directories ' + help='Path to an inventory CSV/JSON file as the base list for files/directories ' 'that need to be copied which have the \'redistribute\' flagged.') @click.option('--with-structures', @@ -412,7 +400,6 @@ def attrib(location, output, template, vartext, quiet, verbose): help='Show all error and warning messages.') @click.help_option('-h', '--help') - def collect_redist_src(location, output, from_inventory, with_structures, zip, quiet, verbose): """ Collect sources that have 'redistribute' flagged as 'True' in .ABOUT files or inventory @@ -465,13 +452,13 @@ def collect_redist_src(location, output, from_inventory, with_structures, zip, q click.echo(msg) sys.exit(errors_count) - ###################################################################### # check subcommand ###################################################################### # FIXME: This is really only a dupe of the Inventory command + @about.command(cls=AboutCommand, short_help='Validate that the format of .ABOUT files is correct and report ' 'errors and warnings.') @@ -487,7 +474,6 @@ def collect_redist_src(location, output, from_inventory, with_structures, zip, q help='Show all error and warning messages.') @click.help_option('-h', '--help') - def check(location, verbose): """ Check .ABOUT file(s) at LOCATION for validity and print error messages. @@ -501,11 +487,11 @@ def check(location, verbose): severe_errors_count = report_errors(errors, quiet=False, verbose=verbose) sys.exit(severe_errors_count) - ###################################################################### # transform subcommand ###################################################################### + def print_config_help(ctx, param, value): if not value or ctx.resilient_parsing: return @@ -549,7 +535,6 @@ def print_config_help(ctx, param, value): help='Show all error and warning messages.') @click.help_option('-h', '--help') - def transform(location, output, configuration, quiet, verbose): # NOQA """ Transform the CSV/JSON file at LOCATION by applying renamings, filters and checks @@ -564,7 +549,6 @@ def transform(location, output, configuration, quiet, verbose): # NOQA from attributecode.transform import transform_json_to_json from attributecode.transform import Transformer - if not configuration: transformer = Transformer.default() else: @@ -590,11 +574,11 @@ def transform(location, output, configuration, quiet, verbose): # NOQA click.echo(msg) sys.exit(errors_count) - ###################################################################### # Error management ###################################################################### + def report_errors(errors, quiet, verbose, log_file_loc=None): """ Report the `errors` list of Error objects to screen based on the `quiet` and @@ -645,6 +629,7 @@ def get_error_messages(errors, quiet=False, verbose=False): # Misc ###################################################################### + def parse_key_values(key_values): """ Given a list of "key=value" strings, return: diff --git a/src/attributecode/gen.py b/src/attributecode/gen.py index fe5bc351..c1b5eb14 100644 --- a/src/attributecode/gen.py +++ b/src/attributecode/gen.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2020 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,14 +14,8 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - import codecs -from collections import OrderedDict -# FIXME: why posipath??? from posixpath import basename from posixpath import dirname from posixpath import exists @@ -55,7 +49,7 @@ def check_duplicated_columns(location): columns = [col for col in columns] seen = set() - dupes = OrderedDict() + dupes = dict() for col in columns: c = col.lower() if c in seen: @@ -78,6 +72,7 @@ def check_duplicated_columns(location): errors.append(Error(ERROR, msg)) return unique(errors) + def check_duplicated_about_resource(arp, arp_list): """ Return error for duplicated about_resource. @@ -88,6 +83,7 @@ def check_duplicated_about_resource(arp, arp_list): return Error(CRITICAL, msg) return '' + def check_newline_in_file_field(component): """ Return a list of errors for newline characters detected in *_file fields. @@ -104,10 +100,11 @@ def check_newline_in_file_field(component): pass return errors + def check_about_resource_filename(arp): """ Return error for invalid/non-support about_resource's filename or - empty string if no error is found. + empty string if no error is found. """ if invalid_chars(arp): msg = ("Invalid characters present in 'about_resource' " @@ -115,6 +112,7 @@ def check_about_resource_filename(arp): return (Error(CRITICAL, msg)) return '' + # TODO: this should be either the CSV or the ABOUT files but not both??? def load_inventory(location, base_dir, reference_dir=None): """ @@ -219,9 +217,11 @@ def load_inventory(location, base_dir, reference_dir=None): return unique(errors), abouts + def update_about_resource(self): pass + def generate(location, base_dir, android=None, reference_dir=None, fetch_license=False): """ Load ABOUT data from a CSV inventory at `location`. Write ABOUT files to @@ -281,7 +281,7 @@ def generate(location, base_dir, android=None, reference_dir=None, fetch_license try: # Generate value for 'about_resource' if it does not exist if not about.about_resource.value: - about.about_resource.value = OrderedDict() + about.about_resource.value = dict() about_resource_value = '' if about.about_file_path.endswith('/'): about_resource_value = u'.' diff --git a/src/attributecode/licenses.py b/src/attributecode/licenses.py index 300fc8b6..9280ab84 100644 --- a/src/attributecode/licenses.py +++ b/src/attributecode/licenses.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2017 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,10 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - # Common license keys COMMON_LICENSES = ( 'aes-128-3.0', diff --git a/src/attributecode/model.py b/src/attributecode/model.py index b44ad4be..10ca0e6e 100644 --- a/src/attributecode/model.py +++ b/src/attributecode/model.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2020 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -24,32 +24,20 @@ components inventories. """ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - -from collections import OrderedDict import io import json import os -# FIXME: why posixpath??? import posixpath import traceback - -from attributecode.util import python2, to_posix - -if python2: # pragma: nocover - from itertools import izip_longest as zip_longest # NOQA - from urlparse import urljoin, urlparse # NOQA - from urllib2 import urlopen, Request, HTTPError # NOQA -else: # pragma: nocover - basestring = str # NOQA - from itertools import zip_longest # NOQA - from urllib.parse import urljoin, urlparse # NOQA - from urllib.request import urlopen, Request # NOQA - from urllib.error import HTTPError # NOQA +from itertools import zip_longest +from urllib.parse import urljoin +from urllib.parse import urlparse +from urllib.request import urlopen +from urllib.request import Request +from urllib.error import HTTPError from license_expression import Licensing +from packageurl import PackageURL from attributecode import __version__ from attributecode import CRITICAL @@ -76,10 +64,9 @@ from attributecode.util import ungroup_licenses from attributecode.util import unique -from packageurl import PackageURL - genereated_tk_version = "# Generated with AboutCode Toolkit Version %s \n\n" % __version__ + class Field(object): """ An ABOUT file field. The initial value is a string. Subclasses can and @@ -90,7 +77,7 @@ def __init__(self, name=None, value=None, required=False, present=False): # normalized names are lowercased per specification self.name = name # save this and do not mutate it afterwards - if isinstance(value, basestring): + if isinstance(value, str): self.original_value = value elif value: self.original_value = repr(value) @@ -139,7 +126,7 @@ def validate(self, *args, **kwargs): else: # present fields with content go through validation... # first trim any trailing spaces on each line - if isinstance(self.original_value, basestring): + if isinstance(self.original_value, str): value = '\n'.join(s.rstrip() for s in self.original_value.splitlines(False)) # then strip leading and trailing spaces @@ -239,6 +226,7 @@ class StringField(Field): A field containing a string value possibly on multiple lines. The validated value is a string. """ + def _validate(self, *args, **kwargs): errors = super(StringField, self)._validate(*args, ** kwargs) no_special_char_field = ['license_expression', 'license_key', 'license_name'] @@ -286,9 +274,10 @@ class SingleLineField(StringField): A field containing a string value on a single line. The validated value is a string. """ + def _validate(self, *args, **kwargs): errors = super(SingleLineField, self)._validate(*args, ** kwargs) - if self.value and isinstance(self.value, basestring) and '\n' in self.value: + if self.value and isinstance(self.value, str) and '\n' in self.value: name = self.name value = self.original_value msg = (u'Field %(name)s: Cannot span multiple lines: %(value)s' @@ -302,6 +291,7 @@ class ListField(StringField): A field containing a list of string values, one per line. The validated value is a list. """ + def default_value(self): return [] @@ -311,7 +301,7 @@ def _validate(self, *args, **kwargs): # reset self.value = [] - if isinstance(self.original_value, basestring): + if isinstance(self.original_value, str): values = self.original_value.splitlines(False) elif isinstance(self.original_value, list): values = self.original_value @@ -319,7 +309,7 @@ def _validate(self, *args, **kwargs): values = [repr(self.original_value)] for val in values: - if isinstance(val, basestring): + if isinstance(val, str): val = val.strip() if not val: name = self.name @@ -364,10 +354,12 @@ def __eq__(self, other): if sval == oval: return True + class PackageUrlField(StringField): """ A Package URL field. The validated value is a purl. """ + def _validate(self, *args, **kwargs): """ Check that Package URL is valid. Return a list of errors. @@ -390,10 +382,12 @@ def is_valid_purl(purl): except: return False + class UrlListField(ListField): """ A URL field. The validated value is a list of URLs. """ + def _validate(self, *args, **kwargs): """ Check that URLs are valid. Return a list of errors. @@ -421,6 +415,7 @@ class UrlField(StringField): """ A URL field. The validated value is a URL. """ + def _validate(self, *args, **kwargs): """ Check that URL is valid. Return a list of errors. @@ -449,6 +444,7 @@ class PathField(ListField): The validated value is an ordered dict of path->location or None. The paths can also be resolved """ + def default_value(self): return {} @@ -471,12 +467,12 @@ def _validate(self, *args, **kwargs): name = self.name - # Why is the PathField an ordered dict? - # Ans: The reason why the PathField use an ordered dict is because - # for the FileTextField, the key is used as the path to the file and - # the value is used as the context of the file + # Why are paths a dict? + # Ans: The reason why the PathField use a dict is because + # for the FileTextField, the key is used as the path to the file and + # the value is used as the context of the file # dict of normalized paths to a location or None - paths = OrderedDict() + paths = {} for path_value in self.value: p = path_value.split(',') @@ -488,11 +484,11 @@ def _validate(self, *args, **kwargs): # and a succession of one or more ////// to . too if path.strip() and not path.strip(posixpath.sep): path = '.' - + # removing leading and trailing path separator # path are always relative path = path.strip(posixpath.sep) - + # the license files, if need to be copied, are located under the path # set from the 'license-text-location' option, so the tool should check # at the 'license-text-location' instead of the 'base_dir' @@ -503,7 +499,7 @@ def _validate(self, *args, **kwargs): location = None paths[path] = location continue - + if self.reference_dir: location = posixpath.join(self.reference_dir, path) else: @@ -512,7 +508,7 @@ def _validate(self, *args, **kwargs): if not self.running_inventory and self.about_file_path: # Get the parent directory of the 'about_file_path' afp_parent = posixpath.dirname(self.about_file_path) - + # Create a relative 'about_resource' path by joining the # parent of the 'about_file_path' with the value of the # 'about_resource' @@ -521,12 +517,12 @@ def _validate(self, *args, **kwargs): location = posixpath.join(self.base_dir, normalized_arp) else: location = posixpath.join(self.base_dir, path) - + location = util.to_native(location) location = os.path.abspath(os.path.normpath(location)) location = util.to_posix(location) location = add_unc(location) - + if not os.path.exists(location): # We don't want to show the UNC_PREFIX in the error message location = util.to_posix(location.strip(UNC_PREFIX)) @@ -538,7 +534,7 @@ def _validate(self, *args, **kwargs): else: errors.append(Error(CRITICAL, msg)) location = None - + paths[path] = location self.value = paths @@ -550,6 +546,7 @@ class AboutResourceField(PathField): Special field for about_resource. self.resolved_paths contains a list of the paths resolved relative to the about file path. """ + def __init__(self, *args, ** kwargs): super(AboutResourceField, self).__init__(*args, ** kwargs) self.resolved_paths = [] @@ -558,12 +555,14 @@ def _validate(self, *args, **kwargs): errors = super(AboutResourceField, self)._validate(*args, ** kwargs) return errors + class FileTextField(PathField): """ A path field pointing to one or more text files such as license files. The validated value is an ordered dict of path->Text or None if no location or text could not be loaded. """ + def _validate(self, *args, **kwargs): """ Load and validate the texts referenced by paths fields. Return a list @@ -598,10 +597,12 @@ def _validate(self, *args, **kwargs): self.errors = errors return errors + class BooleanField(SingleLineField): """ An flag field with a boolean value. Validated value is False, True or None. """ + def default_value(self): return None @@ -650,7 +651,7 @@ def get_flag(self, value): if isinstance(value, bool): return value else: - if isinstance(value, basestring): + if isinstance(value, str): value = value.strip() if not value: return None @@ -732,9 +733,9 @@ class About(object): # name of the attribute containing the resolved relative Resources paths about_resource_path_attr = 'about_resource_path' - + # name of the attribute containing the resolved relative Resources paths - ABOUT_RESOURCE_ATTR = 'about_resource' + ABOUT_RESOURCE_ATTR = 'about_resource' # Required fields required_fields = ['name', ABOUT_RESOURCE_ATTR] @@ -748,7 +749,7 @@ def set_standard_fields(self): could use a metaclass to track ordering django-like but this approach is simpler. """ - self.fields = OrderedDict([ + self.fields = dict([ ('about_resource', AboutResourceField(required=True)), ('name', SingleLineField(required=True)), ('version', SingleLineField()), @@ -808,7 +809,7 @@ def __init__(self, location=None, about_file_path=None, strict=False): attribute contains the errors. """ self.set_standard_fields() - self.custom_fields = OrderedDict() + self.custom_fields = {} self.errors = [] @@ -848,7 +849,7 @@ def as_dict(self): Return all the standard fields and customer-defined fields of this About object in an ordered dict. """ - data = OrderedDict() + data = {} data[self.ABOUT_FILE_PATH_ATTR] = self.about_file_path with_values = ((fld.name, fld.serialized_value()) for fld in self.all_fields()) non_empty = ((name, value) for name, value in with_values if value) @@ -862,7 +863,7 @@ def hydrate(self, fields): Return a list of errors. """ errors = [] - seen_fields = OrderedDict() + seen_fields = {} for name, value in fields: orig_name = name @@ -1054,7 +1055,7 @@ def dumps(self, licenses_dict=None): """ Return self as a formatted ABOUT string. """ - data = OrderedDict() + data = {} # Group the same license information (name, url, file) together license_key = [] license_name = [] @@ -1103,12 +1104,12 @@ def dumps(self, licenses_dict=None): data[field.name] = field.value # Group the same license information in a list - # This `licenses_dict` is a dictionary with license key as the key and the + # This `licenses_dict` is a dictionary with license key as the key and the # value is the list of [license_name, license_context, license_url] lic_key_copy = license_key[:] lic_dict_list = [] for lic_key in license_key: - lic_dict = OrderedDict() + lic_dict = {} if licenses_dict and lic_key in licenses_dict: lic_dict['key'] = lic_key lic_name = licenses_dict[lic_key][0] @@ -1118,7 +1119,7 @@ def dumps(self, licenses_dict=None): lic_dict['name'] = lic_name lic_dict['file'] = lic_file lic_dict['url'] = lic_url - + # Remove the license information if it has been handled lic_key_copy.remove(lic_key) if lic_name in license_name: @@ -1132,7 +1133,7 @@ def dumps(self, licenses_dict=None): # Handle license information that have not been handled. license_group = list(zip_longest(lic_key_copy, license_name, license_file, license_url)) for lic_group in license_group: - lic_dict = OrderedDict() + lic_dict = {} if lic_group[0]: lic_dict['key'] = lic_group[0] if lic_group[1]: @@ -1360,7 +1361,7 @@ def get_copy_list(abouts, location): Return a list of files/directories that need to be copied (and error if any) This is a summary list in a sense that if a directory is already in the list, its children directories/files will not be included in the list regardless if - they have 'redistribute' flagged. The reason for this is we want to capture + they have 'redistribute' flagged. The reason for this is we want to capture the error/warning if existence files/directories already exist. However, if we don't have this "summarized" list, and we've copied a file (with directory structure) and then later on this file's parent directory also need to be copied, then @@ -1440,6 +1441,7 @@ def get_copy_list(abouts, location): return copy_list, errors + def about_object_to_list_of_dictionary(abouts): """ Convert About objects to a list of dictionaries @@ -1448,9 +1450,9 @@ def about_object_to_list_of_dictionary(abouts): for about in abouts: # Restore the *_file value to the original value # The *_file's original_value may be parsed (i.e. split(',)) - # for validation purpose. + # for validation purpose. about.license_file.value = about.license_file.original_value - about.notice_file.value = about.notice_file.original_value + about.notice_file.value = about.notice_file.original_value about.changelog_file.value = about.changelog_file.original_value about.author_file.value = about.author_file.original_value @@ -1469,9 +1471,9 @@ def about_object_to_list_of_dictionary(abouts): for resource in about_resource: updated_about_resource = posixpath.normpath(posixpath.join(afp_parent, resource)) if resource == u'.': - if not updated_about_resource == '/': + if not updated_about_resource == '/': updated_about_resource = updated_about_resource + '/' - ad['about_resource'] = OrderedDict([(updated_about_resource, None)]) + ad['about_resource'] = dict([(updated_about_resource, None)]) del ad['about_file_path'] serialized.append(ad) except Exception as e: @@ -1496,10 +1498,7 @@ def write_output(abouts, location, format): # NOQA def save_as_json(location, about_dicts): - mode = 'w' - if python2: - mode = 'wb' - with io.open(location, mode=mode) as output_file: + with io.open(location, mode='w') as output_file: data = util.format_about_dict_for_json_output(about_dicts) output_file.write(json.dumps(data, indent=2)) return [] diff --git a/src/attributecode/transform.py b/src/attributecode/transform.py index ae0e95ed..793a45b1 100644 --- a/src/attributecode/transform.py +++ b/src/attributecode/transform.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2020 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -13,14 +13,10 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - -from collections import Counter -from collections import OrderedDict import io import json +from collections import Counter +from itertools import zip_longest import attr @@ -28,16 +24,9 @@ from attributecode import Error from attributecode import saneyaml from attributecode.util import csv -from attributecode.util import python2 from attributecode.util import replace_tab_with_spaces -if python2: # pragma: nocover - from itertools import izip_longest as zip_longest # NOQA -else: # pragma: nocover - from itertools import zip_longest # NOQA - - def transform_csv_to_csv(location, output, transformer): """ Read a CSV file at `location` and write a new CSV file at `output`. Apply @@ -62,7 +51,7 @@ def transform_csv_to_csv(location, output, transformer): return field_names, [], errors # Convert to dicts - new_data = [OrderedDict(zip_longest(field_names, item)) for item in data] + new_data = [dict(zip_longest(field_names, item)) for item in data] field_names, updated_data, errors = transform_data(new_data, transformer) @@ -86,7 +75,7 @@ def transform_json_to_json(location, output, transformer): data = normalize_dict_data(items) new_data = strip_trailing_fields_json(data) - field_names, updated_data, errors = transform_data(new_data, transformer) + _field_names, updated_data, errors = transform_data(new_data, transformer) if errors: return errors @@ -94,6 +83,7 @@ def transform_json_to_json(location, output, transformer): write_json(output, updated_data) return [] + def strip_trailing_fields_csv(names): """ Strip trailing spaces for field names #456 @@ -110,13 +100,14 @@ def strip_trailing_fields_json(items): """ data = [] for item in items: - od = OrderedDict() + od = {} for field in item: stripped_field_name = field.strip() od[stripped_field_name] = item[field] data.append(od) return data + def normalize_dict_data(data): """ Check if the input data from scancode-toolkit and normalize to a normal @@ -126,7 +117,7 @@ def normalize_dict_data(data): try: # Check if this is a JSON output from scancode-toolkit if(data["headers"][0]["tool_name"] == "scancode-toolkit"): - #only takes data inside "files" + # only takes data inside "files" new_data = data["files"] except: new_data = data @@ -305,7 +296,7 @@ def apply_renamings(self, data): renamed_list = [] for row in data: - renamed = OrderedDict() + renamed = {} for key in row: matched = False for renamed_key in renamings: @@ -326,29 +317,28 @@ def clean_fields(self, field_names): return field_names return [c.strip().lower() for c in field_names] """ + def filter_fields(self, data): """ Yield transformed dicts from a `data` list of dicts keeping only fields with a name in the `field_filters`of this Transformer. Return the data unchanged if no `field_filters` exists. """ - #field_filters = set(self.clean_fields(self.field_filters)) + # field_filters = set(self.clean_fields(self.field_filters)) field_filters = set(self.field_filters) for entry in data: - items = ((k, v) for k, v in entry.items() if k in field_filters) - yield OrderedDict(items) + yield {k: v for k, v in entry.items() if k in field_filters} def filter_excluded(self, data): """ - Yield transformed dicts from a `data` list of dicts excluding + Yield transformed dicts from a `data` list of dicts excluding fields with names in the `exclude_fields`of this Transformer. Return the data unchanged if no `exclude_fields` exists. """ - #exclude_fields = set(self.clean_fields(self.exclude_fields)) + # exclude_fields = set(self.clean_fields(self.exclude_fields)) exclude_fields = set(self.exclude_fields) for entry in data: - items = ((k, v) for k, v in entry.items() if k not in exclude_fields) - yield OrderedDict(items) + yield {k: v for k, v in entry.items() if k not in exclude_fields} def check_duplicate_fields(field_names): @@ -375,8 +365,7 @@ def read_json(location): Yield rows (as a list of values) from a CSV file at `location`. """ with io.open(location, encoding='utf-8', errors='replace') as jsonfile: - data = json.load(jsonfile, object_pairs_hook=OrderedDict) - return data + return json.load(jsonfile) def write_csv(location, data, field_names): # NOQA diff --git a/src/attributecode/util.py b/src/attributecode/util.py index e9fded6d..0317afe2 100644 --- a/src/attributecode/util.py +++ b/src/attributecode/util.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2013-2019 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -13,12 +13,8 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - import codecs -from collections import OrderedDict +import csv import json import ntpath import os @@ -27,36 +23,20 @@ import shutil import string import sys - from distutils.dir_util import copy_tree +from itertools import zip_longest from attributecode import CRITICAL from attributecode import WARNING from attributecode import Error - -python2 = sys.version_info[0] < 3 - -if python2: # pragma: nocover - from itertools import izip_longest as zip_longest # NOQA -else: # pragma: nocover - from itertools import zip_longest # NOQA - -if python2: # pragma: nocover - from backports import csv # NOQA - # monkey patch backports.csv until bug is fixed - # https://github.com/ryanhiebert/backports.csv/issues/30 - csv.dict = OrderedDict -else: # pragma: nocover - import csv # NOQA - - on_windows = 'win32' in sys.platform # boolean field name boolean_fields = ['redistribute', 'attribute', 'track_change', 'modified', 'internal_use_only'] file_fields = ['about_resource', 'notice_file', 'changelog_file', 'author_file'] + def to_posix(path): """ Return a path using the posix path separator given a path that may contain @@ -128,6 +108,7 @@ def check_file_names(paths): seen[path] = orig_path return errors + def wrap_boolean_value(context): updated_context = '' for line in context.splitlines(): @@ -143,6 +124,7 @@ def wrap_boolean_value(context): updated_context += line + '\n' return updated_context + def replace_tab_with_spaces(context): updated_context = '' for line in context.splitlines(): @@ -152,6 +134,7 @@ def replace_tab_with_spaces(context): updated_context += line.replace('\t', ' ') + '\n' return updated_context + # TODO: rename to normalize_path def get_absolute(location): """ @@ -193,6 +176,7 @@ def get_about_locations(location): if is_about_file(loc): yield loc + def norm(p): """ Normalize the path @@ -269,7 +253,6 @@ def resource_name(path): return right.strip() - def load_csv(location): """ Read CSV at `location`, return a list of ordered dictionaries, one @@ -281,9 +264,7 @@ def load_csv(location): errors='ignore') as csvfile: for row in csv.DictReader(csvfile): # convert all the column keys to lower case - updated_row = OrderedDict( - [(key.lower(), value) for key, value in row.items()] - ) + updated_row = {key.lower(): value for key, value in row.items()} results.append(updated_row) return results @@ -293,52 +274,9 @@ def load_json(location): Read JSON file at `location` and return a list of ordered dicts, one for each entry. """ - # FIXME: IMHO we should know where the JSON is from and its shape - # FIXME use: object_pairs_hook=OrderedDict with open(location) as json_file: results = json.load(json_file) - # If the loaded JSON is not a list, - # - JSON output from AboutCode Manager: - # look for the "components" field as it is the field - # that contain everything the tool needs and ignore other fields. - # For instance, - # { - # "aboutcode_manager_notice":"xyz", - # "aboutcode_manager_version":"xxx", - # "components": - # [{ - # "license_expression":"apache-2.0", - # "copyright":"Copyright (c) 2017 nexB Inc.", - # "path":"ScanCode", - # ... - # }] - # } - # - # - JSON output from ScanCode: - # look for the "files" field as it is the field - # that contain everything the tool needs and ignore other fields: - # For instance, - # { - # "scancode_notice":"xyz", - # "scancode_version":"xxx", - # "files": - # [{ - # "path": "test", - # "type": "directory", - # "name": "test", - # ... - # }] - # } - # - # - JSON file that is not produced by scancode or aboutcode toolkit - # For instance, - # { - # "path": "test", - # "type": "directory", - # "name": "test", - # ... - # } # FIXME: this is too clever and complex... IMHO we should not try to guess the format. # instead a command line option should be provided explictly to say what is the format if isinstance(results, list): @@ -359,10 +297,7 @@ def have_network_connection(): Return True if an HTTP connection to some public web site is possible. """ import socket - if python2: - import httplib # NOQA - else: - import http.client as httplib # NOQA + import http.client as httplib http_connection = httplib.HTTPConnection('dejacode.org', timeout=10) # NOQA try: @@ -445,9 +380,9 @@ def copy_license_notice_files(fields, base_dir, reference_dir, afp): if value: # This is to handle multiple license_file value in CSV format # The following code will construct a list to contain the - # license file(s) that need to be copied. + # license file(s) that need to be copied. # Note that *ONLY* license_file field allows \n. Others file - # fields that have \n will prompts error at validation stage + # fields that have \n will prompts error at validation stage file_list = [] if '\n' in value: f_list = value.split('\n') @@ -550,7 +485,7 @@ def ungroup_licenses(licenses): def format_about_dict_for_csv_output(about_dictionary_list): csv_formatted_list = [] for element in about_dictionary_list: - row_list = OrderedDict() + row_list = dict() for key in element: if element[key]: if isinstance(element[key], list): @@ -568,7 +503,7 @@ def format_about_dict_for_json_output(about_dictionary_list): licenses = ['license_key', 'license_name', 'license_file', 'license_url'] json_formatted_list = [] for element in about_dictionary_list: - row_list = OrderedDict() + row_list = dict() # FIXME: aboid using parallel list... use an object instead license_key = [] license_name = [] @@ -597,7 +532,7 @@ def format_about_dict_for_json_output(about_dictionary_list): if license_group: licenses_list = [] for lic_group in license_group: - lic_dict = OrderedDict() + lic_dict = dict() if lic_group[0]: lic_dict['key'] = lic_group[0] if lic_group[1]: @@ -672,7 +607,6 @@ def build_temp_dir(prefix='attributecode-'): create_dir(location) return location - """ Return True if a string s name is safe to use as an attribute name. """ diff --git a/tests/test_api.py b/tests/test_api.py index 60764879..d85f367d 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2014-2017 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -13,11 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================ - -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - import unittest import mock diff --git a/tests/test_attrib.py b/tests/test_attrib.py index fd3b4403..15b18a0b 100644 --- a/tests/test_attrib.py +++ b/tests/test_attrib.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2014-2019 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,10 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - import io import os import unittest @@ -28,6 +24,7 @@ from attributecode import attrib from attributecode import model + class TemplateTest(unittest.TestCase): def test_check_template_simple_valid_returns_None(self): @@ -125,6 +122,7 @@ def test_lic_key_name_sync(self): assert f1 == f2 + def remove_timestamp(html_text): """ Return the `html_text` generated attribution stripped from timestamps: the diff --git a/tests/test_cmd.py b/tests/test_cmd.py index 80ebad99..fda7405f 100644 --- a/tests/test_cmd.py +++ b/tests/test_cmd.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2014-2019 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,10 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - import io import unittest @@ -35,9 +31,9 @@ from testing_utils import get_temp_dir from testing_utils import get_temp_file - # NB: the test_report_errors* tests depend on py.test stdout/err capture capabilities + def test_report_errors(capsys): errors = [ Error(CRITICAL, 'msg1'), @@ -117,6 +113,7 @@ def test_report_errors_with_quiet_ignores_verbose_flag2(capsys): assert '' == out assert '' == err + def test_report_errors_with_verbose_flag(capsys): errors = [ Error(CRITICAL, 'msg1'), @@ -248,6 +245,7 @@ def test_get_error_messages_verbose(): class TestFilterError(unittest.TestCase): + def test_filter_errors_default(self): errors = [ Error(CRITICAL, 'msg1'), @@ -264,7 +262,6 @@ def test_filter_errors_default(self): ] assert expected == cmd.filter_errors(errors) - def test_filter_errors_with_min(self): errors = [ Error(CRITICAL, 'msg1'), @@ -279,7 +276,6 @@ def test_filter_errors_with_min(self): ] assert expected == cmd.filter_errors(errors, CRITICAL) - def test_filter_errors_no_errors(self): errors = [ Error(INFO, 'msg3'), @@ -288,7 +284,6 @@ def test_filter_errors_no_errors(self): ] assert [] == cmd.filter_errors(errors) - def test_filter_errors_none(self): assert [] == cmd.filter_errors([]) @@ -299,7 +294,6 @@ def test_parse_key_values_empty(self): assert ({}, []) == cmd.parse_key_values([]) assert ({}, []) == cmd.parse_key_values(None) - def test_parse_key_values_simple(self): test = [ 'key=value', @@ -314,7 +308,6 @@ def test_parse_key_values_simple(self): assert expected == keyvals assert not errors - def test_parse_key_values_with_errors(self): test = [ 'key', @@ -334,11 +327,11 @@ def test_parse_key_values_with_errors(self): ] assert expected == errors - ############################################################################### # Run full cli command ############################################################################### + def check_about_stdout(options, expected_loc, regen=False): """ Run the about command with the `options` list of options. Assert that diff --git a/tests/test_gen.py b/tests/test_gen.py index 06a234a8..2a6af169 100644 --- a/tests/test_gen.py +++ b/tests/test_gen.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2014-2019 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,11 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - -from collections import OrderedDict import unittest from testing_utils import get_temp_dir @@ -33,6 +28,7 @@ class GenTest(unittest.TestCase): + def test_check_duplicated_columns(self): test_file = get_test_loc('test_gen/dup_keys.csv') expected = [Error(ERROR, 'Duplicated column name(s): copyright with copyright\nPlease correct the input and re-run.')] @@ -152,7 +148,7 @@ def test_generation_with_no_about_resource(self): location = get_test_loc('test_gen/inv2.csv') base_dir = get_temp_dir() errors, abouts = gen.generate(location, base_dir) - expected = OrderedDict([('.', None)]) + expected = dict([('.', None)]) assert abouts[0].about_resource.value == expected assert len(errors) == 1 @@ -161,7 +157,7 @@ def test_generation_with_no_about_resource_reference(self): base_dir = get_temp_dir() errors, abouts = gen.generate(location, base_dir) - expected = OrderedDict([('test.tar.gz', None)]) + expected = dict([('test.tar.gz', None)]) assert abouts[0].about_resource.value == expected assert len(errors) == 1 @@ -173,7 +169,7 @@ def test_generation_with_no_about_resource_reference_no_resource_validation(self base_dir = get_temp_dir() errors, abouts = gen.generate(location, base_dir) - expected = OrderedDict([('test.tar.gz', None)]) + expected = dict([('test.tar.gz', None)]) assert abouts[0].about_resource.value == expected assert len(errors) == 1 @@ -294,7 +290,6 @@ def test_generate_license_key_with_custom_file_450_with_fetch(self): ) assert expected == result - def test_generate_license_key_with_custom_file_450_with_fetch_with_order(self): location = get_test_loc('test_gen/lic_issue_450/custom_and_valid_lic_key_with_file.csv') base_dir = get_temp_dir() @@ -380,4 +375,4 @@ def test_boolean_value_not_lost(self): u'redistribute: yes\n' u'attribute: yes\n' u'modified: no\n') - assert expected == in_mem_result \ No newline at end of file + assert expected == in_mem_result diff --git a/tests/test_model.py b/tests/test_model.py index 67b9bcba..3caa6a89 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2014-2020 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,11 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - -from collections import OrderedDict import io import json import os @@ -45,13 +40,6 @@ from testing_utils import get_temp_file from testing_utils import get_test_loc -try: - # Python 2 - unicode # NOQA -except NameError: # pragma: nocover - # Python 3 - unicode = str # NOQA - def check_csv(expected, result, regen=False, fix_cell_linesep=False): """ @@ -78,7 +66,7 @@ def fix_crlf(items): This is fixing this until we find can why """ for key, value in items: - if isinstance(value, unicode) and '\r\n' in value: + if isinstance(value, str) and '\r\n' in value: value = value.replace('\r\n', '\n') yield key, value @@ -88,9 +76,9 @@ def check_json(expected, result): Assert that the contents of two JSON files are equal. """ with open(expected) as e: - expected = json.load(e, object_pairs_hook=OrderedDict) + expected = json.load(e, object_pairs_hook=dict) with open(result) as r: - result = json.load(r, object_pairs_hook=OrderedDict) + result = json.load(r, object_pairs_hook=dict) assert expected == result @@ -110,6 +98,7 @@ def get_unicode_content(location): class FieldTest(unittest.TestCase): + def test_Field_init(self): model.Field() model.StringField() @@ -237,7 +226,7 @@ def test_PathField_contains_stripped_strings_after_validate(self): def test_PathField_contains_dict_after_validate(self): value = 'string' field_class = model.PathField - expected = OrderedDict([('string', None)]) + expected = dict([('string', None)]) expected_errors = [ Error(ERROR, 'Field s: Unable to verify path: string: No base directory provided') ] @@ -254,6 +243,7 @@ def test_SingleLineField_has_errors_if_multiline(self): class YamlParseTest(unittest.TestCase): maxDiff = None + def test_saneyaml_load_can_parse_simple_fields(self): test = get_test_content('test_model/parse/basic.about') result = saneyaml.load(test) @@ -388,6 +378,7 @@ def test_saneyaml_loads_blank_lines_and_lines_without_no_colon(self): except Exception: pass + class AboutTest(unittest.TestCase): def test_About_load_ignores_original_field_order_and_uses_standard_predefined_order(self): @@ -411,7 +402,6 @@ def test_About_duplicate_field_names_are_detected_with_different_case(self): Error(WARNING, 'Field Name is a duplicate. Original value: "old" replaced with: "new"') ] - result = a.errors assert sorted(expected) == sorted(result) @@ -688,7 +678,7 @@ def test_get_field_names_does_not_return_duplicates_custom_fields(self): def test_comma_in_license(self): test_file = get_test_loc('test_model/special_char/about.ABOUT') a = model.About(test_file) - expected = Error(ERROR, "The following character(s) cannot be in the license_key: [',']") + expected = Error(ERROR, "The following character(s) cannot be in the license_key: [',']") assert a.errors[0] == expected def test_load_dict_issue_433(self): @@ -701,7 +691,7 @@ def test_load_dict_issue_433(self): 'notice_file': 'package1.zip.NOTICE', 'licenses': [ {'key': 'license1', 'name': 'License1', 'file': 'license1.LICENSE', 'url': 'some_url'}, - {'key': 'license2', 'name': 'License2', 'file': 'license2.LICENSE','url': 'some_url'}, + {'key': 'license2', 'name': 'License2', 'file': 'license2.LICENSE', 'url': 'some_url'}, ], } about = model.About() @@ -726,7 +716,9 @@ def test_load_dict_issue_433(self): lic_dict = {u'license1': [u'License1', u'', u'some_url'], u'license2' : [u'License2', u'', u'some_url']} assert about.dumps(lic_dict) == expected + class SerializationTest(unittest.TestCase): + def test_About_dumps(self): test_file = get_test_loc('test_model/dumps/about.ABOUT') a = model.About(test_file) @@ -881,7 +873,7 @@ def test_as_dict_load_dict_ignores_empties(self): expected = { 'about_file_path': None, - 'about_resource': OrderedDict([('.', None)]), + 'about_resource': dict([('.', None)]), 'copyright': 'Copyright (c) 2013-2014 nexB Inc.', 'custom1': 'some custom', 'description': 'AboutCode is a tool\nfor files.', @@ -917,7 +909,7 @@ def test_load_dict_as_dict_is_idempotent_ignoring_special(self): expected = { 'about_file_path': None, - 'about_resource': OrderedDict([('.', None)]), + 'about_resource': dict([('.', None)]), 'attribute': 'yes', 'author': 'Jillian Daguil, Chin Yeung Li, Philippe Ombredanne, Thomas Druez', 'copyright': 'Copyright (c) 2013-2014 nexB Inc.', @@ -953,7 +945,7 @@ def test_about_model_class_from_dict_constructor(self): about_data.update({ 'about_file_path': None, - 'about_resource': OrderedDict([('.', None)]), + 'about_resource': dict([('.', None)]), }) assert about_data == about.as_dict() @@ -1026,6 +1018,7 @@ def test_android_notice(self): ''' assert notice_context == expected_notice + class CollectorTest(unittest.TestCase): def test_collect_inventory_return_errors(self): @@ -1229,7 +1222,7 @@ def test_copy_redist_src_no_structure(self): with_structure = False err = model.copy_redist_src(copy_list, test_loc, output, with_structure) - + assert err == [] from os import listdir @@ -1273,6 +1266,7 @@ def test_get_copy_list(self): else: assert copy_list == expected + class FetchLicenseTest(unittest.TestCase): @mock.patch.object(model, 'urlopen') diff --git a/tests/test_transform.py b/tests/test_transform.py index 6423d07d..61a8c24f 100644 --- a/tests/test_transform.py +++ b/tests/test_transform.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2014-2020 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,22 +14,11 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - from collections import OrderedDict import unittest -from testing_utils import get_temp_dir from testing_utils import get_test_loc -from attributecode import ERROR -from attributecode import INFO -from attributecode import CRITICAL -from attributecode import Error -from attributecode import gen - from attributecode.transform import check_duplicate_fields from attributecode.transform import read_json from attributecode.transform import transform_data @@ -38,14 +27,9 @@ from attributecode.transform import strip_trailing_fields_json from attributecode.transform import Transformer -from attributecode.util import python2 - -if python2: # pragma: nocover - from itertools import izip_longest as zip_longest # NOQA -else: # pragma: nocover - from itertools import zip_longest # NOQA class TransformTest(unittest.TestCase): + def test_transform_data_new_col(self): data = [OrderedDict([(u'Directory/Filename', u'/tmp/test.c'), (u'Component', u'test.c'), (u'version', '1'), (u'notes', u'test'), (u'temp', u'foo')])] @@ -54,11 +38,11 @@ def test_transform_data_new_col(self): field_name, data, err = transform_data(data, transformer) - expect_name = [u'path',u'about_resource', u'name',u'version',u'notes',u'temp'] + expect_name = [u'path', u'about_resource', u'name', u'version', u'notes', u'temp'] expected_data = [dict(OrderedDict([(u'path', u'/tmp/test.c'), (u'about_resource', u'/tmp/test.c'), (u'name', u'test.c'), (u'version', u'1'), - (u'notes', u'test'),(u'temp', u'foo')]))] + (u'notes', u'test'), (u'temp', u'foo')]))] assert len(field_name) == len(expect_name) for name in field_name: assert name in expect_name @@ -113,7 +97,7 @@ def test_normalize_dict_data_scancode(self): (u'name', u'samples'), (u'base_name', u'samples'), (u'extension', u''), (u'size', 0), - (u'date', None),(u'sha1', None), (u'md5', None), + (u'date', None), (u'sha1', None), (u'md5', None), (u'mime_type', None), (u'file_type', None), (u'programming_language', None), (u'is_binary', False), (u'is_text', False), diff --git a/tests/test_util.py b/tests/test_util.py index b5d244d8..acdf4525 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2014-2019 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,11 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - -from collections import OrderedDict import string import unittest @@ -304,7 +299,7 @@ class TestCsv(unittest.TestCase): def test_load_csv_without_mapping(self): test_file = get_test_loc('test_util/csv/about.csv') - expected = [OrderedDict([ + expected = [dict([ ('about_file', 'about.ABOUT'), ('about_resource', '.'), ('name', 'ABOUT tool'), @@ -315,7 +310,7 @@ def test_load_csv_without_mapping(self): def test_load_csv_load_rows(self): test_file = get_test_loc('test_util/csv/about.csv') - expected = [OrderedDict([ + expected = [dict([ ('about_file', 'about.ABOUT'), ('about_resource', '.'), ('name', 'ABOUT tool'), @@ -326,7 +321,7 @@ def test_load_csv_load_rows(self): def test_load_csv_does_convert_column_names_to_lowercase(self): test_file = get_test_loc('test_util/csv/about_key_with_upper_case.csv') - expected = [OrderedDict( + expected = [dict( [('about_file', 'about.ABOUT'), ('about_resource', '.'), ('name', 'ABOUT tool'), @@ -336,14 +331,14 @@ def test_load_csv_does_convert_column_names_to_lowercase(self): assert expected == result def test_format_about_dict_for_csv_output(self): - about = [OrderedDict([ + about = [dict([ (u'about_file_path', u'/input/about1.ABOUT'), (u'about_resource', [u'test.c']), (u'name', u'AboutCode-toolkit'), (u'license_expression', u'mit AND bsd-new'), (u'license_key', [u'mit', u'bsd-new'])])] - expected = [OrderedDict([ + expected = [dict([ (u'about_file_path', u'/input/about1.ABOUT'), (u'about_resource', u'test.c'), (u'name', u'AboutCode-toolkit'), @@ -355,21 +350,22 @@ def test_format_about_dict_for_csv_output(self): def test_load_csv_microsoft_utf_8(self): test_file = get_test_loc('test_util/csv/test_ms_utf8.csv') - expected = [OrderedDict([(u'about_resource', u'/myFile'), (u'name', u'myName')])] + expected = [dict([(u'about_resource', u'/myFile'), (u'name', u'myName')])] result = util.load_csv(test_file) assert expected == result def test_load_csv_utf_8(self): test_file = get_test_loc('test_util/csv/test_utf8.csv') - expected = [OrderedDict([(u'about_resource', u'/myFile'), (u'name', u'\u540d')])] + expected = [dict([(u'about_resource', u'/myFile'), (u'name', u'\u540d')])] result = util.load_csv(test_file) assert expected == result + class TestJson(unittest.TestCase): def test_load_json(self): test_file = get_test_loc('test_util/json/expected.json') - expected = [OrderedDict([ + expected = [dict([ ('about_file_path', '/load/this.ABOUT'), ('about_resource', '.'), ('name', 'AboutCode'), @@ -380,7 +376,7 @@ def test_load_json(self): def test_load_json2(self): test_file = get_test_loc('test_util/json/expected_need_mapping.json') - expected = [dict(OrderedDict([ + expected = [dict(dict([ ('about_file', '/load/this.ABOUT'), ('about_resource', '.'), ('version', '0.11.0'), @@ -393,7 +389,7 @@ def test_load_json2(self): def test_load_non_list_json(self): test_file = get_test_loc('test_util/json/not_a_list_need_mapping.json') # FIXME: why this dict nesting?? - expected = [dict(OrderedDict([ + expected = [dict(dict([ ('about_resource', '.'), ('name', 'AboutCode'), ('path', '/load/this.ABOUT'), @@ -405,7 +401,7 @@ def test_load_non_list_json(self): def test_load_non_list_json2(self): test_file = get_test_loc('test_util/json/not_a_list.json') - expected = [OrderedDict([ + expected = [dict([ ('about_file_path', '/load/this.ABOUT'), ('version', '0.11.0'), ('about_resource', '.'), @@ -417,7 +413,7 @@ def test_load_non_list_json2(self): def test_load_json_from_abc_mgr(self): test_file = get_test_loc('test_util/json/aboutcode_manager_exported.json') - expected = [dict(OrderedDict([ + expected = [dict(dict([ ('license_expression', 'apache-2.0'), ('copyright', 'Copyright (c) 2017 nexB Inc.'), ('licenses', [{'key':'apache-2.0'}]), @@ -445,7 +441,7 @@ def test_load_json_from_abc_mgr(self): def test_load_json_from_scancode(self): test_file = get_test_loc('test_util/json/scancode_info.json') - expected = [dict(OrderedDict([ + expected = [dict(dict([ ('type', 'file'), ('name', 'Api.java'), ('path', 'Api.java'), @@ -473,19 +469,19 @@ def test_load_json_from_scancode(self): assert expected == result def test_format_about_dict_for_json_output(self): - about = [OrderedDict([ + about = [dict([ (u'about_file_path', u'/input/about1.ABOUT'), - (u'about_resource', OrderedDict([(u'test.c', None)])), + (u'about_resource', dict([(u'test.c', None)])), (u'name', u'AboutCode-toolkit'), (u'license_key', [u'mit', u'bsd-new'])])] - expected = [OrderedDict([ + expected = [dict([ (u'about_file_path', u'/input/about1.ABOUT'), (u'about_resource', u'test.c'), (u'name', u'AboutCode-toolkit'), (u'licenses', [ - OrderedDict([(u'key', u'mit')]), - OrderedDict([(u'key', u'bsd-new')])])])] + dict([(u'key', u'mit')]), + dict([(u'key', u'bsd-new')])])])] output = util.format_about_dict_for_json_output(about) assert output == expected @@ -556,12 +552,12 @@ def test_load_yaml_about_file_with_multiline(self): def test_ungroup_licenses(self): about = [ - OrderedDict([ + dict([ (u'key', u'mit'), (u'name', u'MIT License'), (u'file', u'mit.LICENSE'), (u'url', u'https://enterprise.dejacode.com/urn/?urn=urn:dje:license:mit')]), - OrderedDict([ + dict([ (u'key', u'bsd-new'), (u'name', u'BSD-3-Clause'), (u'file', u'bsd-new.LICENSE'), @@ -658,7 +654,7 @@ def test_copy_file_with_dir(self): for f in files: files_list.append(f) - #assert dir_list == [u'licenses'] + # assert dir_list == [u'licenses'] assert len(licenses) == len(files_list) for license in licenses: assert license in files_list diff --git a/tests/test_validate.py b/tests/test_validate.py index a0a50f9b..9f86cf6b 100644 --- a/tests/test_validate.py +++ b/tests/test_validate.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2018 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,11 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - import os from testing_utils import run_about_command_test @@ -27,7 +22,6 @@ Common and global checks such as codestyle and check own ABOUT files. """ - root_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) diff --git a/tests/testing_utils.py b/tests/testing_utils.py index fb15147a..d8c0d43c 100644 --- a/tests/testing_utils.py +++ b/tests/testing_utils.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # ============================================================================ -# Copyright (c) 2017 nexB Inc. http://www.nexb.com/ - All rights reserved. +# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,10 +14,6 @@ # limitations under the License. # ============================================================================ -from __future__ import absolute_import -from __future__ import print_function -from __future__ import unicode_literals - import logging import ntpath import os @@ -28,17 +24,14 @@ import tempfile import zipfile - from attributecode.util import add_unc from attributecode.util import to_posix - logger = logging.getLogger(__name__) handler = logging.StreamHandler() handler.setLevel(logging.DEBUG) logger.addHandler(handler) - TESTDATA_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'testdata') on_windows = 'win32' in sys.platform @@ -57,6 +50,7 @@ def get_test_loc(path, must_exists=True): assert os.path.exists(path) return path + def create_dir(location): """ Create directory or directory tree at location, ensuring it is readable diff --git a/thirdparty/PyYAML-3.12-py2-none-any.whl b/thirdparty/PyYAML-3.12-py2-none-any.whl deleted file mode 100644 index c301d137..00000000 Binary files a/thirdparty/PyYAML-3.12-py2-none-any.whl and /dev/null differ diff --git a/thirdparty/PyYAML-3.12-py2-none-any.whl.ABOUT b/thirdparty/PyYAML-3.12-py2-none-any.whl.ABOUT deleted file mode 100644 index ff50272b..00000000 --- a/thirdparty/PyYAML-3.12-py2-none-any.whl.ABOUT +++ /dev/null @@ -1,15 +0,0 @@ -about_resource: PyYAML-3.12-py2-none-any.whl -name: PyYAML -version: '3.12' -contact: xi@resolvent.net -copyright: Copyright (c) 2006 Kirill Simonov -description: YAML parser and emitter for Python -download_url: https://pypi.python.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz#md5=4c129761b661d181ebf7ff4eb2d79950 -homepage_url: http://pyyaml.org/wiki/PyYAML -license_expression: mit -licenses: - - file: mit.LICENSE - key: mit - name: MIT License - url: https://enterprise.dejacode.com/urn/?urn=urn:dje:license:mit -owner: Kirill Simonov diff --git a/thirdparty/PyYAML-3.12-py3-none-any.whl b/thirdparty/PyYAML-3.12-py3-none-any.whl deleted file mode 100644 index 4c971df0..00000000 Binary files a/thirdparty/PyYAML-3.12-py3-none-any.whl and /dev/null differ diff --git a/thirdparty/PyYAML-3.12-py3-none-any.whl.ABOUT b/thirdparty/PyYAML-3.12-py3-none-any.whl.ABOUT deleted file mode 100644 index 7cecd29f..00000000 --- a/thirdparty/PyYAML-3.12-py3-none-any.whl.ABOUT +++ /dev/null @@ -1,15 +0,0 @@ -about_resource: PyYAML-3.12-py3-none-any.whl -name: PyYAML -version: '3.12' -contact: xi@resolvent.net -copyright: Copyright (c) 2006 Kirill Simonov -description: YAML parser and emitter for Python -download_url: https://pypi.python.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz#md5=4c129761b661d181ebf7ff4eb2d79950 -homepage_url: http://pyyaml.org/wiki/PyYAML -license_expression: mit -licenses: - - file: mit.LICENSE - key: mit - name: MIT License - url: https://enterprise.dejacode.com/urn/?urn=urn:dje:license:mit -owner: Kirill Simonov diff --git a/thirdparty/PyYAML-3.12.tar.gz b/thirdparty/PyYAML-3.12.tar.gz deleted file mode 100644 index aabee39f..00000000 Binary files a/thirdparty/PyYAML-3.12.tar.gz and /dev/null differ diff --git a/thirdparty/PyYAML-3.12.tar.gz.ABOUT b/thirdparty/PyYAML-3.12.tar.gz.ABOUT deleted file mode 100644 index ffebd30c..00000000 --- a/thirdparty/PyYAML-3.12.tar.gz.ABOUT +++ /dev/null @@ -1,15 +0,0 @@ -about_resource: PyYAML-3.12.tar.gz -name: PyYAML -version: '3.12' -contact: xi@resolvent.net -copyright: Copyright (c) 2006 Kirill Simonov -description: YAML parser and emitter for Python -download_url: https://pypi.python.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz#md5=4c129761b661d181ebf7ff4eb2d79950 -homepage_url: http://pyyaml.org/wiki/PyYAML -license_expression: mit -licenses: - - file: mit.LICENSE - key: mit - name: MIT License - url: https://enterprise.dejacode.com/urn/?urn=urn:dje:license:mit -owner: Kirill Simonov diff --git a/thirdparty/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl b/thirdparty/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl new file mode 100644 index 00000000..f0f6b16b Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl.ABOUT new file mode 100644 index 00000000..a1f52c03 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl +attribute: yes +checksum_md5: e550469eb0bf4691f01294d0de7b3e2c +checksum_sha1: f0ddcc0b842b02a68b732d5d774195bb35ed8fe4 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/ef/e9/d62912119552b157ed66dc8297ae6ac08629d7d5c497d4faa26b0c3a4efe/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/pyyaml.LICENSE b/thirdparty/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl.NOTICE similarity index 91% rename from thirdparty/pyyaml.LICENSE rename to thirdparty/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl.NOTICE index 050ced23..ae36a529 100644 --- a/thirdparty/pyyaml.LICENSE +++ b/thirdparty/PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl.NOTICE @@ -1,3 +1,6 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + Copyright (c) 2006 Kirill Simonov Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -16,4 +19,4 @@ 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. +SOFTWARE. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl b/thirdparty/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl new file mode 100644 index 00000000..59998e32 Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl.ABOUT new file mode 100644 index 00000000..f33a3ed7 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl +attribute: yes +checksum_md5: deecacae274eb3aed83636ca27721494 +checksum_sha1: 6e8ab9278426163c0118691a16ca7aba1bcfce80 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/7a/5b/bc0b5ab38247bba158504a410112b6c03f153c652734ece1849749e5f518/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl b/thirdparty/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl new file mode 100644 index 00000000..76815a91 Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl.ABOUT new file mode 100644 index 00000000..fb5c6667 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp36-cp36m-win_amd64.whl +attribute: yes +checksum_md5: cc88f3537f1c85f9a58db1df2b55d032 +checksum_sha1: 66b6f80bf0061c4d6351bbb9474037fd3d6d4c92 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/30/d0/8699372d1c22202e80b160527f8412d98a5edfefeefac056df3997e84801/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp36-cp36m-win_amd64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp36-cp36m-win_amd64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl b/thirdparty/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl new file mode 100644 index 00000000..bafd684a Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl.ABOUT new file mode 100644 index 00000000..6dc6bb84 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl +attribute: yes +checksum_md5: c417e3f4fa776d1bdaddff1bc81b7742 +checksum_sha1: 36fdcdf510c6ea9e417a11c6da853b329dda1dbc +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/6b/8c/674cc47282af12bd7f12eea6cc87d907ada593b15f5ba0b51638599500c9/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl b/thirdparty/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl new file mode 100644 index 00000000..b17648bd Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl.ABOUT new file mode 100644 index 00000000..64a9f304 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl +attribute: yes +checksum_md5: 11fe109ca339ae11e59a410b85ecd14e +checksum_sha1: 4d04149ec1b0035d5d828dd861009039b54069f5 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/7a/a5/393c087efdc78091afa2af9f1378762f9821c9c1d7a22c5753fb5ac5f97a/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl b/thirdparty/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl new file mode 100644 index 00000000..4396b5ac Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl.ABOUT new file mode 100644 index 00000000..b92bd836 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp37-cp37m-win_amd64.whl +attribute: yes +checksum_md5: f549d96130504a4233c8618086c24200 +checksum_sha1: 2bb9e5b4de5e7c93c14a5e553d11af2d16d6dce6 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/66/7a/9f3a49dea61e98ac8bd3b6b619da4fcb59053232a6e11e9e865dab7c16e0/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp37-cp37m-win_amd64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp37-cp37m-win_amd64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl b/thirdparty/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl new file mode 100644 index 00000000..f480e5e7 Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl.ABOUT new file mode 100644 index 00000000..c10c82a9 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl +attribute: yes +checksum_md5: ea9048185f8a3ddcd06869c549d11a53 +checksum_sha1: 49c26c7cc7d09a7b37fe8223530b6c6ef6cf7494 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/cb/3f/2f35751408c0b2a425aa48dd79301a48418858d3366f84c75d1aa42b6e2d/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl b/thirdparty/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl new file mode 100644 index 00000000..f1750988 Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl.ABOUT new file mode 100644 index 00000000..5e0d352e --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl +attribute: yes +checksum_md5: e9e377f6865f54f624a4d975a80029a9 +checksum_sha1: fb54445e5626443ea44a1669333773ac1604f67c +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/70/96/c7245e551b1cb496bfb95840ace55ca60f20d3d8e33d70faf8c78a976899/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp38-cp38-win_amd64.whl b/thirdparty/PyYAML-5.4.1-cp38-cp38-win_amd64.whl new file mode 100644 index 00000000..7da4062c Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp38-cp38-win_amd64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp38-cp38-win_amd64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp38-cp38-win_amd64.whl.ABOUT new file mode 100644 index 00000000..f83636ff --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp38-cp38-win_amd64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp38-cp38-win_amd64.whl +attribute: yes +checksum_md5: 2292f0030310f9c3dc942c9aad6a558a +checksum_sha1: dc26b22cfb76503110f3795405230d356e9c5050 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/97/d3/24097209f6af04fcdbb40500480a0feaa62164e60bca4c9532f0e9354e47/PyYAML-5.4.1-cp38-cp38-win_amd64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp38-cp38-win_amd64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp38-cp38-win_amd64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp38-cp38-win_amd64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp38-cp38-win_amd64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl b/thirdparty/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl new file mode 100644 index 00000000..ff51b3f0 Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl.ABOUT new file mode 100644 index 00000000..54b5bfce --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl +attribute: yes +checksum_md5: fc83082aa2a00a195f9783cc6e7f8ebc +checksum_sha1: 429c1e0cd956ec806a9c2684fb2b94b9c5d6b1b3 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/e9/2d/297c01c7ed7d4d040903807824dc64d4f7bb53c15183ac9d7cb496d843eb/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl b/thirdparty/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl new file mode 100644 index 00000000..a565c66a Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl.ABOUT new file mode 100644 index 00000000..db26f358 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl +attribute: yes +checksum_md5: e7b9aeaefbdd7ad401f7ed2c5550f803 +checksum_sha1: 345cdbb6c61904da097ad4b586d9632fac4676c8 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/3d/1f/2a3705efca3b47161ceaaf52970a9d4b81cc84600818686ecd75093a00a5/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1-cp39-cp39-win_amd64.whl b/thirdparty/PyYAML-5.4.1-cp39-cp39-win_amd64.whl new file mode 100644 index 00000000..3452c5ea Binary files /dev/null and b/thirdparty/PyYAML-5.4.1-cp39-cp39-win_amd64.whl differ diff --git a/thirdparty/PyYAML-5.4.1-cp39-cp39-win_amd64.whl.ABOUT b/thirdparty/PyYAML-5.4.1-cp39-cp39-win_amd64.whl.ABOUT new file mode 100644 index 00000000..f760f7eb --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp39-cp39-win_amd64.whl.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1-cp39-cp39-win_amd64.whl +attribute: yes +checksum_md5: b6ddf1c6f8e3196aba336ed8eb1a5ac3 +checksum_sha1: 122a81ef18f265339d33e0826f80cab5ee0e4525 +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/bd/cb/9a65a8a852868ebfb7f6e631c2c0bf7e39c9f7a757ee329078a35534fc5b/PyYAML-5.4.1-cp39-cp39-win_amd64.whl +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1-cp39-cp39-win_amd64.whl.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1-cp39-cp39-win_amd64.whl.NOTICE b/thirdparty/PyYAML-5.4.1-cp39-cp39-win_amd64.whl.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1-cp39-cp39-win_amd64.whl.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/PyYAML-5.4.1.tar.gz b/thirdparty/PyYAML-5.4.1.tar.gz new file mode 100644 index 00000000..187c66e2 Binary files /dev/null and b/thirdparty/PyYAML-5.4.1.tar.gz differ diff --git a/thirdparty/PyYAML-5.4.1.tar.gz.ABOUT b/thirdparty/PyYAML-5.4.1.tar.gz.ABOUT new file mode 100644 index 00000000..e50c10fd --- /dev/null +++ b/thirdparty/PyYAML-5.4.1.tar.gz.ABOUT @@ -0,0 +1,18 @@ +about_resource: PyYAML-5.4.1.tar.gz +attribute: yes +checksum_md5: 46e25294c7efec23d4072ed6a7777f46 +checksum_sha1: dfa0009b17652ae1605bf0328fabd983ff238a5c +copyright: Copyright (c) 2006 Kirill Simonov +description: YAML parser and emitter for Python +download_url: https://files.pythonhosted.org/packages/a0/a4/d63f2d7597e1a4b55aa3b4d6c5b029991d3b824b5bd331af8d4ab1ed687d/PyYAML-5.4.1.tar.gz +homepage_url: http://pyyaml.org/wiki/PyYAML +license_expression: mit +name: PyYAML +notice_file: PyYAML-5.4.1.tar.gz.NOTICE +notice_url: http://svn.pyyaml.org/pyyaml/trunk/LICENSE +owner: Kirill Simonov +owner_url: http://www.yaml.org/ +package_url: pkg:pypi/pyyaml@5.4.1 +primary_language: Python +type: pypi +version: 5.4.1 diff --git a/thirdparty/PyYAML-5.4.1.tar.gz.NOTICE b/thirdparty/PyYAML-5.4.1.tar.gz.NOTICE new file mode 100644 index 00000000..ae36a529 --- /dev/null +++ b/thirdparty/PyYAML-5.4.1.tar.gz.NOTICE @@ -0,0 +1,22 @@ +The PyYAML module is written by Kirill Simonov. +PyYAML is released under the MIT license. + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. \ No newline at end of file diff --git a/thirdparty/backports.csv-1.0.6-py2.py3-none-any.whl b/thirdparty/backports.csv-1.0.6-py2.py3-none-any.whl deleted file mode 100644 index 5d2dc9b1..00000000 Binary files a/thirdparty/backports.csv-1.0.6-py2.py3-none-any.whl and /dev/null differ diff --git a/thirdparty/backports.csv.ABOUT b/thirdparty/backports.csv.ABOUT deleted file mode 100644 index 7dee1b01..00000000 --- a/thirdparty/backports.csv.ABOUT +++ /dev/null @@ -1,13 +0,0 @@ -about_resource: backports.csv-1.0.6-py2.py3-none-any.whl -name: backports.csv -version: 1.0.6 -download_url: https://files.pythonhosted.org/packages/71/f7/5db9136de67021a6dce4eefbe50d46aa043e59ebb11c83d4ecfeb47b686e/backports.csv-1.0.6-py2.py3-none-any.whl -homepage_url: https://github.com/ryanhiebert/backports.csv -licenses: - - file: python.LICENSE -notes: | - backports.csv is a backport of the csv module from Python 3. Because of this fact, - it is released under the same license as Python. -owner: Ryan Hiebert -vcs_repository: https://github.com/ryanhiebert/backports.csv.git -vcs_tool: git diff --git a/thirdparty/backports.csv.NOTICE b/thirdparty/backports.csv.NOTICE deleted file mode 100644 index 3d3b2c3a..00000000 --- a/thirdparty/backports.csv.NOTICE +++ /dev/null @@ -1,2 +0,0 @@ -backports.csv is a backport of the csv module from Python 3. -Because of this fact, it is released under the same license as Python. diff --git a/thirdparty/saneyaml-0.1-py2.py3-none-any.whl b/thirdparty/saneyaml-0.1-py2.py3-none-any.whl deleted file mode 100644 index c8aa66fa..00000000 Binary files a/thirdparty/saneyaml-0.1-py2.py3-none-any.whl and /dev/null differ diff --git a/thirdparty/saneyaml-0.1-py2.py3-none-any.whl.ABOUT b/thirdparty/saneyaml-0.1-py2.py3-none-any.whl.ABOUT deleted file mode 100644 index ae857b3e..00000000 --- a/thirdparty/saneyaml-0.1-py2.py3-none-any.whl.ABOUT +++ /dev/null @@ -1,20 +0,0 @@ -about_resource: saneyaml-0.1-py2.py3-none-any.whl -attribute: true -checksum_md5: 53509e4f1ee9f6565158163a56513b7c -checksum_sha1: a66920309794ead47711473a21f1c7d003acd005 -contact: http://www.nexb.com/contactus.html -copyright: Copyright (c) nexB Inc. and others. -download_url: https://files.pythonhosted.org/packages/21/13/3d639adcd97fc22cfc4acfd23330cc26f96a85a5b992d93086684e24ac14/saneyaml-0.1-py2.py3-none-any.whl -homepage_url: https://github.com/nexB/saneyaml -license_expression: apache-2.0 -licenses: -- file: apache-2.0.LICENSE - key: apache-2.0 - name: Apache License 2.0 -name: saneyaml -owner: nexB -owner_url: http://www.nexb.com/ -package_url: pkg:pypi/saneyaml@0.1 -track_changes: true -vcs_repository: https://github.com/nexB/saneyaml -version: '0.1' diff --git a/thirdparty/saneyaml-0.5.2-py3-none-any.whl b/thirdparty/saneyaml-0.5.2-py3-none-any.whl new file mode 100644 index 00000000..7f9edce4 Binary files /dev/null and b/thirdparty/saneyaml-0.5.2-py3-none-any.whl differ diff --git a/thirdparty/saneyaml-0.5.2-py3-none-any.whl.ABOUT b/thirdparty/saneyaml-0.5.2-py3-none-any.whl.ABOUT new file mode 100644 index 00000000..71c3bd2c --- /dev/null +++ b/thirdparty/saneyaml-0.5.2-py3-none-any.whl.ABOUT @@ -0,0 +1,20 @@ +about_resource: saneyaml-0.5.2-py3-none-any.whl +attribute: yes +checksum_md5: c82c53bde03e33dc149cba792e12ea62 +checksum_sha1: d537780de451ed5067130fb20ae603437ce09cb7 +contact: http://www.nexb.com/contactus.html +copyright: Copyright (c) nexB Inc. and others +description: This micro library is a PyYaml wrapper with sane behaviour to read and write readable + YAML safely, typically when used with configuration files. +download_url: https://thirdparty.aboutcode.org/pypi/saneyaml-0.5.2-py3-none-any.whl +homepage_url: https://github.com/nexB/saneyaml +license_expression: apache-2.0 +name: saneyaml +notice_file: saneyaml-0.5.2-py3-none-any.whl.NOTICE +owner: nexB +owner_url: http://www.nexb.com/ +package_url: pkg:pypi/saneyaml@0.5.2 +primary_language: Python +track_changes: yes +type: pypi +version: 0.5.2 diff --git a/thirdparty/saneyaml-0.5.2-py3-none-any.whl.NOTICE b/thirdparty/saneyaml-0.5.2-py3-none-any.whl.NOTICE new file mode 100644 index 00000000..e72724aa --- /dev/null +++ b/thirdparty/saneyaml-0.5.2-py3-none-any.whl.NOTICE @@ -0,0 +1,12 @@ +Copyright (c) 2018 nexB Inc. and others. All rights reserved. +http://nexb.com and https://github.com/nexB/saneyaml/ + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/thirdparty/saneyaml-0.5.2.tar.gz b/thirdparty/saneyaml-0.5.2.tar.gz new file mode 100644 index 00000000..e65bcee8 Binary files /dev/null and b/thirdparty/saneyaml-0.5.2.tar.gz differ diff --git a/thirdparty/saneyaml-0.5.2.tar.gz.ABOUT b/thirdparty/saneyaml-0.5.2.tar.gz.ABOUT new file mode 100644 index 00000000..b6ffd525 --- /dev/null +++ b/thirdparty/saneyaml-0.5.2.tar.gz.ABOUT @@ -0,0 +1,20 @@ +about_resource: saneyaml-0.5.2.tar.gz +attribute: yes +checksum_md5: 4985d7a8f4ad5af6ae53132e8d23a247 +checksum_sha1: 2405b7adf40d2e61a1b6711ac2ad27306af10191 +contact: http://www.nexb.com/contactus.html +copyright: Copyright (c) nexB Inc. and others +description: This micro library is a PyYaml wrapper with sane behaviour to read and write readable + YAML safely, typically when used with configuration files. +download_url: https://thirdparty.aboutcode.org/pypi/saneyaml-0.5.2.tar.gz +homepage_url: https://github.com/nexB/saneyaml +license_expression: apache-2.0 +name: saneyaml +notice_file: saneyaml-0.5.2.tar.gz.NOTICE +owner: nexB +owner_url: http://www.nexb.com/ +package_url: pkg:pypi/saneyaml@0.5.2 +primary_language: Python +track_changes: yes +type: pypi +version: 0.5.2 diff --git a/thirdparty/saneyaml-0.5.2.tar.gz.NOTICE b/thirdparty/saneyaml-0.5.2.tar.gz.NOTICE new file mode 100644 index 00000000..e72724aa --- /dev/null +++ b/thirdparty/saneyaml-0.5.2.tar.gz.NOTICE @@ -0,0 +1,12 @@ +Copyright (c) 2018 nexB Inc. and others. All rights reserved. +http://nexb.com and https://github.com/nexB/saneyaml/ + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/tox.ini b/tox.ini index d7bd368f..6005c4ad 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{27,36} +envlist = py{36,37,38,39} [testenv] deps = pytest