From 644d9318e47d3f1a006192cba8682567c79f8fe3 Mon Sep 17 00:00:00 2001 From: Eduardo Robles Elvira Date: Wed, 30 Mar 2022 18:06:35 +0200 Subject: [PATCH 1/5] rebrand from nVotes to Sequent Tech Rebrands the whole repository from nVotes to Sequent Tech, changing all references in code, documentation, comments and file names. This rebranding includes the renaming of all the repositories too. --- .../{agora-gui-booth.yml => voting-booth.yml} | 4 +- .ort-data/disclosure_document.ftl | 2 +- .ort.yml | 6 +- AUTHORS | 2 +- MANIFEST.in | 4 +- README.md | 38 ++++---- config.json | 4 +- img/{nvotes_logo.jpg => sequent_logo.jpg} | Bin requirements.txt | 2 +- setup.cfg | 6 +- setup.py | 26 +++--- agora-results => tally-pipes | 12 +-- {agora_results => tally_pipes}/__init__.py | 0 {agora_results => tally_pipes}/main.py | 84 +++++++++--------- .../pipes/__init__.py | 0 .../pipes/ballot_boxes.py | 10 +-- .../pipes/bcnencomu.py | 10 +-- .../pipes/desborda.py | 12 +-- .../pipes/desborda2.py | 16 ++-- .../pipes/desborda3.py | 10 +-- .../pipes/desborda4.py | 16 ++-- .../pipes/desborda_base.py | 12 +-- .../pipes/duplicate_questions.py | 10 +-- .../pipes/locale/ca/LC_MESSAGES/pipes.mo | Bin .../pipes/locale/ca/LC_MESSAGES/pipes.po | 72 +++++++-------- .../pipes/locale/es/LC_MESSAGES/pipes.mo | Bin .../pipes/locale/es/LC_MESSAGES/pipes.po | 72 +++++++-------- .../pipes/locale/pipes.pot | 80 ++++++++--------- .../pipes/modifications.py | 10 +-- .../pipes/multipart.py | 22 ++--- .../pipes/parity.py | 16 ++-- {agora_results => tally_pipes}/pipes/pdf.py | 12 +-- .../pipes/podemos.py | 10 +-- .../pipes/pretty_print.py | 10 +-- .../pipes/results.py | 20 ++--- {agora_results => tally_pipes}/pipes/sort.py | 10 +-- .../pipes/stv_tiebreak.py | 14 +-- .../pipes/withdraw_candidates.py | 10 +-- .../utils/deterministic_tar.py | 4 +- .../utils/file_helpers.py | 10 +-- .../utils/join_by_name.py | 10 +-- .../utils/tallies.py | 12 +-- test/desborda4_tests/test_0 | 10 +-- test/desborda4_tests/test_1 | 10 +-- test/desborda4_tests/test_2 | 12 +-- test/desborda4_tests/test_3 | 10 +-- test/desborda4_tests/test_4 | 14 +-- test/desborda_test.py | 20 ++--- test/output_tests/test_output_1 | 6 +- test/output_tests/test_output_2 | 8 +- test/output_tests/test_output_3 | 8 +- test/pipes-whitelist.txt | 60 ++++++------- test/plurality_tally_sheets/test_0 | 4 +- test/plurality_tally_sheets/test_1 | 6 +- test/plurality_tally_sheets/test_2 | 6 +- test/plurality_tally_sheets/test_3 | 4 +- test/tests.py | 64 ++++++------- 57 files changed, 461 insertions(+), 461 deletions(-) rename .ort-data/curations-dir/{agora-gui-booth.yml => voting-booth.yml} (56%) rename img/{nvotes_logo.jpg => sequent_logo.jpg} (100%) rename agora-results => tally-pipes (83%) rename {agora_results => tally_pipes}/__init__.py (100%) rename {agora_results => tally_pipes}/main.py (87%) rename {agora_results => tally_pipes}/pipes/__init__.py (100%) rename {agora_results => tally_pipes}/pipes/ballot_boxes.py (97%) rename {agora_results => tally_pipes}/pipes/bcnencomu.py (79%) rename {agora_results => tally_pipes}/pipes/desborda.py (88%) rename {agora_results => tally_pipes}/pipes/desborda2.py (93%) rename {agora_results => tally_pipes}/pipes/desborda3.py (79%) rename {agora_results => tally_pipes}/pipes/desborda4.py (96%) rename {agora_results => tally_pipes}/pipes/desborda_base.py (96%) rename {agora_results => tally_pipes}/pipes/duplicate_questions.py (93%) rename {agora_results => tally_pipes}/pipes/locale/ca/LC_MESSAGES/pipes.mo (100%) rename {agora_results => tally_pipes}/pipes/locale/ca/LC_MESSAGES/pipes.po (73%) rename {agora_results => tally_pipes}/pipes/locale/es/LC_MESSAGES/pipes.mo (100%) rename {agora_results => tally_pipes}/pipes/locale/es/LC_MESSAGES/pipes.po (73%) rename {agora_results => tally_pipes}/pipes/locale/pipes.pot (59%) rename {agora_results => tally_pipes}/pipes/modifications.py (96%) rename {agora_results => tally_pipes}/pipes/multipart.py (97%) rename {agora_results => tally_pipes}/pipes/parity.py (97%) rename {agora_results => tally_pipes}/pipes/pdf.py (98%) rename {agora_results => tally_pipes}/pipes/podemos.py (95%) rename {agora_results => tally_pipes}/pipes/pretty_print.py (95%) rename {agora_results => tally_pipes}/pipes/results.py (87%) rename {agora_results => tally_pipes}/pipes/sort.py (95%) rename {agora_results => tally_pipes}/pipes/stv_tiebreak.py (93%) rename {agora_results => tally_pipes}/pipes/withdraw_candidates.py (86%) rename {agora_results => tally_pipes}/utils/deterministic_tar.py (95%) rename {agora_results => tally_pipes}/utils/file_helpers.py (74%) rename {agora_results => tally_pipes}/utils/join_by_name.py (86%) rename {agora_results => tally_pipes}/utils/tallies.py (78%) diff --git a/.ort-data/curations-dir/agora-gui-booth.yml b/.ort-data/curations-dir/voting-booth.yml similarity index 56% rename from .ort-data/curations-dir/agora-gui-booth.yml rename to .ort-data/curations-dir/voting-booth.yml index a7f7157..a057752 100644 --- a/.ort-data/curations-dir/agora-gui-booth.yml +++ b/.ort-data/curations-dir/voting-booth.yml @@ -1,7 +1,7 @@ -- id: "Yarn::agora-gui-booth" +- id: "Yarn::voting-booth" curations: comment: "This package needs to be downloaded from git" vcs: type: "git" - url: "https://github.com/agoravoting/agora-gui-common.git" + url: "https://github.com/sequentech/common-ui.git" revision: "4.0.1" diff --git a/.ort-data/disclosure_document.ftl b/.ort-data/disclosure_document.ftl index 38e2f23..87ad3fb 100644 --- a/.ort-data/disclosure_document.ftl +++ b/.ort-data/disclosure_document.ftl @@ -1,7 +1,7 @@ [#-- Copyright (C) 2020 HERE Europe B.V. Copyright (C) 2020-2021 Bosch.IO GmbH -Copyright (C) 2021 Agora Voting SL +Copyright (C) 2021 Sequent Tech Inc Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/.ort.yml b/.ort.yml index 32b76f5..3d17302 100644 --- a/.ort.yml +++ b/.ort.yml @@ -1,15 +1,15 @@ -# SPDX-FileCopyrightText: 2014-2021 Agora Voting SL +# SPDX-FileCopyrightText: 2014-2021 Sequent Tech Inc # # SPDX-License-Identifier: AGPL-3.0-only --- resolutions: rule_violations: - - message: "The package (PIP|PyPI)::agora-(tally|results-requirements):.* has the declared ScanCode copyleft catalogized license AGPL-3.0-only." + - message: "The package (PIP|PyPI)::sequent-(tally|results-requirements):.* has the declared ScanCode copyleft catalogized license AGPL-3.0-only." reason: "LICENSE_ACQUIRED_EXCEPTION" comment: "The project is open source so it's normal that it's set as such." - - message: "The project PIP::agora-results-requirements:.* has the dependency PyPI::agora-tally:.* licensed under the ScanCode copyleft categorized license AGPL-3.0-only." + - message: "The project PIP::tally-pipes-requirements:.* has the dependency PyPI::tally-methods:.* licensed under the ScanCode copyleft categorized license AGPL-3.0-only." reason: "LICENSE_ACQUIRED_EXCEPTION" comment: "The project is open source so it's normal that it's set as such." diff --git a/AUTHORS b/AUTHORS index efc8313..db90a7f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,2 +1,2 @@ -Eduardo Robles Elvira +Eduardo Robles Elvira Daniel García Moreno \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index 480087b..0067953 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,3 @@ -recursive-include agora_results *.py -recursive-include agora_results/pipes/locale * +recursive-include tally_pipes *.py +recursive-include tally_pipes/pipes/locale * include *md *txt AUTHORS diff --git a/README.md b/README.md index a817edd..b15b10e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# agora-results [![tests_badge]][tests_link] +# tally-pipes [![tests_badge]][tests_link] -[tests_badge]: https://github.com/agoravoting/agora-results/workflows/Test%20python/badge.svg -[tests_link]: https://github.com/agoravoting/agora-results/actions?query=workflow%3A%22Test+python%22 +[tests_badge]: https://github.com/sequentech/tally-pipes/workflows/Test%20python/badge.svg +[tests_link]: https://github.com/sequentech/tally-pipes/actions?query=workflow%3A%22Test+python%22 ## Introduction @@ -15,17 +15,17 @@ Piece of software that processes a tally and given a pipeline it modifies the re Just execute this (no stable release yet): - $ mkvirtualenv agora-results -p $(which python3) - $ workon agora-results - $ pip install git+https://github.com/agoravoting/agora-results.git + $ mkvirtualenv tally-pipes -p $(which python3) + $ workon tally-pipes + $ pip install git+https://github.com/sequentech/tally-pipes.git ## Usage - $ agora-results --tally tally.tar.gz --config agora_results.test_config + $ tally-pipes --tally tally.tar.gz --config tally_pipes.test_config Or the same shorter: - $ agora-results -t tally.tar.gz -c config.json + $ tally-pipes -t tally.tar.gz -c config.json ## Configuration file @@ -33,7 +33,7 @@ Configuration file specifies the pipeline of functions to be applied to the resu [ [ - "agora_results.pipes.results.do_tallies", + "tally_pipes.pipes.results.do_tallies", {} ] ] @@ -46,11 +46,11 @@ Execute the unit tests with: ## Available pipes -Available pipes are documented in python, in the agora_results/pipes directory. +Available pipes are documented in python, in the tally_pipes/pipes directory. ## Development -You can of course take a look at the available pipes in the agora_results/pipes/ subdirectory and see how to develop your own pipe. Be careful, you might cook the results in an unexpected way! +You can of course take a look at the available pipes in the tally_pipes/pipes/ subdirectory and see how to develop your own pipe. Be careful, you might cook the results in an unexpected way! This software is in development state, that's why we haven't released any stable version yet. Patches and new pipes are welcome. We will review the pipe so that it does what is expected. @@ -63,27 +63,27 @@ mainly followed the guide here: https://www.mattlayman.com/blog/2015/i18n/ You can see all the available commands with: - $ agora-results --help + $ tally-pipes --help -You can contact us at agora-voting@googlegroups.com mailing list or at #agoravoting freenode.net channel. +You can contact us at sequent-voting@googlegroups.com mailing list or at #sequent freenode.net channel. ## License -Copyright (C) 2015 Agora Voting SL and/or its subsidiary(-ies). -Contact: legal@agoravoting.com +Copyright (C) 2015 Sequent Tech Inc and/or its subsidiary(-ies). +Contact: legal@sequentech.io -This file is part of the agora-core-view module of the Agora Voting project. +This file is part of the sequent-core-view module of the Sequent Tech project. 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. Commercial License Usage -Licensees holding valid commercial Agora Voting project licenses may use this +Licensees holding valid commercial Sequent Tech project licenses may use this file in accordance with the commercial license agreement provided with the Software or, alternatively, in accordance with the terms contained in -a written agreement between you and Agora Voting SL. For licensing terms and -conditions and further information contact us at legal@agoravoting.com . +a written agreement between you and Sequent Tech Inc. For licensing terms and +conditions and further information contact us at legal@sequentech.io . GNU Affero General Public License Usage Alternatively, this file may be used under the terms of the GNU Affero General diff --git a/config.json b/config.json index 65007df..cd328dc 100644 --- a/config.json +++ b/config.json @@ -1,10 +1,10 @@ [ [ - "agora_results.pipes.results.do_tallies", + "tally_pipes.pipes.results.do_tallies", {"ignore_invalid_votes": true} ], [ - "agora_results.pipes.sort.sort_non_iterative", + "tally_pipes.pipes.sort.sort_non_iterative", { "question_indexes": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] } diff --git a/img/nvotes_logo.jpg b/img/sequent_logo.jpg similarity index 100% rename from img/nvotes_logo.jpg rename to img/sequent_logo.jpg diff --git a/requirements.txt b/requirements.txt index 54b7479..de57d0a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ reportlab==3.5.55 requests==2.20.0 pytz==2021.3 Babel==2.9.1 --e git+https://github.com/agoravoting/agora-tally.git@master#egg=agora-tally +-e git+https://github.com/sequentech/tally-methods.git@master#egg=tally-methods diff --git a/setup.cfg b/setup.cfg index 0ee673b..cee04ed 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [extract_messages] -input_dirs = agora_results/pipes/ -output_file = agora_results/pipes/locale/pipes.pot +input_dirs = tally_pipes/pipes/ +output_file = tally_pipes/pipes/locale/pipes.pot [compile_catalog] domain = pipes -directory = agora_results/pipes/locale +directory = tally_pipes/pipes/locale diff --git a/setup.py b/setup.py index 69df364..7dfead2 100644 --- a/setup.py +++ b/setup.py @@ -1,19 +1,19 @@ #!/usr/bin/env python3 -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . from setuptools import setup from setuptools.command.sdist import sdist @@ -24,15 +24,15 @@ def run(self): sdist.run(self) setup( - name='agora-results', + name='tally-pipes', version='master', - author='Agora Voting SL', - author_email='contact@nvotes.com', - packages=['agora_results', 'agora_results.pipes'], - scripts=['agora-results'], - url='https://github.com/agoravoting/agora-results', + author='Sequent Tech Inc', + author_email='contact@sequentech.io', + packages=['tally_pipes', 'tally_pipes.pipes'], + scripts=['tally-pipes'], + url='https://github.com/sequentech/tally-pipes', license='AGPL-3.0', - description='agora results processing system', + description='sequent results processing system', long_description=open('README.md').read(), setup_requires=['Babel'], cmdclass={'sdist': SdistI18n}, @@ -41,6 +41,6 @@ def run(self): 'requests==2.20.0', 'Babel==2.9.1', 'pytz==2021.3', - 'agora-tally @ git+https://github.com/agoravoting/agora-tally.git@master' + 'tally-methods @ git+https://github.com/sequentech/tally-methods.git@master' ] ) diff --git a/agora-results b/tally-pipes similarity index 83% rename from agora-results rename to tally-pipes index 652cd0a..cb966a7 100755 --- a/agora-results +++ b/tally-pipes @@ -1,22 +1,22 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . -from agora_results import main +from tally_pipes import main import argparse if __name__ == '__main__': diff --git a/agora_results/__init__.py b/tally_pipes/__init__.py similarity index 100% rename from agora_results/__init__.py rename to tally_pipes/__init__.py diff --git a/agora_results/main.py b/tally_pipes/main.py similarity index 87% rename from agora_results/main.py rename to tally_pipes/main.py index feaeb4e..3d8bb24 100755 --- a/agora_results/main.py +++ b/tally_pipes/main.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2021 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2021 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import os import copy @@ -32,17 +32,17 @@ version=VERSION, pipes=[ dict( - type='agora_results.pipes.pdf.configure_pdf', + type='tally_pipes.pipes.pdf.configure_pdf', params=dict( languages=['en'] ) ), dict( - type='agora_results.pipes.results.do_tallies', + type='tally_pipes.pipes.results.do_tallies', params={} ), dict( - type="agora_results.pipes.sort.sort_non_iterative", + type="tally_pipes.pipes.sort.sort_non_iterative", params={} ) ] @@ -51,36 +51,36 @@ # By default we only allow the most used pipes to reduce default attack surface # NOTE: keep the list sorted DEFAULT_PIPES_WHITELIST = [ - #"agora_results.pipes.desborda.podemos_desborda", - #"agora_results.pipes.desborda2.podemos_desborda2", - #"agora_results.pipes.desborda3.podemos_desborda3", - #"agora_results.pipes.desborda4.podemos_desborda4", - #"agora_results.pipes.duplicate_questions.duplicate_questions", - "agora_results.pipes.modifications.apply_modifications", - #"agora_results.pipes.multipart.make_multipart", - #"agora_results.pipes.multipart.election_max_size_corrections", - #"agora_results.pipes.multipart.question_totals_with_corrections", - #"agora_results.pipes.multipart.reduce_answers_with_corrections", - #"agora_results.pipes.multipart.multipart_tally_plaintexts_append_joiner", - #"agora_results.pipes.multipart.data_list_reverse", - #"agora_results.pipes.multipart.multipart_tally_plaintexts_joiner", - #"agora_results.pipes.multipart.append_ballots", - "agora_results.pipes.parity.proportion_rounded", - "agora_results.pipes.parity.parity_zip_non_iterative", - "agora_results.pipes.parity.reorder_winners", - "agora_results.pipes.parity.podemos_parity_loreg_zip_non_iterative", - "agora_results.pipes.parity.podemos_parity2_loreg_zip_non_iterative", - #"agora_results.pipes.podemos.podemos_proportion_rounded_and_duplicates", - #"agora_results.pipes.pretty_print.pretty_print_stv_winners", - "agora_results.pipes.pretty_print.pretty_print_not_iterative", - "agora_results.pipes.results.do_tallies", - #"agora_results.pipes.results.to_files", - #"agora_results.pipes.results.apply_removals", - "agora_results.pipes.sort.sort_non_iterative", - #"agora_results.pipes.stv_tiebreak.stv_first_round_tiebreak", - "agora_results.pipes.pdf.configure_pdf", - "agora_results.pipes.withdraw_candidates.withdraw_candidates", - #"agora_results.pipes.ballot_boxes.count_tally_sheets" + #"tally_pipes.pipes.desborda.podemos_desborda", + #"tally_pipes.pipes.desborda2.podemos_desborda2", + #"tally_pipes.pipes.desborda3.podemos_desborda3", + #"tally_pipes.pipes.desborda4.podemos_desborda4", + #"tally_pipes.pipes.duplicate_questions.duplicate_questions", + "tally_pipes.pipes.modifications.apply_modifications", + #"tally_pipes.pipes.multipart.make_multipart", + #"tally_pipes.pipes.multipart.election_max_size_corrections", + #"tally_pipes.pipes.multipart.question_totals_with_corrections", + #"tally_pipes.pipes.multipart.reduce_answers_with_corrections", + #"tally_pipes.pipes.multipart.multipart_tally_plaintexts_append_joiner", + #"tally_pipes.pipes.multipart.data_list_reverse", + #"tally_pipes.pipes.multipart.multipart_tally_plaintexts_joiner", + #"tally_pipes.pipes.multipart.append_ballots", + "tally_pipes.pipes.parity.proportion_rounded", + "tally_pipes.pipes.parity.parity_zip_non_iterative", + "tally_pipes.pipes.parity.reorder_winners", + "tally_pipes.pipes.parity.podemos_parity_loreg_zip_non_iterative", + "tally_pipes.pipes.parity.podemos_parity2_loreg_zip_non_iterative", + #"tally_pipes.pipes.podemos.podemos_proportion_rounded_and_duplicates", + #"tally_pipes.pipes.pretty_print.pretty_print_stv_winners", + "tally_pipes.pipes.pretty_print.pretty_print_not_iterative", + "tally_pipes.pipes.results.do_tallies", + #"tally_pipes.pipes.results.to_files", + #"tally_pipes.pipes.results.apply_removals", + "tally_pipes.pipes.sort.sort_non_iterative", + #"tally_pipes.pipes.stv_tiebreak.stv_first_round_tiebreak", + "tally_pipes.pipes.pdf.configure_pdf", + "tally_pipes.pipes.withdraw_candidates.withdraw_candidates", + #"tally_pipes.pipes.ballot_boxes.count_tally_sheets" ] @@ -129,7 +129,7 @@ def print_csv(data, separator, output_func=print): str(answer['winner_position'])])) def pretty_print(data, output_func=print): - from agora_results.pipes.pretty_print import pretty_print_not_iterative + from tally_pipes.pipes.pretty_print import pretty_print_not_iterative pretty_print_not_iterative([data], output_func=output_func) def print_results( @@ -158,7 +158,7 @@ def print_results( elif "pretty" == output_format: pretty_print(data, output_func=output_func) elif "pdf" == output_format: - from agora_results.pipes.pdf import pdf_print + from tally_pipes.pipes.pdf import pdf_print try: pdf_print(data, election_config, election_id) except Exception: @@ -173,7 +173,7 @@ def func_path_sanity_checks(func_path, pipes_whitelist): values = func_path.split(".") if " " in func_path or len(values) == 0 or len(values) > 4 or\ - values[0] != "agora_results" or values[1] != "pipes": + values[0] != "tally_pipes" or values[1] != "pipes": raise Exception() for val in values: @@ -473,7 +473,7 @@ def ballots_printer(vote, question, question_num, exception): if pargs.tar and len(data_list) > 0 and 'results' in data_list[0]: data_list[0]['results']['results_dirname'] = priv_results_dirname - from agora_results.utils.tallies import tar_tallies + from tally_pipes.utils.tallies import tar_tallies tar_tallies(data_list, pipeline_info, pargs.tally, pargs.tar, pargs.election_id) # dump the results in CSV,JSON and PRETTY format in the diff --git a/agora_results/pipes/__init__.py b/tally_pipes/pipes/__init__.py similarity index 100% rename from agora_results/pipes/__init__.py rename to tally_pipes/pipes/__init__.py diff --git a/agora_results/pipes/ballot_boxes.py b/tally_pipes/pipes/ballot_boxes.py similarity index 97% rename from agora_results/pipes/ballot_boxes.py rename to tally_pipes/pipes/ballot_boxes.py index ab237bb..bf1d33c 100644 --- a/agora_results/pipes/ballot_boxes.py +++ b/tally_pipes/pipes/ballot_boxes.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import re import os diff --git a/agora_results/pipes/bcnencomu.py b/tally_pipes/pipes/bcnencomu.py similarity index 79% rename from agora_results/pipes/bcnencomu.py rename to tally_pipes/pipes/bcnencomu.py index 1064b98..b28bd8b 100644 --- a/agora_results/pipes/bcnencomu.py +++ b/tally_pipes/pipes/bcnencomu.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . from collections import defaultdict diff --git a/agora_results/pipes/desborda.py b/tally_pipes/pipes/desborda.py similarity index 88% rename from agora_results/pipes/desborda.py rename to tally_pipes/pipes/desborda.py index f12d5ed..2bba4da 100644 --- a/agora_results/pipes/desborda.py +++ b/tally_pipes/pipes/desborda.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2017 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2017 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . # Definition of this system: # http://pabloechenique.info/wp-content/uploads/2016/12/DesBorda-sistema-Echenique.pdf @@ -80,7 +80,7 @@ def podemos_desborda(data_list, women_names=None, question_indexes=None): ''' Definition of this system: http://pabloechenique.info/wp-content/uploads/2016/12/DesBorda-sistema-Echenique.pdf - It is assumed that the desborda method in agora-tally has been already applied + It is assumed that the desborda method in tally-methods has been already applied ''' desborda = Desborda() desborda.desborda(data_list, women_names, question_indexes) diff --git a/agora_results/pipes/desborda2.py b/tally_pipes/pipes/desborda2.py similarity index 93% rename from agora_results/pipes/desborda2.py rename to tally_pipes/pipes/desborda2.py index ea37b6c..a34d242 100644 --- a/agora_results/pipes/desborda2.py +++ b/tally_pipes/pipes/desborda2.py @@ -1,25 +1,25 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2017 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2017 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . # Definition of this system: # Desborda 2 is a modification/generalization of desborda. # Desborda is defined here: # http://pabloechenique.info/wp-content/uploads/2016/12/DesBorda-sistema-Echenique.pdf -# It is assumed that the desborda2 method in agora-tally has been already applied +# It is assumed that the desborda2 method in tally-methods has been already applied # If N is the number of winners, then the maximum points for a candidate per # ballot will be: @@ -70,7 +70,7 @@ #for url in answer['urls']: #if url['title'] != 'Gender': #continue - #if url['url'] == 'https://agoravoting.com/api/gender/M': + #if url['url'] == 'https://sequentech.io/api/gender/M': #women_names.append(answer['text']) #break #return women_names @@ -138,7 +138,7 @@ def podemos_desborda2(data_list, women_names=None, question_indexes=None): Desborda 2 is a modification/generalization of desborda. Desborda is defined here: http://pabloechenique.info/wp-content/uploads/2016/12/DesBorda-sistema-Echenique.pdf - It is assumed that the desborda2 method in agora-tally has been already applied + It is assumed that the desborda2 method in tally-methods has been already applied If N is the number of winners, then the maximum points for a candidate per ballot will be: diff --git a/agora_results/pipes/desborda3.py b/tally_pipes/pipes/desborda3.py similarity index 79% rename from agora_results/pipes/desborda3.py rename to tally_pipes/pipes/desborda3.py index d586d03..30791c7 100644 --- a/agora_results/pipes/desborda3.py +++ b/tally_pipes/pipes/desborda3.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2017 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2017 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . # Definition of this system: # Desborda 3 is a modification/generalization of desborda 2. diff --git a/agora_results/pipes/desborda4.py b/tally_pipes/pipes/desborda4.py similarity index 96% rename from agora_results/pipes/desborda4.py rename to tally_pipes/pipes/desborda4.py index aadf744..d579417 100644 --- a/agora_results/pipes/desborda4.py +++ b/tally_pipes/pipes/desborda4.py @@ -1,23 +1,23 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2018 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2018 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . # Definition of this system: # Desborda 4 is a modification of desborda 2. -# It is assumed that the desborda2 method in agora-tally has been already applied +# It is assumed that the desborda2 method in tally-methods has been already applied # # The algorithm is: # A. Elección del/de la cabeza de lista. Para ello, se presentarán candidaturas @@ -59,8 +59,8 @@ # independientemente de su colocación en dicho tramo. # # La visión general es: -# 1. Cálculo de puntos por candidato (agora-tally) -# 2. Ordenado por puntos de candidatos (agora-tally) +# 1. Cálculo de puntos por candidato (tally-methods) +# 2. Ordenado por puntos de candidatos (tally-methods) # 3. Cálculo de puntos por equipos # 4. Reserva de puntos a los equipos minoritarios en los últimos puestos de los # primeros 25 (lista A). diff --git a/agora_results/pipes/desborda_base.py b/tally_pipes/pipes/desborda_base.py similarity index 96% rename from agora_results/pipes/desborda_base.py rename to tally_pipes/pipes/desborda_base.py index 2a5c56a..e29487d 100644 --- a/agora_results/pipes/desborda_base.py +++ b/tally_pipes/pipes/desborda_base.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2017 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2017 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . # Definition of this system: # Desborda 3 is a modification/generalization of desborda 2. @@ -49,7 +49,7 @@ def __get_women_names_from_question(self, question): for url in answer['urls']: if url['title'] != 'Gender': continue - if url['url'] == 'https://agoravoting.com/api/gender/M': + if url['url'] == 'https://sequentech.io/api/gender/M': women_names.append(answer['text']) break return women_names diff --git a/agora_results/pipes/duplicate_questions.py b/tally_pipes/pipes/duplicate_questions.py similarity index 93% rename from agora_results/pipes/duplicate_questions.py rename to tally_pipes/pipes/duplicate_questions.py index 4793055..c3daf2f 100644 --- a/agora_results/pipes/duplicate_questions.py +++ b/tally_pipes/pipes/duplicate_questions.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import json import copy diff --git a/agora_results/pipes/locale/ca/LC_MESSAGES/pipes.mo b/tally_pipes/pipes/locale/ca/LC_MESSAGES/pipes.mo similarity index 100% rename from agora_results/pipes/locale/ca/LC_MESSAGES/pipes.mo rename to tally_pipes/pipes/locale/ca/LC_MESSAGES/pipes.mo diff --git a/agora_results/pipes/locale/ca/LC_MESSAGES/pipes.po b/tally_pipes/pipes/locale/ca/LC_MESSAGES/pipes.po similarity index 73% rename from agora_results/pipes/locale/ca/LC_MESSAGES/pipes.po rename to tally_pipes/pipes/locale/ca/LC_MESSAGES/pipes.po index e22fc0a..932a00a 100644 --- a/agora_results/pipes/locale/ca/LC_MESSAGES/pipes.po +++ b/tally_pipes/pipes/locale/ca/LC_MESSAGES/pipes.po @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.9.1\n" -#: agora_results/pipes/pdf.py:129 +#: tally_pipes/pipes/pdf.py:129 msgid "" "Detailed and question by question results of the election {election_id} " "titled \"{election_title}\"." @@ -25,136 +25,136 @@ msgstr "" "A continuació es detallen, pregunta per pregunta, els resultats " "de la votació {election_id} titulada \"{election_title}\"." -#: agora_results/pipes/pdf.py:187 +#: tally_pipes/pipes/pdf.py:187 msgid "Results of the election tally {election_id} - {election_title}" msgstr "Resultats de l'escrutini de la votació {election_id} - {election_title}" -#: agora_results/pipes/pdf.py:263 +#: tally_pipes/pipes/pdf.py:263 msgid "Question {question_index}: {question_title}" msgstr "Pregunta {question_index}: {question_title}" -#: agora_results/pipes/pdf.py:266 +#: tally_pipes/pipes/pdf.py:266 msgid "Configuration Data" msgstr "Dades de configuració" -#: agora_results/pipes/pdf.py:280 +#: tally_pipes/pipes/pdf.py:280 msgid "First past the post, Plurality or Plurality at Large" msgstr "Vot en bloc o Escrutini Majoritari Plurinominal" -#: agora_results/pipes/pdf.py:284 +#: tally_pipes/pipes/pdf.py:284 msgid "Cumulative voting" msgstr "Vot acumulatiu" -#: agora_results/pipes/pdf.py:286 +#: tally_pipes/pipes/pdf.py:286 msgid "Borda Nauru or Borda Dowdall (1/n)" msgstr "Borda de Nauru o Borda Dowdall (1/n)" -#: agora_results/pipes/pdf.py:290 +#: tally_pipes/pipes/pdf.py:290 msgid "Pairwise comparison (beta distribution)" msgstr "Comparació de parells (distribució beta)" -#: agora_results/pipes/pdf.py:291 +#: tally_pipes/pipes/pdf.py:291 msgid "Desborda3" msgstr "Desborda3" -#: agora_results/pipes/pdf.py:292 +#: tally_pipes/pipes/pdf.py:292 msgid "Desborda2" msgstr "Desborda2" -#: agora_results/pipes/pdf.py:293 +#: tally_pipes/pipes/pdf.py:293 msgid "Desborda" msgstr "Desborda" -#: agora_results/pipes/pdf.py:301 +#: tally_pipes/pipes/pdf.py:301 msgid "Tally system" msgstr "Sistema de recompte" -#: agora_results/pipes/pdf.py:308 +#: tally_pipes/pipes/pdf.py:308 msgid "Minimum number of options a voter can select" msgstr "Nombre mínim d'opcions que pots escollir un votant" -#: agora_results/pipes/pdf.py:315 +#: tally_pipes/pipes/pdf.py:315 msgid "Maximum number of options a voter can select" msgstr "Nombre màxim d'opcions que pots escollir un votant" -#: agora_results/pipes/pdf.py:322 +#: tally_pipes/pipes/pdf.py:322 msgid "Number of winning options" msgstr "Nombre d'opcions guanyadores" -#: agora_results/pipes/pdf.py:329 +#: tally_pipes/pipes/pdf.py:329 msgid "Options appear in the voting booth in random order" msgstr "Les opcions apareixen a la cabina de votació en ordre aleatori" -#: agora_results/pipes/pdf.py:333 +#: tally_pipes/pipes/pdf.py:333 msgid "Yes" msgstr "Sí" -#: agora_results/pipes/pdf.py:338 +#: tally_pipes/pipes/pdf.py:338 msgid "No" msgstr "No" -#: agora_results/pipes/pdf.py:360 +#: tally_pipes/pipes/pdf.py:360 msgid "Participation in question {question_index}" msgstr "Participació en pregunta {question_index}" -#: agora_results/pipes/pdf.py:379 +#: tally_pipes/pipes/pdf.py:379 msgid "Total number of votes cast" msgstr "Nombre total de vots emesos" -#: agora_results/pipes/pdf.py:384 +#: tally_pipes/pipes/pdf.py:384 msgid "Blank votes" msgstr "Vots en blanc" -#: agora_results/pipes/pdf.py:387 +#: tally_pipes/pipes/pdf.py:387 msgid "{blank_votes} ({percentage:.2%} over the total number of votes)" msgstr "{blank_votes} ({percentage:.2%} sobre el nombre total de vots)" -#: agora_results/pipes/pdf.py:399 +#: tally_pipes/pipes/pdf.py:399 msgid "Null votes" msgstr "Votos nulos" -#: agora_results/pipes/pdf.py:401 +#: tally_pipes/pipes/pdf.py:401 msgid "{null_votes} ({percentage:.2%} over the total number of votes)" msgstr "{null_votes} ({percentage:.2%} sobre el nombre total de vots)" -#: agora_results/pipes/pdf.py:414 +#: tally_pipes/pipes/pdf.py:414 msgid "Total number of votes for options" msgstr "Nombre total de vots a opcions" -#: agora_results/pipes/pdf.py:418 +#: tally_pipes/pipes/pdf.py:418 msgid "{valid_votes} ({percentage:.2%} over the total number of votes)" msgstr "{valid_votes} ({percentage:.2%} sobre el nombre total de vots)" -#: agora_results/pipes/pdf.py:431 +#: tally_pipes/pipes/pdf.py:431 msgid "Voting period start date" msgstr "Data d'inici de el període de vot" -#: agora_results/pipes/pdf.py:446 +#: tally_pipes/pipes/pdf.py:446 msgid "Voting period end date" msgstr "Data de fi de el període de vot" -#: agora_results/pipes/pdf.py:460 +#: tally_pipes/pipes/pdf.py:460 msgid "Tally end date" msgstr "Data de finalització de l'recompte" -#: agora_results/pipes/pdf.py:487 +#: tally_pipes/pipes/pdf.py:487 msgid "Candidate results" msgstr "resultats dels candidats" -#: agora_results/pipes/pdf.py:524 +#: tally_pipes/pipes/pdf.py:524 msgid "Name" msgstr "Nom" -#: agora_results/pipes/pdf.py:529 +#: tally_pipes/pipes/pdf.py:529 msgid "Points" msgstr "Punts" -#: agora_results/pipes/pdf.py:534 +#: tally_pipes/pipes/pdf.py:534 msgid "Winning position" msgstr "Posició guanyadora" -#: agora_results/pipes/pdf.py:540 agora_results/pipes/pretty_print.py:114 -#: agora_results/pipes/pretty_print.py:141 -#: agora_results/pipes/pretty_print.py:164 +#: tally_pipes/pipes/pdf.py:540 tally_pipes/pipes/pretty_print.py:114 +#: tally_pipes/pipes/pretty_print.py:141 +#: tally_pipes/pipes/pretty_print.py:164 msgid "{candidate_text} (Write-in)" msgstr "{candidate_text} (Write-in)" diff --git a/agora_results/pipes/locale/es/LC_MESSAGES/pipes.mo b/tally_pipes/pipes/locale/es/LC_MESSAGES/pipes.mo similarity index 100% rename from agora_results/pipes/locale/es/LC_MESSAGES/pipes.mo rename to tally_pipes/pipes/locale/es/LC_MESSAGES/pipes.mo diff --git a/agora_results/pipes/locale/es/LC_MESSAGES/pipes.po b/tally_pipes/pipes/locale/es/LC_MESSAGES/pipes.po similarity index 73% rename from agora_results/pipes/locale/es/LC_MESSAGES/pipes.po rename to tally_pipes/pipes/locale/es/LC_MESSAGES/pipes.po index 27d4e0d..cb70481 100644 --- a/agora_results/pipes/locale/es/LC_MESSAGES/pipes.po +++ b/tally_pipes/pipes/locale/es/LC_MESSAGES/pipes.po @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.9.1\n" -#: agora_results/pipes/pdf.py:129 +#: tally_pipes/pipes/pdf.py:129 msgid "" "Detailed and question by question results of the election {election_id} " "titled \"{election_title}\"." @@ -25,136 +25,136 @@ msgstr "" "A continuación se detallan, pregunta por pregunta, los resultados " "de la votación {election_id} titulada \"{election_title}\"." -#: agora_results/pipes/pdf.py:187 +#: tally_pipes/pipes/pdf.py:187 msgid "Results of the election tally {election_id} - {election_title}" msgstr "Resultados del escrutinio de la votación {election_id} - {election_title}" -#: agora_results/pipes/pdf.py:263 +#: tally_pipes/pipes/pdf.py:263 msgid "Question {question_index}: {question_title}" msgstr "Pregunta {question_index}: {question_title}" -#: agora_results/pipes/pdf.py:266 +#: tally_pipes/pipes/pdf.py:266 msgid "Configuration Data" msgstr "Datos de configuración" -#: agora_results/pipes/pdf.py:280 +#: tally_pipes/pipes/pdf.py:280 msgid "First past the post, Plurality or Plurality at Large" msgstr "Voto en bloque o Escrutinio Mayoritario Plurinominal" -#: agora_results/pipes/pdf.py:284 +#: tally_pipes/pipes/pdf.py:284 msgid "Cumulative voting" msgstr "Voto acumulativo" -#: agora_results/pipes/pdf.py:286 +#: tally_pipes/pipes/pdf.py:286 msgid "Borda Nauru or Borda Dowdall (1/n)" msgstr "Borda de Nauru o Borda Dowdall (1/n)" -#: agora_results/pipes/pdf.py:290 +#: tally_pipes/pipes/pdf.py:290 msgid "Pairwise comparison (beta distribution)" msgstr "Comparación de pares (distribución beta)" -#: agora_results/pipes/pdf.py:291 +#: tally_pipes/pipes/pdf.py:291 msgid "Desborda3" msgstr "Desborda3" -#: agora_results/pipes/pdf.py:292 +#: tally_pipes/pipes/pdf.py:292 msgid "Desborda2" msgstr "Desborda2" -#: agora_results/pipes/pdf.py:293 +#: tally_pipes/pipes/pdf.py:293 msgid "Desborda" msgstr "Desborda" -#: agora_results/pipes/pdf.py:301 +#: tally_pipes/pipes/pdf.py:301 msgid "Tally system" msgstr "Sistema de recuento" -#: agora_results/pipes/pdf.py:308 +#: tally_pipes/pipes/pdf.py:308 msgid "Minimum number of options a voter can select" msgstr "Número mínimo de opciones que puede seleccionar un votante" -#: agora_results/pipes/pdf.py:315 +#: tally_pipes/pipes/pdf.py:315 msgid "Maximum number of options a voter can select" msgstr "Número máximo de opciones que puede seleccionar un votante" -#: agora_results/pipes/pdf.py:322 +#: tally_pipes/pipes/pdf.py:322 msgid "Number of winning options" msgstr "Número de opciones ganadoras" -#: agora_results/pipes/pdf.py:329 +#: tally_pipes/pipes/pdf.py:329 msgid "Options appear in the voting booth in random order" msgstr "Las opciones aparecen en la cabina de votación en orden aleatorio" -#: agora_results/pipes/pdf.py:333 +#: tally_pipes/pipes/pdf.py:333 msgid "Yes" msgstr "Sí" -#: agora_results/pipes/pdf.py:338 +#: tally_pipes/pipes/pdf.py:338 msgid "No" msgstr "No" -#: agora_results/pipes/pdf.py:360 +#: tally_pipes/pipes/pdf.py:360 msgid "Participation in question {question_index}" msgstr "Participación en pregunta {question_index}" -#: agora_results/pipes/pdf.py:379 +#: tally_pipes/pipes/pdf.py:379 msgid "Total number of votes cast" msgstr "Número total de votos emitidos" -#: agora_results/pipes/pdf.py:384 +#: tally_pipes/pipes/pdf.py:384 msgid "Blank votes" msgstr "Votos en blanco" -#: agora_results/pipes/pdf.py:387 +#: tally_pipes/pipes/pdf.py:387 msgid "{blank_votes} ({percentage:.2%} over the total number of votes)" msgstr "{blank_votes} ({percentage:.2%} sobre el número total de votos)" -#: agora_results/pipes/pdf.py:399 +#: tally_pipes/pipes/pdf.py:399 msgid "Null votes" msgstr "Votos nulos" -#: agora_results/pipes/pdf.py:401 +#: tally_pipes/pipes/pdf.py:401 msgid "{null_votes} ({percentage:.2%} over the total number of votes)" msgstr "{null_votes} ({percentage:.2%} sobre el número total de votos)" -#: agora_results/pipes/pdf.py:414 +#: tally_pipes/pipes/pdf.py:414 msgid "Total number of votes for options" msgstr "Número total de votos a opciones" -#: agora_results/pipes/pdf.py:418 +#: tally_pipes/pipes/pdf.py:418 msgid "{valid_votes} ({percentage:.2%} over the total number of votes)" msgstr "{valid_votes} ({percentage:.2%} sobre el número total de votos)" -#: agora_results/pipes/pdf.py:431 +#: tally_pipes/pipes/pdf.py:431 msgid "Voting period start date" msgstr "Fecha de inicio del período de voto" -#: agora_results/pipes/pdf.py:446 +#: tally_pipes/pipes/pdf.py:446 msgid "Voting period end date" msgstr "Fecha de fin del período de voto" -#: agora_results/pipes/pdf.py:460 +#: tally_pipes/pipes/pdf.py:460 msgid "Tally end date" msgstr "Fecha de finalización del recuento" -#: agora_results/pipes/pdf.py:487 +#: tally_pipes/pipes/pdf.py:487 msgid "Candidate results" msgstr "Resultados de las candidaturas" -#: agora_results/pipes/pdf.py:524 +#: tally_pipes/pipes/pdf.py:524 msgid "Name" msgstr "Nombre" -#: agora_results/pipes/pdf.py:529 +#: tally_pipes/pipes/pdf.py:529 msgid "Points" msgstr "Puntos" -#: agora_results/pipes/pdf.py:534 +#: tally_pipes/pipes/pdf.py:534 msgid "Winning position" msgstr "Posición ganadora" -#: agora_results/pipes/pdf.py:540 agora_results/pipes/pretty_print.py:114 -#: agora_results/pipes/pretty_print.py:141 -#: agora_results/pipes/pretty_print.py:164 +#: tally_pipes/pipes/pdf.py:540 tally_pipes/pipes/pretty_print.py:114 +#: tally_pipes/pipes/pretty_print.py:141 +#: tally_pipes/pipes/pretty_print.py:164 msgid "{candidate_text} (Write-in)" msgstr "{candidate_text} (Write-in)" diff --git a/agora_results/pipes/locale/pipes.pot b/tally_pipes/pipes/locale/pipes.pot similarity index 59% rename from agora_results/pipes/locale/pipes.pot rename to tally_pipes/pipes/locale/pipes.pot index 21507b1..c01660f 100644 --- a/agora_results/pipes/locale/pipes.pot +++ b/tally_pipes/pipes/locale/pipes.pot @@ -1,13 +1,13 @@ -# Translations template for agora-results. +# Translations template for tally-pipes. # Copyright (C) 2021 ORGANIZATION -# This file is distributed under the same license as the agora-results +# This file is distributed under the same license as the tally-pipes # project. # FIRST AUTHOR , 2021. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: agora-results master\n" +"Project-Id-Version: tally-pipes master\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2021-10-15 09:00+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" @@ -18,144 +18,144 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.9.1\n" -#: agora_results/pipes/pdf.py:175 +#: tally_pipes/pipes/pdf.py:175 msgid "" "Detailed and question by question results of the election {election_id} " "titled \"{election_title}\"." msgstr "" -#: agora_results/pipes/pdf.py:182 +#: tally_pipes/pipes/pdf.py:182 msgid "Results of the election tally {election_id} - {election_title}" msgstr "" -#: agora_results/pipes/pdf.py:262 +#: tally_pipes/pipes/pdf.py:262 msgid "Question {question_index}: {question_title}" msgstr "" -#: agora_results/pipes/pdf.py:274 +#: tally_pipes/pipes/pdf.py:274 msgid "Configuration Data" msgstr "" -#: agora_results/pipes/pdf.py:287 +#: tally_pipes/pipes/pdf.py:287 msgid "First past the post, Plurality or Plurality at Large" msgstr "" -#: agora_results/pipes/pdf.py:290 +#: tally_pipes/pipes/pdf.py:290 msgid "Cumulative voting" msgstr "" -#: agora_results/pipes/pdf.py:291 +#: tally_pipes/pipes/pdf.py:291 msgid "Borda Nauru or Borda Dowdall (1/n)" msgstr "" -#: agora_results/pipes/pdf.py:293 +#: tally_pipes/pipes/pdf.py:293 msgid "Pairwise comparison (beta distribution)" msgstr "" -#: agora_results/pipes/pdf.py:294 +#: tally_pipes/pipes/pdf.py:294 msgid "Desborda3" msgstr "" -#: agora_results/pipes/pdf.py:295 +#: tally_pipes/pipes/pdf.py:295 msgid "Desborda2" msgstr "" -#: agora_results/pipes/pdf.py:296 +#: tally_pipes/pipes/pdf.py:296 msgid "Desborda" msgstr "" -#: agora_results/pipes/pdf.py:301 +#: tally_pipes/pipes/pdf.py:301 msgid "Tally system" msgstr "" -#: agora_results/pipes/pdf.py:308 +#: tally_pipes/pipes/pdf.py:308 msgid "Minimum number of options a voter can select" msgstr "" -#: agora_results/pipes/pdf.py:315 +#: tally_pipes/pipes/pdf.py:315 msgid "Maximum number of options a voter can select" msgstr "" -#: agora_results/pipes/pdf.py:322 +#: tally_pipes/pipes/pdf.py:322 msgid "Number of winning options" msgstr "" -#: agora_results/pipes/pdf.py:329 +#: tally_pipes/pipes/pdf.py:329 msgid "Options appear in the voting booth in random order" msgstr "" -#: agora_results/pipes/pdf.py:333 +#: tally_pipes/pipes/pdf.py:333 msgid "Yes" msgstr "" -#: agora_results/pipes/pdf.py:338 +#: tally_pipes/pipes/pdf.py:338 msgid "No" msgstr "" -#: agora_results/pipes/pdf.py:359 +#: tally_pipes/pipes/pdf.py:359 msgid "Participation in question {question_index}" msgstr "" -#: agora_results/pipes/pdf.py:377 +#: tally_pipes/pipes/pdf.py:377 msgid "Total number of votes cast" msgstr "" -#: agora_results/pipes/pdf.py:381 +#: tally_pipes/pipes/pdf.py:381 msgid "Blank votes" msgstr "" -#: agora_results/pipes/pdf.py:383 +#: tally_pipes/pipes/pdf.py:383 msgid "{blank_votes} ({percentage:.2%} over the total number of votes)" msgstr "" -#: agora_results/pipes/pdf.py:394 +#: tally_pipes/pipes/pdf.py:394 msgid "Null votes" msgstr "" -#: agora_results/pipes/pdf.py:396 +#: tally_pipes/pipes/pdf.py:396 msgid "{null_votes} ({percentage:.2%} over the total number of votes)" msgstr "" -#: agora_results/pipes/pdf.py:408 +#: tally_pipes/pipes/pdf.py:408 msgid "Total number of votes for options" msgstr "" -#: agora_results/pipes/pdf.py:412 +#: tally_pipes/pipes/pdf.py:412 msgid "{valid_votes} ({percentage:.2%} over the total number of votes)" msgstr "" -#: agora_results/pipes/pdf.py:424 +#: tally_pipes/pipes/pdf.py:424 msgid "Voting period start date" msgstr "" -#: agora_results/pipes/pdf.py:439 +#: tally_pipes/pipes/pdf.py:439 msgid "Voting period end date" msgstr "" -#: agora_results/pipes/pdf.py:453 +#: tally_pipes/pipes/pdf.py:453 msgid "Tally end date" msgstr "" -#: agora_results/pipes/pdf.py:479 +#: tally_pipes/pipes/pdf.py:479 msgid "Candidate results" msgstr "" -#: agora_results/pipes/pdf.py:515 +#: tally_pipes/pipes/pdf.py:515 msgid "Name" msgstr "" -#: agora_results/pipes/pdf.py:519 +#: tally_pipes/pipes/pdf.py:519 msgid "Points" msgstr "" -#: agora_results/pipes/pdf.py:523 +#: tally_pipes/pipes/pdf.py:523 msgid "Winning position" msgstr "" -#: agora_results/pipes/pdf.py:540 agora_results/pipes/pdf.py:561 -#: agora_results/pipes/pretty_print.py:126 -#: agora_results/pipes/pretty_print.py:153 -#: agora_results/pipes/pretty_print.py:176 +#: tally_pipes/pipes/pdf.py:540 tally_pipes/pipes/pdf.py:561 +#: tally_pipes/pipes/pretty_print.py:126 +#: tally_pipes/pipes/pretty_print.py:153 +#: tally_pipes/pipes/pretty_print.py:176 msgid "{candidate_text} (Write-in)" msgstr "" diff --git a/agora_results/pipes/modifications.py b/tally_pipes/pipes/modifications.py similarity index 96% rename from agora_results/pipes/modifications.py rename to tally_pipes/pipes/modifications.py index 7424cfb..d4c0427 100644 --- a/agora_results/pipes/modifications.py +++ b/tally_pipes/pipes/modifications.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import re import os diff --git a/agora_results/pipes/multipart.py b/tally_pipes/pipes/multipart.py similarity index 97% rename from agora_results/pipes/multipart.py rename to tally_pipes/pipes/multipart.py index 38615bb..30296b9 100644 --- a/agora_results/pipes/multipart.py +++ b/tally_pipes/pipes/multipart.py @@ -1,17 +1,17 @@ -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import os import json @@ -23,7 +23,7 @@ import copy import types from glob import glob -import agora_tally.tally +import tally_methods.tally def curate_text(text): text = text.replace(""", '"') @@ -41,7 +41,7 @@ def remove_accents(text): def make_multipart(data_list, election_ids, help=""): ''' - check that the agora-results is being correctly invoked + check that the tally-pipes is being correctly invoked ''' for election_id, data in zip(election_ids, data_list): data['id'] = election_id @@ -242,7 +242,7 @@ def multipart_tally_plaintexts_joiner(data_list, mappings, silent=False, ''' Converts ballots (plaintexts) from different election tallies that share some candidates, into a common "final" ballots format, then saves it to be tallied - later by agora-tally. + later by tally-methods. Similar to reduce answers with corrections, but the technique used here is to append the list of ballots from different elections into the plaintexts @@ -351,13 +351,13 @@ def translate_ballot(line, dindex, qindex, src_question, dst_question): Reads a ballot string, decodes it, translate it from source tally numbering to dest tally numbering, then encodes it again and returns it. - Works with all the voting systems in agora-tally, including + Works with all the voting systems in tally-methods, including pairwise-beta. ''' # 1. DECODE # - # copied from agora_tally/tally.py and - # agora_tally/voting_systems/plurality_at_large.py: + # copied from tally_methods/tally.py and + # tally_methods/voting_systems/plurality_at_large.py: # Note line starts with " (1 character) and ends with # "\n (2 characters). It contains the index of the diff --git a/agora_results/pipes/parity.py b/tally_pipes/pipes/parity.py similarity index 97% rename from agora_results/pipes/parity.py rename to tally_pipes/pipes/parity.py index 05a1d76..69fab08 100644 --- a/agora_results/pipes/parity.py +++ b/tally_pipes/pipes/parity.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . from itertools import zip_longest from operator import itemgetter @@ -45,7 +45,7 @@ def __get_women_names_from_question(question): for url in answer['urls']: if url['title'] != 'Gender': continue - if url['url'] == 'https://agoravoting.com/api/gender/M': + if url['url'] == 'https://sequentech.io/api/gender/M': women_names.append(answer['text']) break return women_names @@ -177,7 +177,7 @@ def mapped(el): is_phantom=True, urls=[dict( title="Gender", - url="https://agoravoting.com/api/gender/" + phantom[-1])], + url="https://sequentech.io/api/gender/" + phantom[-1])], total_count=__BIGGEST_COUNT - i)) women = filter_women(question['answers'], women_names) @@ -507,7 +507,7 @@ def generate_test_data(sexes): "urls": [ { "title": "Gender", - "url": "https://agoravoting.com/api/gender/" + sex + "url": "https://sequentech.io/api/gender/" + sex } ] } diff --git a/agora_results/pipes/pdf.py b/tally_pipes/pipes/pdf.py similarity index 98% rename from agora_results/pipes/pdf.py rename to tally_pipes/pipes/pdf.py index 9bc46be..35541f5 100644 --- a/agora_results/pipes/pdf.py +++ b/tally_pipes/pipes/pdf.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2016-2021 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2016-2021 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import os import re @@ -142,7 +142,7 @@ def _header_footer(canvas, doc, hide_logo): # Header header = Image( - '/home/agoraelections/agora-results/img/nvotes_logo.jpg', + '/home/ballotbox/tally-pipes/img/sequent_logo.jpg', height=20, width=80 ) diff --git a/agora_results/pipes/podemos.py b/tally_pipes/pipes/podemos.py similarity index 95% rename from agora_results/pipes/podemos.py rename to tally_pipes/pipes/podemos.py index 00d8b62..956a39c 100644 --- a/agora_results/pipes/podemos.py +++ b/tally_pipes/pipes/podemos.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import json from itertools import groupby, chain diff --git a/agora_results/pipes/pretty_print.py b/tally_pipes/pipes/pretty_print.py similarity index 95% rename from agora_results/pipes/pretty_print.py rename to tally_pipes/pipes/pretty_print.py index 3e3a7cd..a71bf0d 100644 --- a/agora_results/pipes/pretty_print.py +++ b/tally_pipes/pipes/pretty_print.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import os import subprocess diff --git a/agora_results/pipes/results.py b/tally_pipes/pipes/results.py similarity index 87% rename from agora_results/pipes/results.py rename to tally_pipes/pipes/results.py index 558dc45..eb36e3a 100644 --- a/agora_results/pipes/results.py +++ b/tally_pipes/pipes/results.py @@ -1,24 +1,24 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import os import json -import agora_tally.tally -from agora_tally.voting_systems.base import BlankVoteException +import tally_methods.tally +from tally_methods.voting_systems.base import BlankVoteException from collections import defaultdict def do_tallies( @@ -35,7 +35,7 @@ def do_tallies( fprint = print monkey_patcher=None - # ballots_fprint is indicated by agora-results to write ballots.csv and + # ballots_fprint is indicated by tally-pipes to write ballots.csv and # ballots.json if 'ballots_printer' in data_list[0]: ballots_printer = data_list[0]['ballots_printer'] @@ -63,7 +63,7 @@ def parse_vote_wrapper(number, question, q_withdrawals): tally.parse_vote = parse_vote_wrapper - # ballots_printer is indicated by agora-results to write ballots.csv and + # ballots_printer is indicated by tally-pipes to write ballots.csv and # ballots.json if 'ballots_printer' in data_list[0]: monkey_patcher = __patcher @@ -98,7 +98,7 @@ def parse_vote_wrapper(number, question, q_withdrawals): for question in questions_json: withdrawals = data.get('withdrawals', []) - results = agora_tally.tally.do_tally( + results = tally_methods.tally.do_tally( data['extract_dir'], questions_json, tallies, diff --git a/agora_results/pipes/sort.py b/tally_pipes/pipes/sort.py similarity index 95% rename from agora_results/pipes/sort.py rename to tally_pipes/pipes/sort.py index 593be12..0720e14 100644 --- a/agora_results/pipes/sort.py +++ b/tally_pipes/pipes/sort.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import json from itertools import groupby, chain diff --git a/agora_results/pipes/stv_tiebreak.py b/tally_pipes/pipes/stv_tiebreak.py similarity index 93% rename from agora_results/pipes/stv_tiebreak.py rename to tally_pipes/pipes/stv_tiebreak.py index 6b50aea..7bf8bca 100644 --- a/agora_results/pipes/stv_tiebreak.py +++ b/tally_pipes/pipes/stv_tiebreak.py @@ -1,25 +1,25 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import os import copy import json import subprocess -import agora_tally.tally +import tally_methods.tally from itertools import groupby, chain # TODO OUTDATED @@ -36,7 +36,7 @@ def stv_first_round_tiebreak(data_list): data = data_list[0] # get the log to get the rounds tallies = [] - result = agora_tally.tally.do_tally(data['extract_dir'], + result = tally_methods.tally.do_tally(data['extract_dir'], data['result']['counts'], tallies) diff --git a/agora_results/pipes/withdraw_candidates.py b/tally_pipes/pipes/withdraw_candidates.py similarity index 86% rename from agora_results/pipes/withdraw_candidates.py rename to tally_pipes/pipes/withdraw_candidates.py index 19449f5..3d37347 100644 --- a/agora_results/pipes/withdraw_candidates.py +++ b/tally_pipes/pipes/withdraw_candidates.py @@ -1,19 +1,19 @@ # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2017 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2017 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import math diff --git a/agora_results/utils/deterministic_tar.py b/tally_pipes/utils/deterministic_tar.py similarity index 95% rename from agora_results/utils/deterministic_tar.py rename to tally_pipes/utils/deterministic_tar.py index 90662e6..4fedeec 100644 --- a/agora_results/utils/deterministic_tar.py +++ b/tally_pipes/utils/deterministic_tar.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # -# This file is part of agora-tools. -# Copyright (C) 2013-2016 Eduardo Robles Elvira +# This file is part of misc-tools. +# Copyright (C) 2013-2016 Eduardo Robles Elvira # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by diff --git a/agora_results/utils/file_helpers.py b/tally_pipes/utils/file_helpers.py similarity index 74% rename from agora_results/utils/file_helpers.py rename to tally_pipes/utils/file_helpers.py index 363caa4..d4ae3cb 100644 --- a/agora_results/utils/file_helpers.py +++ b/tally_pipes/utils/file_helpers.py @@ -1,20 +1,20 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- -# This file is part of agora-tally. -# Copyright (C) 2017 Agora Voting SL +# This file is part of tally-methods. +# Copyright (C) 2017 Sequent Tech Inc -# agora-tally is free software: you can redistribute it and/or modify +# tally-methods is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-tally is distributed in the hope that it will be useful, +# tally-methods 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-tally. If not, see . +# along with tally-methods. If not, see . import codecs import json diff --git a/agora_results/utils/join_by_name.py b/tally_pipes/utils/join_by_name.py similarity index 86% rename from agora_results/utils/join_by_name.py rename to tally_pipes/utils/join_by_name.py index 26cb85a..7ecc39c 100644 --- a/agora_results/utils/join_by_name.py +++ b/tally_pipes/utils/join_by_name.py @@ -1,19 +1,19 @@ #!/usr/bin/env python3 -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import argparse import json diff --git a/agora_results/utils/tallies.py b/tally_pipes/utils/tallies.py similarity index 78% rename from agora_results/utils/tallies.py rename to tally_pipes/utils/tallies.py index 16c1a17..c30e40c 100644 --- a/agora_results/utils/tallies.py +++ b/tally_pipes/utils/tallies.py @@ -1,23 +1,23 @@ -# This file is part of agora-results. -# Copyright (C) 2014-2016 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2014-2016 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import os import json import tempfile import shutil -from agora_results.utils.deterministic_tar import deterministic_tar_open, deterministic_tar_add +from tally_pipes.utils.deterministic_tar import deterministic_tar_open, deterministic_tar_add def tar_tallies(data_list, config, tar_list, destdir, eid): diff --git a/test/desborda4_tests/test_0 b/test/desborda4_tests/test_0 index ef5b8cb..9109770 100644 --- a/test/desborda4_tests/test_0 +++ b/test/desborda4_tests/test_0 @@ -50,7 +50,7 @@ Config results: "version": "1.0", "pipes": [ { - "type": "agora_results.pipes.duplicate_questions.duplicate_questions", + "type": "tally_pipes.pipes.duplicate_questions.duplicate_questions", "params": { "duplications": [ { @@ -62,7 +62,7 @@ Config results: } }, { - "type": "agora_results.pipes.modifications.apply_modifications", + "type": "tally_pipes.pipes.modifications.apply_modifications", "params": { "modifications": [ { @@ -80,19 +80,19 @@ Config results: } }, { - "type": "agora_results.pipes.results.do_tallies", + "type": "tally_pipes.pipes.results.do_tallies", "params": { "ignore_invalid_votes": true } }, { - "type": "agora_results.pipes.sort.sort_non_iterative", + "type": "tally_pipes.pipes.sort.sort_non_iterative", "params": { "question_indexes": [0] } }, { - "type": "agora_results.pipes.desborda4.podemos_desborda4", + "type": "tally_pipes.pipes.desborda4.podemos_desborda4", "params": { "question_index": 1, "first_winner_question_index": 0 diff --git a/test/desborda4_tests/test_1 b/test/desborda4_tests/test_1 index 451e6d8..9ebdae8 100644 --- a/test/desborda4_tests/test_1 +++ b/test/desborda4_tests/test_1 @@ -50,7 +50,7 @@ Config results: "version": "1.0", "pipes": [ { - "type": "agora_results.pipes.duplicate_questions.duplicate_questions", + "type": "tally_pipes.pipes.duplicate_questions.duplicate_questions", "params": { "duplications": [ { @@ -62,7 +62,7 @@ Config results: } }, { - "type": "agora_results.pipes.modifications.apply_modifications", + "type": "tally_pipes.pipes.modifications.apply_modifications", "params": { "modifications": [ { @@ -87,19 +87,19 @@ Config results: } }, { - "type": "agora_results.pipes.results.do_tallies", + "type": "tally_pipes.pipes.results.do_tallies", "params": { "ignore_invalid_votes": true } }, { - "type": "agora_results.pipes.sort.sort_non_iterative", + "type": "tally_pipes.pipes.sort.sort_non_iterative", "params": { "question_indexes": [0] } }, { - "type": "agora_results.pipes.desborda4.podemos_desborda4", + "type": "tally_pipes.pipes.desborda4.podemos_desborda4", "params": { "question_index": 1, "first_winner_question_index": 0 diff --git a/test/desborda4_tests/test_2 b/test/desborda4_tests/test_2 index 5925eda..1f6c7dc 100644 --- a/test/desborda4_tests/test_2 +++ b/test/desborda4_tests/test_2 @@ -50,7 +50,7 @@ Config results: "version": "1.0", "pipes": [ { - "type": "agora_results.pipes.duplicate_questions.duplicate_questions", + "type": "tally_pipes.pipes.duplicate_questions.duplicate_questions", "params": { "duplications": [ { @@ -62,7 +62,7 @@ Config results: } }, { - "type": "agora_results.pipes.modifications.apply_modifications", + "type": "tally_pipes.pipes.modifications.apply_modifications", "params": { "modifications": [ { @@ -87,26 +87,26 @@ Config results: } }, { - "type": "agora_results.pipes.results.do_tallies", + "type": "tally_pipes.pipes.results.do_tallies", "params": { "ignore_invalid_votes": true } }, { - "type": "agora_results.pipes.sort.sort_non_iterative", + "type": "tally_pipes.pipes.sort.sort_non_iterative", "params": { "question_indexes": [0] } }, { - "type": "agora_results.pipes.desborda4.podemos_desborda4", + "type": "tally_pipes.pipes.desborda4.podemos_desborda4", "params": { "question_index": 1, "first_winner_question_index": 0 } }, { - "type": "agora_results.pipes.parity.parity_zip_non_iterative", + "type": "tally_pipes.pipes.parity.parity_zip_non_iterative", "params": { "question_indexes": [0, 1] } diff --git a/test/desborda4_tests/test_3 b/test/desborda4_tests/test_3 index 367978e..0328f82 100644 --- a/test/desborda4_tests/test_3 +++ b/test/desborda4_tests/test_3 @@ -48,7 +48,7 @@ Config results: "version": "1.0", "pipes": [ { - "type": "agora_results.pipes.duplicate_questions.duplicate_questions", + "type": "tally_pipes.pipes.duplicate_questions.duplicate_questions", "params": { "duplications": [ { @@ -60,7 +60,7 @@ Config results: } }, { - "type": "agora_results.pipes.modifications.apply_modifications", + "type": "tally_pipes.pipes.modifications.apply_modifications", "params": { "modifications": [ { @@ -85,19 +85,19 @@ Config results: } }, { - "type": "agora_results.pipes.results.do_tallies", + "type": "tally_pipes.pipes.results.do_tallies", "params": { "ignore_invalid_votes": true } }, { - "type": "agora_results.pipes.sort.sort_non_iterative", + "type": "tally_pipes.pipes.sort.sort_non_iterative", "params": { "question_indexes": [0] } }, { - "type": "agora_results.pipes.desborda4.podemos_desborda4", + "type": "tally_pipes.pipes.desborda4.podemos_desborda4", "params": { "question_index": 1, "first_winner_question_index": 0 diff --git a/test/desborda4_tests/test_4 b/test/desborda4_tests/test_4 index 67f76fa..e05dc7d 100644 --- a/test/desborda4_tests/test_4 +++ b/test/desborda4_tests/test_4 @@ -50,7 +50,7 @@ Config results: "version": "1.0", "pipes": [ { - "type": "agora_results.pipes.duplicate_questions.duplicate_questions", + "type": "tally_pipes.pipes.duplicate_questions.duplicate_questions", "params": { "duplications": [ { @@ -62,7 +62,7 @@ Config results: } }, { - "type": "agora_results.pipes.modifications.apply_modifications", + "type": "tally_pipes.pipes.modifications.apply_modifications", "params": { "modifications": [ { @@ -87,32 +87,32 @@ Config results: } }, { - "type": "agora_results.pipes.results.do_tallies", + "type": "tally_pipes.pipes.results.do_tallies", "params": { "ignore_invalid_votes": true } }, { - "type": "agora_results.pipes.sort.sort_non_iterative", + "type": "tally_pipes.pipes.sort.sort_non_iterative", "params": { "question_indexes": [0] } }, { - "type": "agora_results.pipes.desborda4.podemos_desborda4", + "type": "tally_pipes.pipes.desborda4.podemos_desborda4", "params": { "question_index": 1, "first_winner_question_index": 0 } }, { - "type": "agora_results.pipes.parity.parity_zip_non_iterative", + "type": "tally_pipes.pipes.parity.parity_zip_non_iterative", "params": { "question_indexes": [0, 1] } }, { - "type": "agora_results.pipes.parity.podemos_parity2_loreg_zip_non_iterative", + "type": "tally_pipes.pipes.parity.podemos_parity2_loreg_zip_non_iterative", "params": { "question_index": 1, "proportions": [3, 2], diff --git a/test/desborda_test.py b/test/desborda_test.py index 7ebb7c0..2e3b54e 100644 --- a/test/desborda_test.py +++ b/test/desborda_test.py @@ -1,20 +1,20 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2017-2021 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2017-2021 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import string import re @@ -22,9 +22,9 @@ import json import os from os import urandom -from agora_results.utils import file_helpers -from agora_results.main import main, VERSION -from agora_tally.ballot_codec.nvotes_codec import NVotesCodec +from tally_pipes.utils import file_helpers +from tally_pipes.main import main, VERSION +from tally_methods.ballot_codec.sequent_codec import NVotesCodec import tempfile import uuid import tarfile @@ -317,9 +317,9 @@ def create_desborda_test( candidate_is_woman = candidate in women_names gender_url = { "title": "Gender", - "url": ("https://agoravoting.com/api/gender/M" \ + "url": ("https://sequentech.io/api/gender/M" \ if candidate_is_woman \ - else "https://agoravoting.com/api/gender/H") + else "https://sequentech.io/api/gender/H") } answer["urls"].append(gender_url) question["answers"].append(answer) diff --git a/test/output_tests/test_output_1 b/test/output_tests/test_output_1 index fe9d75f..a0cf214 100644 --- a/test/output_tests/test_output_1 +++ b/test/output_tests/test_output_1 @@ -14,6 +14,6 @@ Ballots CSV: 0,"3. C1f","0. A1f","2. D1m" Ballots JSON: -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/M", "ballot_marks": 0, "category": "A", "details": "A1f", "id": 0, "text": "A1f", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 1, "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "D", "details": "D1m", "id": 2, "text": "D1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 3, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "borda", "title": "Desborda question"} -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/M", "ballot_marks": 0, "category": "A", "details": "A1f", "id": 0, "text": "A1f", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 1, "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 2, "category": "D", "details": "D1m", "id": 2, "text": "D1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 3, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "borda", "title": "Desborda question"} -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/M", "ballot_marks": 1, "category": "A", "details": "A1f", "id": 0, "text": "A1f", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 2, "category": "D", "details": "D1m", "id": 2, "text": "D1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "ballot_marks": 0, "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 3, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "borda", "title": "Desborda question"} +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/M", "ballot_marks": 0, "category": "A", "details": "A1f", "id": 0, "text": "A1f", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 1, "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "D", "details": "D1m", "id": 2, "text": "D1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 3, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "borda", "title": "Desborda question"} +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/M", "ballot_marks": 0, "category": "A", "details": "A1f", "id": 0, "text": "A1f", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 1, "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 2, "category": "D", "details": "D1m", "id": 2, "text": "D1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 3, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "borda", "title": "Desborda question"} +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/M", "ballot_marks": 1, "category": "A", "details": "A1f", "id": 0, "text": "A1f", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 2, "category": "D", "details": "D1m", "id": 2, "text": "D1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "ballot_marks": 0, "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 3, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "borda", "title": "Desborda question"} diff --git a/test/output_tests/test_output_2 b/test/output_tests/test_output_2 index d7c61b4..ef0e3e4 100644 --- a/test/output_tests/test_output_2 +++ b/test/output_tests/test_output_2 @@ -16,7 +16,7 @@ Ballots CSV: 0,"2. C1f" Ballots JSON: -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "category": "C", "details": "C1f", "id": 2, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 1, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "category": "C", "details": "C1f", "id": 2, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 1, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/H", "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 1, "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "category": "C", "details": "C1f", "id": 2, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 1, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/H", "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "ballot_marks": 1, "category": "C", "details": "C1f", "id": 2, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 1, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} \ No newline at end of file +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "category": "C", "details": "C1f", "id": 2, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 1, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "category": "C", "details": "C1f", "id": 2, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 1, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/H", "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 1, "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "category": "C", "details": "C1f", "id": 2, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 1, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/H", "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "B", "details": "B1m", "id": 1, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "ballot_marks": 1, "category": "C", "details": "C1f", "id": 2, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 1, "min": 0, "num_winners": 3, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} \ No newline at end of file diff --git a/test/output_tests/test_output_3 b/test/output_tests/test_output_3 index 8c6d478..fe67fd4 100644 --- a/test/output_tests/test_output_3 +++ b/test/output_tests/test_output_3 @@ -17,7 +17,7 @@ Ballots CSV: 0,"3. C1f" Ballots JSON: -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A2m", "id": 1, "text": "A2m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "B", "details": "B1m", "id": 2, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 2, "min": 0, "num_winners": 4, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "A", "details": "A2m", "id": 1, "text": "A2m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "B", "details": "B1m", "id": 2, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 2, "min": 0, "num_winners": 4, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/H", "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "A", "details": "A2m", "id": 1, "text": "A2m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "ballot_marks": 1, "category": "B", "details": "B1m", "id": 2, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 2, "min": 0, "num_winners": 4, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} -{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://agoravoting.com/api/gender/H", "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "A", "details": "A2m", "id": 1, "text": "A2m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/H", "category": "B", "details": "B1m", "id": 2, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://agoravoting.com/api/gender/M", "ballot_marks": 1, "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 2, "min": 0, "num_winners": 4, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} \ No newline at end of file +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A2m", "id": 1, "text": "A2m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "B", "details": "B1m", "id": 2, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 2, "min": 0, "num_winners": 4, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 1, "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "A", "details": "A2m", "id": 1, "text": "A2m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "B", "details": "B1m", "id": 2, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 2, "min": 0, "num_winners": 4, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/H", "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "A", "details": "A2m", "id": 1, "text": "A2m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "ballot_marks": 1, "category": "B", "details": "B1m", "id": 2, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 2, "min": 0, "num_winners": 4, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} +{"answer_total_votes_percentage": "over-total-valid-votes", "answers": [{"Gender": "https://sequentech.io/api/gender/H", "category": "A", "details": "A1m", "id": 0, "text": "A1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "A", "details": "A2m", "id": 1, "text": "A2m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/H", "category": "B", "details": "B1m", "id": 2, "text": "B1m", "total_count": 0, "urls": []}, {"Gender": "https://sequentech.io/api/gender/M", "ballot_marks": 1, "category": "C", "details": "C1f", "id": 3, "text": "C1f", "total_count": 0, "urls": []}], "ballot_flags": {"blank_vote": false, "null_vote": false}, "description": "Desborda question", "election_index": 0, "layout": "simple", "max": 2, "min": 0, "num_winners": 4, "question_num": 0, "randomize_answer_order": true, "tally_type": "plurality-at-large", "title": "Desborda question"} \ No newline at end of file diff --git a/test/pipes-whitelist.txt b/test/pipes-whitelist.txt index 4c9be76..641a8ad 100644 --- a/test/pipes-whitelist.txt +++ b/test/pipes-whitelist.txt @@ -1,30 +1,30 @@ -agora_results.pipes.desborda.podemos_desborda -agora_results.pipes.desborda2.podemos_desborda2 -agora_results.pipes.desborda3.podemos_desborda3 -agora_results.pipes.desborda4.podemos_desborda4 -agora_results.pipes.duplicate_questions.duplicate_questions -agora_results.pipes.modifications.apply_modifications -agora_results.pipes.multipart.make_multipart -agora_results.pipes.multipart.election_max_size_corrections -agora_results.pipes.multipart.question_totals_with_corrections -agora_results.pipes.multipart.reduce_answers_with_corrections -agora_results.pipes.multipart.multipart_tally_plaintexts_append_joiner -agora_results.pipes.multipart.data_list_reverse -agora_results.pipes.multipart.multipart_tally_plaintexts_joiner -agora_results.pipes.multipart.append_ballots -agora_results.pipes.parity.proportion_rounded -agora_results.pipes.parity.parity_zip_non_iterative -agora_results.pipes.parity.reorder_winners -agora_results.pipes.parity.podemos_parity_loreg_zip_non_iterative -agora_results.pipes.parity.podemos_parity2_loreg_zip_non_iterative -agora_results.pipes.podemos.podemos_proportion_rounded_and_duplicates -agora_results.pipes.pretty_print.pretty_print_stv_winners -agora_results.pipes.pretty_print.pretty_print_not_iterative -agora_results.pipes.results.do_tallies -agora_results.pipes.results.to_files -agora_results.pipes.results.apply_removals -agora_results.pipes.sort.sort_non_iterative -agora_results.pipes.stv_tiebreak.stv_first_round_tiebreak -agora_results.pipes.pdf.configure_pdf -agora_results.pipes.withdraw_candidates.withdraw_candidates -agora_results.pipes.ballot_boxes.count_tally_sheets +tally_pipes.pipes.desborda.podemos_desborda +tally_pipes.pipes.desborda2.podemos_desborda2 +tally_pipes.pipes.desborda3.podemos_desborda3 +tally_pipes.pipes.desborda4.podemos_desborda4 +tally_pipes.pipes.duplicate_questions.duplicate_questions +tally_pipes.pipes.modifications.apply_modifications +tally_pipes.pipes.multipart.make_multipart +tally_pipes.pipes.multipart.election_max_size_corrections +tally_pipes.pipes.multipart.question_totals_with_corrections +tally_pipes.pipes.multipart.reduce_answers_with_corrections +tally_pipes.pipes.multipart.multipart_tally_plaintexts_append_joiner +tally_pipes.pipes.multipart.data_list_reverse +tally_pipes.pipes.multipart.multipart_tally_plaintexts_joiner +tally_pipes.pipes.multipart.append_ballots +tally_pipes.pipes.parity.proportion_rounded +tally_pipes.pipes.parity.parity_zip_non_iterative +tally_pipes.pipes.parity.reorder_winners +tally_pipes.pipes.parity.podemos_parity_loreg_zip_non_iterative +tally_pipes.pipes.parity.podemos_parity2_loreg_zip_non_iterative +tally_pipes.pipes.podemos.podemos_proportion_rounded_and_duplicates +tally_pipes.pipes.pretty_print.pretty_print_stv_winners +tally_pipes.pipes.pretty_print.pretty_print_not_iterative +tally_pipes.pipes.results.do_tallies +tally_pipes.pipes.results.to_files +tally_pipes.pipes.results.apply_removals +tally_pipes.pipes.sort.sort_non_iterative +tally_pipes.pipes.stv_tiebreak.stv_first_round_tiebreak +tally_pipes.pipes.pdf.configure_pdf +tally_pipes.pipes.withdraw_candidates.withdraw_candidates +tally_pipes.pipes.ballot_boxes.count_tally_sheets diff --git a/test/plurality_tally_sheets/test_0 b/test/plurality_tally_sheets/test_0 index 11c6d24..be57e91 100644 --- a/test/plurality_tally_sheets/test_0 +++ b/test/plurality_tally_sheets/test_0 @@ -13,7 +13,7 @@ Config results: "version": "1.0", "pipes": [ { - "type": "agora_results.pipes.ballot_boxes.count_tally_sheets", + "type": "tally_pipes.pipes.ballot_boxes.count_tally_sheets", "params": { "tally_sheets": [ { @@ -45,7 +45,7 @@ Config results: } }, { - "type": "agora_results.pipes.sort.sort_non_iterative", + "type": "tally_pipes.pipes.sort.sort_non_iterative", "params": { "question_indexes": [0] } diff --git a/test/plurality_tally_sheets/test_1 b/test/plurality_tally_sheets/test_1 index 7120af2..3b980fb 100644 --- a/test/plurality_tally_sheets/test_1 +++ b/test/plurality_tally_sheets/test_1 @@ -13,13 +13,13 @@ Config results: "version": "1.0", "pipes": [ { - "type": "agora_results.pipes.results.do_tallies", + "type": "tally_pipes.pipes.results.do_tallies", "params": { "ignore_invalid_votes": true } }, { - "type": "agora_results.pipes.ballot_boxes.count_tally_sheets", + "type": "tally_pipes.pipes.ballot_boxes.count_tally_sheets", "params": { "tally_sheets": [ { @@ -51,7 +51,7 @@ Config results: } }, { - "type": "agora_results.pipes.sort.sort_non_iterative", + "type": "tally_pipes.pipes.sort.sort_non_iterative", "params": { "question_indexes": [0] } diff --git a/test/plurality_tally_sheets/test_2 b/test/plurality_tally_sheets/test_2 index a9ddbcb..3765d2b 100644 --- a/test/plurality_tally_sheets/test_2 +++ b/test/plurality_tally_sheets/test_2 @@ -14,13 +14,13 @@ Config results: "version": "1.0", "pipes": [ { - "type": "agora_results.pipes.results.do_tallies", + "type": "tally_pipes.pipes.results.do_tallies", "params": { "ignore_invalid_votes": true } }, { - "type": "agora_results.pipes.ballot_boxes.count_tally_sheets", + "type": "tally_pipes.pipes.ballot_boxes.count_tally_sheets", "params": { "tally_sheets": [ { @@ -86,7 +86,7 @@ Config results: } }, { - "type": "agora_results.pipes.sort.sort_non_iterative", + "type": "tally_pipes.pipes.sort.sort_non_iterative", "params": { "question_indexes": [0] } diff --git a/test/plurality_tally_sheets/test_3 b/test/plurality_tally_sheets/test_3 index 8cfa871..38ed1ca 100644 --- a/test/plurality_tally_sheets/test_3 +++ b/test/plurality_tally_sheets/test_3 @@ -13,7 +13,7 @@ Config results: "version": "1.0", "pipes": [ { - "type": "agora_results.pipes.ballot_boxes.count_tally_sheets", + "type": "tally_pipes.pipes.ballot_boxes.count_tally_sheets", "params": { "tally_sheets": [ ], @@ -28,7 +28,7 @@ Config results: } }, { - "type": "agora_results.pipes.sort.sort_non_iterative", + "type": "tally_pipes.pipes.sort.sort_non_iterative", "params": { "question_indexes": [0] } diff --git a/test/tests.py b/test/tests.py index 4272325..ad601c6 100644 --- a/test/tests.py +++ b/test/tests.py @@ -1,26 +1,26 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- -# This file is part of agora-results. -# Copyright (C) 2017 Agora Voting SL +# This file is part of tally-pipes. +# Copyright (C) 2017 Sequent Tech Inc -# agora-results is free software: you can redistribute it and/or modify +# tally-pipes is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License. -# agora-results is distributed in the hope that it will be useful, +# tally-pipes 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License -# along with agora-results. If not, see . +# along with tally-pipes. If not, see . import unittest from unittest.mock import patch import json -from agora_results.utils import file_helpers -from agora_results.main import main, VERSION +from tally_pipes.utils import file_helpers +from tally_pipes.main import main, VERSION import test.desborda_test import os import sys @@ -68,9 +68,9 @@ def default(self, key): tally_config_desborda1 = dict( version=VERSION, pipes=[ - dict(type="agora_results.pipes.results.do_tallies", params={}), + dict(type="tally_pipes.pipes.results.do_tallies", params={}), dict( - type="agora_results.pipes.desborda.podemos_desborda", + type="tally_pipes.pipes.desborda.podemos_desborda", params={ "women_names": [] } @@ -81,9 +81,9 @@ def default(self, key): tally_config_desborda2 = dict( version=VERSION, pipes=[ - dict(type="agora_results.pipes.results.do_tallies", params={}), + dict(type="tally_pipes.pipes.results.do_tallies", params={}), dict( - type="agora_results.pipes.desborda2.podemos_desborda2", + type="tally_pipes.pipes.desborda2.podemos_desborda2", params={ "women_names": [ ] @@ -95,9 +95,9 @@ def default(self, key): tally_config_desborda3 = dict( version=VERSION, pipes=[ - dict(type="agora_results.pipes.results.do_tallies", params={}), + dict(type="tally_pipes.pipes.results.do_tallies", params={}), dict( - type="agora_results.pipes.desborda3.podemos_desborda3", + type="tally_pipes.pipes.desborda3.podemos_desborda3", params={ "women_names": [] } @@ -108,9 +108,9 @@ def default(self, key): tally_config_borda = dict( version=VERSION, pipes=[ - dict(type="agora_results.pipes.results.do_tallies", params={}), + dict(type="tally_pipes.pipes.results.do_tallies", params={}), dict( - type="agora_results.pipes.withdraw_candidates.withdraw_candidates", + type="tally_pipes.pipes.withdraw_candidates.withdraw_candidates", params={ "questions": [ { @@ -121,14 +121,14 @@ def default(self, key): ] } ), - dict(type="agora_results.pipes.sort.sort_non_iterative", params={}) + dict(type="tally_pipes.pipes.sort.sort_non_iterative", params={}) ] ) tally_config_cumulative = dict( version=VERSION, pipes=[ - dict(type="agora_results.pipes.results.do_tallies", params={}), + dict(type="tally_pipes.pipes.results.do_tallies", params={}), ] ) @@ -167,7 +167,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=False): if test_data is None: return print("\nTest name: %s" % test_data["name"]) - agora_results_bin_path = "python3 agora-results" + tally_pipes_bin_path = "python3 tally-pipes" tally_path = test.desborda_test.create_desborda_test(test_data, tally_type = "plurality-at-large", num_questions = num_questions, @@ -178,7 +178,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=False): pipes_whitelist = os.path.join("test", "pipes-whitelist.txt") results_path = os.path.join(tally_path, "12345.results.json") cmd = "%s -t %s -c %s -p %s -s -o json" % ( - agora_results_bin_path, + tally_pipes_bin_path, tally_targz_path, config_results_path, pipes_whitelist) @@ -233,7 +233,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=False): if test_data is None: return print("\nTest name: %s" % test_data["name"]) - agora_results_bin_path = "python3 agora-results" + tally_pipes_bin_path = "python3 tally-pipes" tally_path = test.desborda_test.create_desborda_test(test_data, tally_type = "borda", num_questions = num_questions, @@ -246,7 +246,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=False): tally_results_dir_path = os.path.join(tally_path, 'results-1') os.mkdir(tally_results_dir_path) cmd = "%s -t %s -c %s -x %s -eid 12345 -s -o json" % ( - agora_results_bin_path, + tally_pipes_bin_path, tally_targz_path, config_results_path, tally_path @@ -309,7 +309,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=True): if test_data is None: return print("\nTest name: %s" % test_data["name"]) - agora_results_bin_path = "python3 agora-results" + tally_pipes_bin_path = "python3 tally-pipes" tally_path = test.desborda_test.create_desborda_test(test_data, tally_type = "desborda2", num_questions = num_questions, @@ -320,7 +320,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=True): pipes_whitelist = os.path.join("test", "pipes-whitelist.txt") results_path = os.path.join(tally_path, "12345.results.json") cmd = "%s -t %s -c %s -p %s -s -o json" % ( - agora_results_bin_path, + tally_pipes_bin_path, tally_targz_path, config_results_path, pipes_whitelist) @@ -373,7 +373,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=False): if test_data is None: return print("\nTest name: %s" % test_data["name"]) - agora_results_bin_path = "python3 agora-results" + tally_pipes_bin_path = "python3 tally-pipes" tally_path = test.desborda_test.create_desborda_test(test_data, tally_type = "desborda3", num_questions = num_questions, @@ -384,7 +384,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=False): pipes_whitelist = os.path.join("test", "pipes-whitelist.txt") results_path = os.path.join(tally_path, "12345.results.json") cmd = "%s -t %s -c %s -p %s -s -o json" % ( - agora_results_bin_path, + tally_pipes_bin_path, tally_targz_path, config_results_path, pipes_whitelist) @@ -452,7 +452,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=False): if test_data is None: return print("\nTest name: %s" % test_data["name"]) - agora_results_bin_path = "python3 agora-results" + tally_pipes_bin_path = "python3 tally-pipes" tally_path = test.desborda_test.create_desborda_test(test_data, tally_type = "desborda2", num_questions = num_questions, @@ -463,7 +463,7 @@ def do_test(self, test_data=None, num_questions=1, women_in_urls=False): pipes_whitelist = os.path.join("test", "pipes-whitelist.txt") results_path = os.path.join(tally_path, "12345.results.json") cmd = "%s -t %s -c %s -p %s -s -o json" % ( - agora_results_bin_path, + tally_pipes_bin_path, tally_targz_path, config_results_path, pipes_whitelist) @@ -530,7 +530,7 @@ def do_test(self, test_data=None): if test_data is None: return print("\nTest name: %s" % test_data["name"]) - agora_results_bin_path = "python3 agora-results" + tally_pipes_bin_path = "python3 tally-pipes" tally_path = test.desborda_test.create_desborda_test(test_data) try: tally_targz_path = os.path.join(tally_path, "tally.tar.gz") @@ -538,7 +538,7 @@ def do_test(self, test_data=None): pipes_whitelist = os.path.join("test", "pipes-whitelist.txt") results_path = os.path.join(tally_path, "12345.results.json") cmd = "%s -t %s -c %s -p %s -s -o json" % ( - agora_results_bin_path, + tally_pipes_bin_path, tally_targz_path, config_results_path, pipes_whitelist) @@ -685,7 +685,7 @@ def do_test( results_path = os.path.join(tally_path, "12345.results.json") tally_results_dir_path = os.path.join(tally_path, 'results-1') os.mkdir(tally_results_dir_path) - cmd = "agora-results -t %s -c %s -x %s -eid 12345 -s -o json" % ( + cmd = "tally-pipes -t %s -c %s -x %s -eid 12345 -s -o json" % ( tally_targz_path, config_results_path, tally_path @@ -749,7 +749,7 @@ def do_test( return print("\nTest name: %s" % test_data["name"]) - agora_results_bin_path = "python3 agora-results" + tally_pipes_bin_path = "python3 tally-pipes" tally_path = test.desborda_test.create_desborda_test( test_data, extra_options=dict(cumulative_number_of_checkboxes=checks), @@ -765,7 +765,7 @@ def do_test( tally_results_dir_path = os.path.join(tally_path, 'results-1') os.mkdir(tally_results_dir_path) cmd = "%s -t %s -c %s -x %s -p %s -eid 12345 -s -o json" % ( - agora_results_bin_path, + tally_pipes_bin_path, tally_targz_path, config_results_path, tally_path, From 03e48cb2c1462dacc944a435917aacad5fc55812 Mon Sep 17 00:00:00 2001 From: Eduardo Robles Elvira Date: Wed, 30 Mar 2022 18:14:18 +0200 Subject: [PATCH 2/5] updating logo to be Sequent --- img/sequent_logo.jpg | Bin 71902 -> 50978 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/sequent_logo.jpg b/img/sequent_logo.jpg index d3d22d678a8ad476c3f6755229a8d0961f8406c0..35c87ae4b7c158ddaf3e14b7d919907347596f9a 100644 GIT binary patch literal 50978 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
  • OSLl0y%C*q-WjqV15;pGjZx1{19Cw<+YJ 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 literal 71902 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 z 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 Date: Wed, 30 Mar 2022 18:15:42 +0200 Subject: [PATCH 3/5] changing branch of tally-methods repo to try to fix CI/CD --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index de57d0a..1a8938d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ reportlab==3.5.55 requests==2.20.0 pytz==2021.3 Babel==2.9.1 --e git+https://github.com/sequentech/tally-methods.git@master#egg=tally-methods +-e git+https://github.com/sequentech/tally-methods.git@rebrand-to-sequentech#egg=tally-methods From df8aa8a795aaf3b8c97f125a5bb718fa8af30e25 Mon Sep 17 00:00:00 2001 From: Eduardo Robles Elvira Date: Wed, 30 Mar 2022 18:24:55 +0200 Subject: [PATCH 4/5] resetting requirements.txt back to master --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1a8938d..de57d0a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ reportlab==3.5.55 requests==2.20.0 pytz==2021.3 Babel==2.9.1 --e git+https://github.com/sequentech/tally-methods.git@rebrand-to-sequentech#egg=tally-methods +-e git+https://github.com/sequentech/tally-methods.git@master#egg=tally-methods From ce8ac49265a211fa33575a447ee09aff80c2d873 Mon Sep 17 00:00:00 2001 From: Eduardo Robles Elvira Date: Tue, 5 Apr 2022 12:40:44 +0200 Subject: [PATCH 5/5] trying to make it work with ort --- .ort.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ort.yml b/.ort.yml index 3d17302..3013c37 100644 --- a/.ort.yml +++ b/.ort.yml @@ -5,7 +5,7 @@ --- resolutions: rule_violations: - - message: "The package (PIP|PyPI)::sequent-(tally|results-requirements):.* has the declared ScanCode copyleft catalogized license AGPL-3.0-only." + - message: "The package (PIP|PyPI)::(tally-methods|tally-pipes-requirements):.* has the declared ScanCode copyleft catalogized license AGPL-3.0-only." reason: "LICENSE_ACQUIRED_EXCEPTION" comment: "The project is open source so it's normal that it's set as such."