diff --git a/.github/workflows/pullRequest.yml b/.github/workflows/pullRequest.yml new file mode 100644 index 0000000..535a519 --- /dev/null +++ b/.github/workflows/pullRequest.yml @@ -0,0 +1,29 @@ +name: check for pull request into master + +on: + pull_request: + branches: + - master + +jobs: + build: + runs-on: windows-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + architecture: x86 + python-version: 3.8 + cache: pip + + - name: Install requirements + run: | + python -m pip install -r requirements.txt + + - name: run scons + run: scons + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..70de669 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,50 @@ +name: Build and release for official + +on: + push: + tags: + - "*.*.*" + +jobs: + build: + uses: ./.github/workflows/testAndBuild.yml + with: + official_release: true + + deploy: + needs: build + runs-on: windows-latest + + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: ${{ github.event.repository.name }} + path: ./ + + - name: Deploy to GitHub + uses: softprops/action-gh-release@v1 + with: + body: ${{ github.event.repository.name }} official release + draft: true + files: | + ./${{ github.event.repository.name }}-*.zip + ./*-*.nvda-addon + ./${{ github.event.repository.name }}-*.json + + error_notify: + runs-on: ubuntu-latest + needs: deploy + if: ${{ failure() }} + steps: + - name: Send GitHub Action trigger data to Slack workflow + uses: slackapi/slack-github-action@v1 + with: + payload: | + { + "text": "Github actions build failed! <${{ github.server_url }}/${{ github.repository }}|${{ github.event.repository.name }}>のofficial releaseビルドが失敗しました。\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|対象のrun>お確認し、対応着手時・完了後は、本チャンネルにて経緯を報告ください。" + } + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_ALERT_WEBHOOK_URL }} + SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK + diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml new file mode 100644 index 0000000..214588a --- /dev/null +++ b/.github/workflows/snapshot.yml @@ -0,0 +1,84 @@ +name: Build and release for snapshot + +on: + push: + branches: + - master + +jobs: + build: + uses: ./.github/workflows/testAndBuild.yml + + deploy: + needs: build + runs-on: windows-latest + + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: ${{ github.event.repository.name }} + path: ./ + + - name: Re-create the tag + uses: actions/github-script@v7 + with: + script: | + const { owner, repo } = context.repo + const tagName = repo + "-latestcommit" + try { + // Fetch the release by its tag + const { data: release } = await github.rest.repos.getReleaseByTag({ owner, repo, tag: tagName }) + // Delete the release if exists + await github.rest.repos.deleteRelease({ owner, repo, release_id: release.id }) + console.log("deleted release"); + } catch(err) { + if(err.status !== 404){ + throw err; + } + console.log('No release found for deletion'); + } + try { + await github.rest.git.deleteRef({owner, repo, ref: "tags/" + tagName}) + console.log("deleted tag"); + } catch(err) { + console.log('Failed to delete tag'+err.message); + } + try { + await github.rest.git.createRef({owner, repo, ref: "refs/tags/" + tagName, sha: context.sha}) + console.log("created tag"); + } catch(err) { + console.log('Failed to create tag'+err.message); + } + + - name: Deploy to GitHub + uses: softprops/action-gh-release@v1 + with: + name: Snapshot + tag_name: ${{ github.event.repository.name }}-latestcommit + body: Automatic build from master branch + files: | + ./${{ github.event.repository.name }}-*.zip + ./*-*.nvda-addon + ./${{ github.event.repository.name }}-*.json + + - name: register snapshot to actlab site + run: | + curl "https://actlab.org/api/addAlphaVersion?repo_name=${{ github.repository }}&commit_hash=${{ github.sha }}&version=${{ needs.build.outputs.build_version }}&password=${{ secrets.SCRIPT_PASSWORD }}" + + error_notify: + runs-on: ubuntu-latest + needs: deploy + if: ${{ failure() }} + steps: + - name: Send GitHub Action trigger data to Slack workflow + uses: slackapi/slack-github-action@v1 + with: + payload: | + { + "text": "Github actions build failed! <${{ github.server_url }}/${{ github.repository }}|${{ github.event.repository.name }}>のビルドが失敗しました。\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|対象のrun>お確認し、対応着手時・完了後は、本チャンネルにて経緯を報告ください。" + } + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_ALERT_WEBHOOK_URL }} + SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK + diff --git a/.github/workflows/testAndBuild.yml b/.github/workflows/testAndBuild.yml new file mode 100644 index 0000000..1a6a4ca --- /dev/null +++ b/.github/workflows/testAndBuild.yml @@ -0,0 +1,68 @@ +name: Test and build + +on: + workflow_call: + inputs: + official_release: + description: Whether this is an official release + default: false + type: boolean + outputs: + build_version: + description: Version of the built package + value: ${{ jobs.build.outputs.build_version }} + +jobs: + build: + runs-on: windows-latest + outputs: + build_version: ${{ steps.output_version.outputs.version }} + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + architecture: x86 + python-version: 3.8 + cache: pip + + - name: Install requirements + run: | + python -m pip install -r requirements.txt + + - name: Test + run: | + echo no tests + + - name: Set tag name if This is an official release + run: echo "TAG_NAME=$($env:GITHUB_REF.Replace('refs/tags/', ''))" >> $env:GITHUB_ENV + if: ${{ inputs.official_release }} + + - name: Build + run: | + python tools\build.py + env: + COMMIT_TIMESTAMP: ${{ github.event.head_commit.timestamp}} + + - name: output version + id: output_version + shell: python + run: | + import os, sys + sys.path.append(os.getcwd()) + import buildVars + with open(os.environ["GITHUB_OUTPUT"], mode = "a") as f: + f.write("version="+buildVars.ADDON_VERSION) + + - name: Archive production artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ github.event.repository.name }} + path: | + ./${{ github.event.repository.name }}-*.zip + ./*-*.nvda-addon + ./${{ github.event.repository.name }}-*.json + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0c910ca --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + 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. diff --git a/addon/doc/en/readme.md b/addon/doc/en/readme.md index eb6cbc7..3df035d 100644 --- a/addon/doc/en/readme.md +++ b/addon/doc/en/readme.md @@ -61,9 +61,13 @@ For email support, please send an email to "support@actlab.org". ## Changelog +### 2024/01/13 Version 1.0.3 + +1. Supports NVDA 2024.1. + ### 2023/03/21 Version 1.0.2 -1. Support NVDA 2023.1. +1. Supports NVDA 2023.1. ### 2022/10/20 Version 1.0.1 diff --git a/addon/doc/ja/readme.md b/addon/doc/ja/readme.md index 169ee07..02ee3c3 100644 --- a/addon/doc/ja/readme.md +++ b/addon/doc/ja/readme.md @@ -60,6 +60,10 @@ GitHubのアカウントを持っている方は、 [Universal Multilingualのis ## 更新履歴 +### 2024/01/13 Version 1.0.3 + +1. NVDA 2024.1 に対応しました。 + ### 2022/10/20 Version 1.0.2 1. NVDA 2023.1 をサポートします。 diff --git a/addon/globalPlugins/UML/updater.py b/addon/globalPlugins/UML/updater.py index 1f59023..ca70262 100644 --- a/addon/globalPlugins/UML/updater.py +++ b/addon/globalPlugins/UML/updater.py @@ -1,4 +1,3 @@ -# reuse of this source code is prohibited. from __future__ import unicode_literals import addonHandler import globalVars @@ -45,7 +44,11 @@ def __init__(self): if not updatable: log.warning("Update check not supported.") - def autoUpdateCheck(self, mode=0): + def autoUpdateCheck(self, mode=AUTO): + """ + Call this method to check for updates. mode=AUTO means automatic update check, and MANUAL means manual triggering like "check for updates" menu invocation. + When set to AUTO mode, some dialogs are not displayed (latest and error). + """ if not updatable: return self.updater = NVDAAddOnUpdater(mode) @@ -60,8 +63,9 @@ def __init__(self, mode, version=addonVersion): t.start() def check_update(self): + """Called as the thread entry point.""" post_params = { - "name": "UML", + "name": addonName, "version": addonVersion, "updater_version": "1.0.0", } @@ -210,8 +214,6 @@ def _download(self, url): def _downloadSuccess(self): self._stopped() - from gui import addonGui - closeAfter = addonGui.AddonsDialog._instance is None or (versionInfo.version_year, versionInfo.version_major) >= (2019, 1) try: try: bundle = addonHandler.AddonBundle(self.destPath.decode("mbcs")) @@ -235,8 +237,6 @@ def _downloadSuccess(self): gui.ExecAndPump(addonHandler.installAddonBundle, bundle) except BaseException: log.error("Error installing addon bundle from %s" % self.destPath, exc_info=True) - if not closeAfter: - addonGui.AddonsDialog(gui.mainFrame).refreshAddonsList() progressDialog.done() del progressDialog gui.messageBox(_("Failed to update add-on from %s.") % self.destPath, @@ -244,14 +244,12 @@ def _downloadSuccess(self): wx.OK | wx.ICON_ERROR) return else: - if not closeAfter: - addonGui.AddonsDialog(gui.mainFrame).refreshAddonsList(activeIndex=-1) progressDialog.done() del progressDialog finally: self.cleanup_tempfile() - if closeAfter: - wx.CallLater(1, addonGui.AddonsDialog(gui.mainFrame).Close) + from gui import addonGui + addonGui.promptUserForRestart() def cleanup_tempfile(self): if not os.path.isfile(self.destPath): diff --git a/appveyor-release.yml b/appveyor-release.yml deleted file mode 100644 index 4e9f7ea..0000000 --- a/appveyor-release.yml +++ /dev/null @@ -1,55 +0,0 @@ -version: development.{build}-{branch} -branches: - only: - - release - -skip_branch_with_pr: true - -environment: - matrix: - # For Python versions available on Appveyor, see - # http://www.appveyor.com/docs/installed-software#python - # The list here is complete (excluding Python 2.6, which - # isn't covered by this document) at the time of writing. - - - PYTHON: "C:\\Python37" - -install: - # We need wheel installed to build wheels - - cmd: set path=C:\\Python37;C:\\Python37\\Scripts;C:\\Python37\\lib;%path% - - cmd: python -m pip install -r requirements.txt - -build: off - -test_script: - # Put your test command here. - # If you don't need to build C extensions on 64-bit Python 3.3 or 3.4, - # you can remove "build.cmd" from the front of the command, as it's - # only needed to support those cases. - # Note that you must use the environment variable %PYTHON% to refer to - # the interpreter you're using - Appveyor does not do anything special - # to put the Python evrsion you want to use on PATH. - - "echo Skipped Tests" - -after_test: - # This step builds your wheels. - # Again, you only need build.cmd if you're building C extensions for - # 64-bit Python 3.3/3.4. And you need to use %PYTHON% to get the correct - # interpreter - - cmd: python tools\\build.py --appveyor - -artifacts: - - path: UML-*.zip - - path: UniversalMultilingual-*.nvda-addon - - path: UML-*.json - -deploy: - - provider: GitHub - description: "UML official release" - auth_token: - secure: iNSx8v6c+0TP9IyckinrvNWuX+hc7SKruOqRDl9GxdX59sZ2yqB8+UDAtqdPzKIg - artifact: /(UML-.*\.zip)|(UniversalMultilingual-.*\.nvda-addon)|(UML-.*\.json)/ - draft: true - prerelease: false - on: - APPVEYOR_REPO_TAG: true diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 0b75568..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,73 +0,0 @@ -version: development.{build}-{branch} -branches: - only: - - master - -skip_branch_with_pr: true -skip_tags: true - -environment: - githubToken: - secure: iNSx8v6c+0TP9IyckinrvNWuX+hc7SKruOqRDl9GxdX59sZ2yqB8+UDAtqdPzKIg - SCRIPT_PASSWORD: - secure: 9RvVUKVQ8MsoG5LOZ86VyFQF19JXXS33tDzomLH/jZM= - matrix: - - # For Python versions available on Appveyor, see - # http://www.appveyor.com/docs/installed-software#python - # The list here is complete (excluding Python 2.6, which - # isn't covered by this document) at the time of writing. - - - PYTHON: "C:\\Python37" - -install: - # We need wheel installed to build wheels - - cmd: set path=C:\\Python37;C:\\Python37\\Scripts;C:\\Python37\\lib;%path% - - cmd: python -m pip install -r requirements.txt - -build: off - -test_script: - # Put your test command here. - # If you don't need to build C extensions on 64-bit Python 3.3 or 3.4, - # you can remove "build.cmd" from the front of the command, as it's - # only needed to support those cases. - # Note that you must use the environment variable %PYTHON% to refer to - # the interpreter you're using - Appveyor does not do anything special - # to put the Python evrsion you want to use on PATH. - - "echo Skipped Tests" - -after_test: - # This step builds your wheels. - # Again, you only need build.cmd if you're building C extensions for - # 64-bit Python 3.3/3.4. And you need to use %PYTHON% to get the correct - # interpreter - - cmd: python tools\\build.py --appveyor - - cmd: if defined APPVEYOR_PULL_REQUEST_NUMBER appveyor exit 0 - - cmd: curl "https://actlab.org/git-release.php?repo_name=%APPVEYOR_REPO_NAME%&tag_name=UML-latestcommit&password=%SCRIPT_PASSWORD%" - - cmd: git tag -d UML-latestcommit - - cmd: git push -d https://actlab-auto:%githubToken%@github.com/actlaboratory/UML.git UML-latestcommit - - cmd: git tag UML-latestcommit - - cmd: git push https://actlab-auto:%githubToken%@github.com/actlaboratory/UML.git UML-latestcommit - -artifacts: - - path: UML-*.zip - - path: UniversalMultilingual-*.nvda-addon - - path: UML-*.json - -deploy: - - provider: GitHub - release: UML-latestcommit - skip_tags: true - Force update: true - description: 'automatic build from master branch' - auth_token: - secure: iNSx8v6c+0TP9IyckinrvNWuX+hc7SKruOqRDl9GxdX59sZ2yqB8+UDAtqdPzKIg - artifact: /(UML-.*\.zip)|(UniversalMultilingual-.*\.nvda-addon)|(UML-.*\.json)/ # upload all NuGet packages to release assets - draft: false - prerelease: false - on: - branch: master # release from master branch only - -after_deploy: - - cmd: echo import buildVars;print("https://actlab.org/api/addAlphaVersion?repo_name=%APPVEYOR_REPO_NAME%&commit_hash=%APPVEYOR_REPO_COMMIT%&version="+buildVars.ADDON_VERSION+"&password=%SCRIPT_PASSWORD%",end="") | C:\\Python37\python.exe | xargs -n1 curl diff --git a/buildVars.py b/buildVars.py index 4f350d7..9bcc07f 100644 --- a/buildVars.py +++ b/buildVars.py @@ -13,8 +13,8 @@ def _(arg): return arg -ADDON_VERSION = "1.0.2" -ADDON_RELEASE_DATE = "2023-03-21" +ADDON_VERSION = "1.0.3" +ADDON_RELEASE_DATE = "2024-01-13" ADDON_NAME = "UniversalMultilingual" ADDON_KEYWORD = "UML" @@ -42,7 +42,7 @@ def _(arg): # Minimum NVDA version supported (e.g. "2018.3.0", minor version is optional) "addon_minimumNVDAVersion": "2021.1", # Last NVDA version supported/tested (e.g. "2018.4.0", ideally more recent than minimum version) - "addon_lastTestedNVDAVersion": "2023.1", + "addon_lastTestedNVDAVersion": "2024.1", # Add-on update channel (default is None, denoting stable releases, # and for development releases, use "dev".) # Do not change unless you know what you are doing! diff --git a/license b/license deleted file mode 100644 index aeaf37b..0000000 --- a/license +++ /dev/null @@ -1,23 +0,0 @@ -This software is licensed under MIT license, as described below. However, reuse of the addon updater is prohibited. - -MIT License - -Copyright (c) 2022 AccessibleToolsLaboratory - -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. diff --git a/tools/build.py b/tools/build.py index fcb0b5c..d4b4e26 100644 --- a/tools/build.py +++ b/tools/build.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- #app build tool #Copyright (C) 2019 Yukio Nozawa -#Copyright (C) 2019-2020 guredora +#Copyright (C) 2019-2024 guredora #Copyright (C) 2021 yamahubuki #Copyright (C) 2021 Hiroki Fujii @@ -25,20 +25,17 @@ class build: def __init__(self): - # appVeyorかどうかを判別し、処理をスタート - appveyor = self.setAppVeyor() - print("Starting build for %s (appveyor mode=%s)" % (buildVars.ADDON_KEYWORD, appveyor,)) + # Github actionsなどの自動実行かどうかを判別し、処理をスタート + automated = self.setAutomated() + print("Starting build for %s(automated mode=%s)" % (buildVars.ADDON_KEYWORD, automated,)) # パッケージのパスとファイル名を決定 package_path = "output\\" - if 'APPVEYOR_REPO_TAG_NAME' in os.environ: - build_filename = os.environ['APPVEYOR_REPO_TAG_NAME'] - # タグ名とバージョンが違ったらエラー - if build_filename != buildVars.ADDON_VERSION: - print("Unexpected tag name. expecting %s." %(buildVars.ADDON_VERSION,)) - exit(-1) - else: - build_filename = 'snapshot' + build_filename = os.environ.get('TAG_NAME', 'snapshot') + # snapshotではなかった場合は、タグ名とバージョンが違ったらエラー + if (build_filename != "snapshot") and (build_filename != buildVars.ADDON_VERSION): + print("Unexpected tag name. expecting %s." %(buildVars.ADDON_VERSION,)) + exit(-1) print("Will be built as %s" % build_filename) # addonフォルダの存在を確認 @@ -49,21 +46,16 @@ def __init__(self): # 前のビルドをクリーンアップ self.clean(package_path) - # appveyorでのスナップショットの場合はバージョン番号を一時的に書き換え - # バージョン番号をセット - if build_filename == "snapshot" and appveyor: - self.version_number = self.makeSnapshotVersionNumber() - elif build_filename == "snapshot": - self.version_number = buildVars.ADDON_VERSION - else: - self.version_number = build_filename + # 自動実行でのスナップショットの場合はバージョン番号を一時的に書き換え + if build_filename == "snapshot" and automated: + print(self.makeSnapshotVersionNumber()) # ビルド self.build(package_path, build_filename) archive_name = "%s-%s.zip" % (buildVars.ADDON_KEYWORD, build_filename,) - addon_filename = "%s-%s.nvda-addon" % (buildVars.ADDON_NAME, self.version_number) + addon_filename = "%s-%s.nvda-addon" % (buildVars.ADDON_NAME, buildVars.ADDON_VERSION,) shutil.copyfile(package_path + addon_filename, addon_filename) - self.makePackageInfo(archive_name, addon_filename, self.version_number, build_filename) + self.makePackageInfo(archive_name, addon_filename, build_filename) print("Build finished!") def runcmd(self,cmd): @@ -71,10 +63,8 @@ def runcmd(self,cmd): proc.communicate() return proc.poll() - def setAppVeyor(self): - if len(sys.argv)>=2 and sys.argv[1]=="--appveyor": - return True - return False + def setAutomated(self): + return os.environ.get("GITHUB_ACTIONS", "false") == "true" def clean(self,package_path): if os.path.isdir(package_path): @@ -84,15 +74,15 @@ def clean(self,package_path): def makeSnapshotVersionNumber(self): #日本標準時オブジェクト JST = datetime.timezone(datetime.timedelta(hours=+9)) - #Pythonは世界標準時のZに対応していないので文字列処理で乗り切り、それを日本標準時に変換 - dt = datetime.datetime.fromisoformat(os.environ["APPVEYOR_REPO_COMMIT_TIMESTAMP"][0:19]+"+00:00").astimezone(JST) - major = str(dt.year)[2:4]+str(dt.month).zfill(2) + dt = datetime.datetime.fromisoformat(os.environ["COMMIT_TIMESTAMP"]).astimezone(JST) + major = f"{dt.year % 100:02d}{dt.month:02d}" minor = str(dt.day) patch = str(int(math.floor((dt.hour*3600+dt.minute*60+dt.second)/86400*1000))) + buildVars.ADDON_VERSION = major+"."+minor+"."+patch + buildVars.ADDON_RELEASE_DATE = str(dt.date()) bumpup.bumpup(major+"."+minor+"."+patch, str(dt.date())) return major+"."+minor+"."+patch - def build(self, package_path, build_filename): print("Building...") os.mkdir(package_path) @@ -103,22 +93,11 @@ def build(self, package_path, build_filename): print("build finished with status %d" % ret) if ret != 0: sys.exit(ret) - - print("Compressing into package...") shutil.make_archive("%s-%s" % (buildVars.ADDON_KEYWORD, build_filename,),'zip',package_path) - def makePackageInfo(self, archive_name, addon_filename, addon_version, build_filename): - if "APPVEYOR_REPO_COMMIT_TIMESTAMP" in os.environ: - #日本標準時オブジェクト - JST = datetime.timezone(datetime.timedelta(hours=+9)) - #Pythonは世界標準時のZに対応していないので文字列処理で乗り切り、それを日本標準時に変換 - dt = datetime.datetime.fromisoformat(os.environ["APPVEYOR_REPO_COMMIT_TIMESTAMP"][0:19]+"+00:00").astimezone(JST) - dateStr = "%s-%s-%s" % (str(dt.year), str(dt.month).zfill(2), str(dt.day).zfill(2)) - else: - dateStr = "this is a local build." - - print("computing hash...") + def makePackageInfo(self, archive_name, addon_filename, build_filename): + print("Calculating hash...") with open(archive_name, mode = "rb") as f: content = f.read() package_hash = hashlib.sha1(content).hexdigest() @@ -130,9 +109,9 @@ def makePackageInfo(self, archive_name, addon_filename, addon_version, build_fil info["package_hash"] = package_hash info["patch_filename"] = addon_filename info["patch_hash"] = addon_hash - info["version"] = addon_version - info["released_date"] = dateStr - with open("%s-%s_info.json" % (buildVars.ADDON_KEYWORD, build_filename), mode = "w") as f: + info["version"] = buildVars.ADDON_VERSION + info["released_date"] = buildVars.ADDON_RELEASE_DATE + with open("%s-%s_info.json" % (buildVars.ADDON_KEYWORD, build_filename,), mode = "w") as f: json.dump(info, f) diff --git a/version.json b/version.json index 430f983..644214c 100644 --- a/version.json +++ b/version.json @@ -1 +1 @@ -{"version": "1.0.2", "release_date": "2023-03-21"} \ No newline at end of file +{"version": "1.0.3", "release_date": "2024-01-13"} \ No newline at end of file