From d1a207704aff266d603ae964cef7bea26e64fb55 Mon Sep 17 00:00:00 2001 From: joncrall Date: Thu, 1 Feb 2024 14:17:32 -0500 Subject: [PATCH 01/15] Start 2.3.3 branch --- CHANGELOG.md | 2 ++ ibeis/__init__.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 358455150..e0a3f2b21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ We are currently working on porting this changelog to the specifications in This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +### [Version 2.3.3] - Released xx + ### [Version 2.3.2] - Released 2024-02-01 ### Fixed: diff --git a/ibeis/__init__.py b/ibeis/__init__.py index ffc4d109f..fbd5d5e2a 100755 --- a/ibeis/__init__.py +++ b/ibeis/__init__.py @@ -2,7 +2,7 @@ IBEIS: main package init """ -__version__ = '2.3.2' +__version__ = '2.3.3' try: import cv2 # NOQA From 553b428bb10af5199bfeaf473754fe3a2ab1e270 Mon Sep 17 00:00:00 2001 From: joncrall Date: Thu, 21 Mar 2024 13:13:57 -0400 Subject: [PATCH 02/15] Remove unused code and fix missing term color --- ibeis/__main__.py | 27 ++-------------- ibeis/init/__init__.py | 69 ----------------------------------------- ibeis/main_module.py | 17 ---------- ibeis/params.py | 2 +- ibeis/web/job_engine.py | 2 +- 5 files changed, 5 insertions(+), 112 deletions(-) diff --git a/ibeis/__main__.py b/ibeis/__main__.py index 36947a930..a47e1546c 100755 --- a/ibeis/__main__.py +++ b/ibeis/__main__.py @@ -1,6 +1,9 @@ #!/usr/bin/env python """ Runs IBIES gui + +SeeAlso: + ibeis.main_module - contains more entry point logic (needs cleanup) """ import utool as ut import ubelt as ub @@ -80,30 +83,6 @@ def run_ibeis(): print('... exiting') sys.exit(0) - # Attempt to run a test using the funciton name alone - # with the --tf flag - # if False: - # import ibeis.tests.run_tests - # import ibeis.tests.reset_testdbs - # import ibeis.scripts.thesis - # ignore_prefix = [ - # #'ibeis.tests', - # 'ibeis.control.__SQLITE3__', - # '_autogen_explicit_controller'] - # ignore_suffix = ['_grave'] - # func_to_module_dict = { - # 'demo_bayesnet': 'ibeis.unstable.demobayes', - # } - # ut.main_function_tester('ibeis', ignore_prefix, ignore_suffix, - # func_to_module_dict=func_to_module_dict) - - #if ub.argflag('-e'): - # import ibeis - # expt_kw = ut.get_arg_dict(ut.get_func_kwargs(ibeis.run_experiment), - # prefix_list=['--', '-']) - # ibeis.run_experiment(**expt_kw) - # sys.exit(0) - doctest_modname = ut.get_argval( ('--doctest-module', '--tmod', '-tm', '--testmod'), type_=str, default=None, help_='specify a module to doctest') diff --git a/ibeis/init/__init__.py b/ibeis/init/__init__.py index 800469af0..e69de29bb 100644 --- a/ibeis/init/__init__.py +++ b/ibeis/init/__init__.py @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- -# UNCOMMENTING WHAT I THOUGHT SHOULD BE FINE IN AN INIT MODULE SEEMS TO -# BREAK THE IMPORT STRUCTURE. WERID - -#### __init__.py ### -## flake8: noqa -#from __future__ import absolute_import, division, print_function -#from ibeis.init import main_commands -#from ibeis.init import main_helpers -#from ibeis.init import sysres -#import utool - - -#def reassign_submodule_attributes(verbose=True): -# """ -# why reloading all the modules doesnt do this I don't know -# """ -# import sys -# if verbose and '--quiet' not in sys.argv: -# print('dev reimport') -# # Self import -# import ibeis.init -# # Implicit reassignment. -# seen_ = set([]) -# for tup in IMPORT_TUPLES: -# if len(tup) > 2 and tup[2]: -# continue # dont import package names -# submodname, fromimports = tup[0:2] -# submod = getattr(ibeis.init, submodname) -# for attr in dir(submod): -# if attr.startswith('_'): -# continue -# if attr in seen_: -# # This just holds off bad behavior -# # but it does mimic normal util_import behavior -# # which is good -# continue -# seen_.add(attr) -# setattr(ibeis.init, attr, getattr(submod, attr)) - - -#def reload_subs(verbose=True): -# """ Reloads ibeis.init and submodules """ -# rrr(verbose=verbose) -# def fbrrr(*args, **kwargs): -# """ fallback reload """ -# pass -# getattr(main_commands, 'rrr', fbrrr)(verbose=verbose) -# getattr(main_helpers, 'rrr', fbrrr)(verbose=verbose) -# getattr(sysres, 'rrr', fbrrr)(verbose=verbose) -# rrr(verbose=verbose) -# try: -# # hackish way of propogating up the new reloaded submodule attributes -# reassign_submodule_attributes(verbose=verbose) -# except Exception as ex: -# print(ex) -#rrrr = reload_subs - -#IMPORT_TUPLES = [ -# ('main_commands', None), -# ('main_helpers', None), -# ('sysres', None), -#] -#""" -#Regen Command: -# cd /home/joncrall/code/ibeis/ibeis/init -# makeinit.py -#""" -## autogenerated __init__.py for: '/home/joncrall/code/ibeis/ibeis/init' diff --git a/ibeis/main_module.py b/ibeis/main_module.py index 43b058c23..9a4b3c08e 100755 --- a/ibeis/main_module.py +++ b/ibeis/main_module.py @@ -147,17 +147,7 @@ def _init_numpy(): 'under': on_err, 'invalid': on_err, } - #numpy_print = { - # 'precision': 8, - # 'threshold': 500, - # 'edgeitems': 3, - # 'linewidth': 200, # default 75 - # 'suppress': False, - # 'nanstr': 'nan', - # 'formatter': None, - #} np.seterr(**numpy_err) - #np.set_printoptions(**numpy_print) #----------------------- @@ -215,8 +205,6 @@ def set_newfile_permissions(): mask = 0o000 # most permissive umask prev_mask = os.umask(mask) return prev_mask - #print('prev_mask = %o' % (prev_mask,)) - #print('new_mask = %o' % (mask,)) def main(gui=True, dbdir=None, defaultdb='cache', @@ -574,9 +562,6 @@ def _preload(mpl=True, par=True, logging=True): _init_signals() # inject colored exceptions ut.util_inject.inject_colored_exceptions() - # register type aliases for debugging - #main_helpers.register_utool_aliases() - #return params.args def main_loop(main_locals, rungui=True, ipy=False, persist=True): @@ -626,8 +611,6 @@ def main_close(main_locals=None): _reset_signals() -#if __name__ == '__main__': -# multiprocessing.freeze_support() if __name__ == '__main__': """ CommandLine: diff --git a/ibeis/params.py b/ibeis/params.py index 508045b92..f01d4f766 100755 --- a/ibeis/params.py +++ b/ibeis/params.py @@ -9,7 +9,7 @@ automagically) TODO: -nnkj/enerate this module automagically from +autogenerate this module automagically from import utool as ut utool_parse_codeblock = ut.util_arg.autogen_argparse_block(extra_args=parsed_args) ut.util_arg.reset_argrecord() diff --git a/ibeis/web/job_engine.py b/ibeis/web/job_engine.py index 150f1d2d3..96e16373a 100644 --- a/ibeis/web/job_engine.py +++ b/ibeis/web/job_engine.py @@ -399,7 +399,7 @@ def _initialize_job_ports(self, use_static_ports=False, static_root=51381): def initialize_background_processes(self, dbdir=None, wait=0, containerized=False, thread=True): - print = partial(ut.colorprint, color='fuchsia') + print = partial(ut.colorprint, color='white') #if VERBOSE_JOBS: print('Initialize Background Processes') From 3efc3010fbf4e5ebc742683375585d1b81d4b9ef Mon Sep 17 00:00:00 2001 From: joncrall Date: Sat, 13 Apr 2024 22:18:49 -0400 Subject: [PATCH 03/15] Remove use of ReloadingMetaClass --- dev/unstable/distinctiveness_normalizer.py | 1 - dev/unstable/multi_index.py | 2 -- dev/unstable/orig_graph_iden.py | 1 - ibeis/algo/graph/core.py | 1 - ibeis/algo/graph/mixin_dynamic.py | 4 ---- ibeis/algo/graph/mixin_helpers.py | 2 -- ibeis/algo/graph/mixin_ibeis.py | 2 -- ibeis/algo/graph/mixin_matching.py | 2 -- ibeis/algo/graph/mixin_viz.py | 1 - ibeis/algo/hots/chip_match.py | 1 - ibeis/algo/hots/neighbor_index.py | 2 -- ibeis/algo/hots/query_request.py | 4 ++-- ibeis/control/IBEISControl.py | 1 - ibeis/expt/old_storage.py | 2 -- ibeis/expt/test_result.py | 2 -- ibeis/viz/interact/interact_matches.py | 2 -- 16 files changed, 2 insertions(+), 28 deletions(-) diff --git a/dev/unstable/distinctiveness_normalizer.py b/dev/unstable/distinctiveness_normalizer.py index da8632b73..ac2a6edf1 100644 --- a/dev/unstable/distinctiveness_normalizer.py +++ b/dev/unstable/distinctiveness_normalizer.py @@ -60,7 +60,6 @@ def testdata_distinctiveness(): return dstcnvs_normer, qreq_ -#@six.add_metaclass(ut.ReloadingMetaclass) class DistinctivnessNormalizer(ut.Cachable): ext = '.cPkl' prefix = 'distinctivness' diff --git a/dev/unstable/multi_index.py b/dev/unstable/multi_index.py index a5c53de95..7bf564334 100644 --- a/dev/unstable/multi_index.py +++ b/dev/unstable/multi_index.py @@ -6,7 +6,6 @@ points to a single flann structure which seems to cause crashes. """ from __future__ import absolute_import, division, print_function -import six from six.moves import zip, map, range import numpy as np import utool as ut @@ -210,7 +209,6 @@ def sort_along_rows(qfx2_xxx, qfx2_sortx): return np.vstack([row.take(sortx) for sortx, row in zip(qfx2_sortx, qfx2_xxx)]) -@six.add_metaclass(ut.ReloadingMetaclass) class MultiNeighborIndex(object): """ TODO: rename to DistributedNeighborIndex diff --git a/dev/unstable/orig_graph_iden.py b/dev/unstable/orig_graph_iden.py index e34306dbf..2c4cba1e4 100644 --- a/dev/unstable/orig_graph_iden.py +++ b/dev/unstable/orig_graph_iden.py @@ -10,7 +10,6 @@ print, rrr, profile = ut.inject2(__name__) -@six.add_metaclass(ut.ReloadingMetaclass) class OrigAnnotInference(object): """ Make name inferences about a series of AnnotMatches diff --git a/ibeis/algo/graph/core.py b/ibeis/algo/graph/core.py index 2df2f324f..594c25511 100644 --- a/ibeis/algo/graph/core.py +++ b/ibeis/algo/graph/core.py @@ -983,7 +983,6 @@ def __nice__(infr): # ) -@six.add_metaclass(ut.ReloadingMetaclass) class AnnotInference(ut.NiceRepr, # Old internal stuffs AltConstructors, diff --git a/ibeis/algo/graph/mixin_dynamic.py b/ibeis/algo/graph/mixin_dynamic.py index 8ea5accae..7efe7b50d 100644 --- a/ibeis/algo/graph/mixin_dynamic.py +++ b/ibeis/algo/graph/mixin_dynamic.py @@ -16,7 +16,6 @@ """ from __future__ import absolute_import, division, print_function, unicode_literals -import six import numpy as np import utool as ut import itertools as it @@ -770,7 +769,6 @@ def consistent_components(infr, graph=None): yield cc -@six.add_metaclass(ut.ReloadingMetaclass) class _RedundancyComputers(object): """ methods for computing redundancy @@ -987,7 +985,6 @@ def find_neg_redun_nids(infr): yield nid1, nid2 -@six.add_metaclass(ut.ReloadingMetaclass) class Redundancy(_RedundancyComputers): """ methods for dynamic redundancy book-keeping """ @@ -1271,7 +1268,6 @@ def _purge_redun_flags(infr, nid): return prev_neg_nids -@six.add_metaclass(ut.ReloadingMetaclass) class NonDynamicUpdate(object): @profile diff --git a/ibeis/algo/graph/mixin_helpers.py b/ibeis/algo/graph/mixin_helpers.py index dddaf900a..84dc7e2b1 100644 --- a/ibeis/algo/graph/mixin_helpers.py +++ b/ibeis/algo/graph/mixin_helpers.py @@ -11,7 +11,6 @@ from ibeis.algo.graph.state import SAME, DIFF, NULL # NOQA from ibeis.algo.graph.nx_utils import e_ from ibeis.algo.graph import nx_utils as nxu -import six print, rrr, profile = ut.inject2(__name__) @@ -348,7 +347,6 @@ def edge_tag_hist(infr): return tag_hist -@six.add_metaclass(ut.ReloadingMetaclass) class DummyEdges(object): def ensure_mst(infr, label='name_label', meta_decision=SAME): diff --git a/ibeis/algo/graph/mixin_ibeis.py b/ibeis/algo/graph/mixin_ibeis.py index 24596a4a3..128dc7cf2 100644 --- a/ibeis/algo/graph/mixin_ibeis.py +++ b/ibeis/algo/graph/mixin_ibeis.py @@ -11,7 +11,6 @@ print, rrr, profile = ut.inject2(__name__) -@six.add_metaclass(ut.ReloadingMetaclass) class IBEISIO(object): """ Direct interface into ibeis tables and delta statistics @@ -972,7 +971,6 @@ def _debug_edge_gt(infr, edge): print('____') -@six.add_metaclass(ut.ReloadingMetaclass) class IBEISGroundtruth(object): """ Methods for generating training labels for classifiers diff --git a/ibeis/algo/graph/mixin_matching.py b/ibeis/algo/graph/mixin_matching.py index c5fe2f6dd..902803c58 100644 --- a/ibeis/algo/graph/mixin_matching.py +++ b/ibeis/algo/graph/mixin_matching.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals -import six import numpy as np import ubelt as ub import utool as ut @@ -15,7 +14,6 @@ print, rrr, profile = ut.inject2(__name__) -@six.add_metaclass(ut.ReloadingMetaclass) class AnnotInfrMatching(object): """ Methods for running matching algorithms diff --git a/ibeis/algo/graph/mixin_viz.py b/ibeis/algo/graph/mixin_viz.py index 3162cd4ca..9fa150195 100644 --- a/ibeis/algo/graph/mixin_viz.py +++ b/ibeis/algo/graph/mixin_viz.py @@ -11,7 +11,6 @@ print, rrr, profile = ut.inject2(__name__) -@six.add_metaclass(ut.ReloadingMetaclass) class GraphVisualization(object): """ contains plotting related code """ diff --git a/ibeis/algo/hots/chip_match.py b/ibeis/algo/hots/chip_match.py index b97947639..cadeaf881 100644 --- a/ibeis/algo/hots/chip_match.py +++ b/ibeis/algo/hots/chip_match.py @@ -2074,7 +2074,6 @@ def assert_self(cm, qreq_=None, ibs=None, strict=False, assert_feats=True, pass -@six.add_metaclass(ut.ReloadingMetaclass) class ChipMatch(_ChipMatchVisualization, AnnotMatch, _ChipMatchScorers, diff --git a/ibeis/algo/hots/neighbor_index.py b/ibeis/algo/hots/neighbor_index.py index 9b1ec0990..de87ca137 100644 --- a/ibeis/algo/hots/neighbor_index.py +++ b/ibeis/algo/hots/neighbor_index.py @@ -5,7 +5,6 @@ https://github.com/spotify/annoy """ -import six import numpy as np import utool as ut import vtool_ibeis as vt @@ -183,7 +182,6 @@ def invert_index(vecs_list, fgws_list, ax_list, fxs_list, verbose=ut.NOT_QUIET): return idx2_vec, idx2_fgw, idx2_ax, idx2_fx -@six.add_metaclass(ut.ReloadingMetaclass) class NeighborIndex(object): r""" wrapper class around flann diff --git a/ibeis/algo/hots/query_request.py b/ibeis/algo/hots/query_request.py index 100afa2a2..41c2ebc8b 100644 --- a/ibeis/algo/hots/query_request.py +++ b/ibeis/algo/hots/query_request.py @@ -419,7 +419,7 @@ def _make_anygroup_hashes(annots, nids): unique_nids, groupxs = vt.group_indices(nids) grouped_visual_uuids = ut.apply_grouping(annots.visual_uuids, groupxs) group_hashes = [ - ut.combine_hashes(sorted(u.bytes for u in uuids), + ut.combine_hashes(sorted(b'' if u is None else u.bytes for u in uuids), hasher=hashlib.sha1()) for uuids in grouped_visual_uuids ] @@ -452,7 +452,7 @@ def get_qreq_pcc_hashes(qreq_, aids): # For now, only considers grouping of database names dannot_name_hashes = ut.dict_take(qreq_.dnid_to_grouphash, nids, zero) dannot_visual_uuids = qreq_.get_qreq_annot_visual_uuids(aids) - dannot_visual_hashes = (u.bytes for u in dannot_visual_uuids) + dannot_visual_hashes = (b'' if u is None else u.bytes for u in dannot_visual_uuids) for vuuid, nuuid in zip(dannot_visual_hashes, dannot_name_hashes): bytes_ = ut.combine_hashes((vuuid, nuuid), hasher=hashlib.sha1()) yield bytes_ diff --git a/ibeis/control/IBEISControl.py b/ibeis/control/IBEISControl.py index fe612832f..38ad17c7b 100755 --- a/ibeis/control/IBEISControl.py +++ b/ibeis/control/IBEISControl.py @@ -240,7 +240,6 @@ def __cleanup(): # IBEIS CONTROLLER #----------------- -@six.add_metaclass(ut.ReloadingMetaclass) class IBEISController(BASE_CLASS): """ IBEISController docstring diff --git a/ibeis/expt/old_storage.py b/ibeis/expt/old_storage.py index 1bba16381..c7e027cbe 100644 --- a/ibeis/expt/old_storage.py +++ b/ibeis/expt/old_storage.py @@ -1,13 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function import six -#import six import utool as ut print, rrr, profile = ut.inject2( __name__, '[expt_harn]') -@six.add_metaclass(ut.ReloadingMetaclass) class ResultMetadata(object): def __init__(metadata, fpath, autoconnect=False): """ diff --git a/ibeis/expt/test_result.py b/ibeis/expt/test_result.py index 30f93ed99..aa7c28093 100644 --- a/ibeis/expt/test_result.py +++ b/ibeis/expt/test_result.py @@ -1,6 +1,5 @@ # TODO: find unused functions and kill them import ubelt as ub -import six import copy import operator import utool as ut @@ -224,7 +223,6 @@ def combine_lbls(lbl, acfg_lbl): return testres -@six.add_metaclass(ut.ReloadingMetaclass) class TestResult(ut.NiceRepr): """ CommandLine: diff --git a/ibeis/viz/interact/interact_matches.py b/ibeis/viz/interact/interact_matches.py index 9f372068a..66a7d10f2 100755 --- a/ibeis/viz/interact/interact_matches.py +++ b/ibeis/viz/interact/interact_matches.py @@ -12,7 +12,6 @@ import utool as ut import numpy as np import plottool_ibeis as pt -import six from plottool_ibeis import interact_helpers as ih from ibeis import viz from ibeis.algo.hots import scoring @@ -52,7 +51,6 @@ def testdata_match_interact(**kwargs): # TODO inherit from AbstractInteraction -@six.add_metaclass(ut.ReloadingMetaclass) class MatchInteraction(interact_matches.MatchInteraction2): """ Plots a chip result and sets up callbacks for interaction. From 419410d54bfc98d4e1fe1fc41d7387a4d4d511fb Mon Sep 17 00:00:00 2001 From: joncrall Date: Sat, 13 Apr 2024 22:21:43 -0400 Subject: [PATCH 04/15] Remove use of ut.reloadable_class --- ibeis/algo/hots/query_request.py | 1 - ibeis/algo/smk/inverted_index.py | 2 -- ibeis/algo/smk/smk_pipeline.py | 2 -- ibeis/algo/smk/vocab_indexer.py | 1 - ibeis/algo/verif/clf_helpers.py | 4 ---- ibeis/algo/verif/deploy.py | 1 - ibeis/algo/verif/verifier.py | 3 --- ibeis/algo/verif/vsone.py | 2 -- ibeis/annots.py | 2 -- ibeis/images.py | 2 -- ibeis/scripts/_thesis_helpers.py | 2 -- ibeis/scripts/classify_shark.py | 3 --- ibeis/scripts/postdoc.py | 2 -- ibeis/scripts/thesis.py | 5 ----- 14 files changed, 32 deletions(-) diff --git a/ibeis/algo/hots/query_request.py b/ibeis/algo/hots/query_request.py index 41c2ebc8b..950795f68 100644 --- a/ibeis/algo/hots/query_request.py +++ b/ibeis/algo/hots/query_request.py @@ -273,7 +273,6 @@ def apply_species_with_detector_hack(ibs, cfgdict, qaids, daids, return unique_species -@ut.reloadable_class class QueryRequest(ut.NiceRepr): """ Request object for pipline parameter run diff --git a/ibeis/algo/smk/inverted_index.py b/ibeis/algo/smk/inverted_index.py index 352952076..ce4e5b7b7 100644 --- a/ibeis/algo/smk/inverted_index.py +++ b/ibeis/algo/smk/inverted_index.py @@ -245,7 +245,6 @@ def render_inverted_vocab(inva, ibs, use_data=False): return all_words -@ut.reloadable_class class InvertedAnnots(InvertedAnnotsExtras): """ CommandLine: @@ -431,7 +430,6 @@ def compute_gammas(inva, alpha, thresh): return gamma_list -@ut.reloadable_class class SingleAnnot(ut.NiceRepr): def __init__(X): X.aid = None diff --git a/ibeis/algo/smk/smk_pipeline.py b/ibeis/algo/smk/smk_pipeline.py index 92f8d799c..caaab0915 100644 --- a/ibeis/algo/smk/smk_pipeline.py +++ b/ibeis/algo/smk/smk_pipeline.py @@ -58,7 +58,6 @@ class SMKRequestConfig(dtool_ibeis.Config): ] -@ut.reloadable_class class SMKRequest(mc5.EstimatorRequest): r""" qreq_-like object. Trying to work on becoming more scikit-ish @@ -304,7 +303,6 @@ def get_qreq_dannot_kpts(qreq_, daids): # daids, config2_=qreq_.extern_data_config2) -@ut.reloadable_class class SMK(ut.NiceRepr): """ Harness class that controls the execution of the SMK algorithm diff --git a/ibeis/algo/smk/vocab_indexer.py b/ibeis/algo/smk/vocab_indexer.py index 487253109..fc11a8c92 100644 --- a/ibeis/algo/smk/vocab_indexer.py +++ b/ibeis/algo/smk/vocab_indexer.py @@ -24,7 +24,6 @@ class VocabConfig(dtool_ibeis.Config): ] -@ut.reloadable_class class VisualVocab(ut.NiceRepr): """ Class that maintains a list of visual words (cluster centers) diff --git a/ibeis/algo/verif/clf_helpers.py b/ibeis/algo/verif/clf_helpers.py index 7c859d13a..9a8019832 100644 --- a/ibeis/algo/verif/clf_helpers.py +++ b/ibeis/algo/verif/clf_helpers.py @@ -34,7 +34,6 @@ class XValConfig(dt.Config): ] -@ut.reloadable_class class ClfProblem(ut.NiceRepr): def __init__(pblm): pblm.deploy_task_clfs = None @@ -555,7 +554,6 @@ def _dev_calib(pblm): pt.legend() -@ut.reloadable_class class ClfResult(ut.NiceRepr): r""" Handles evaluation statistics for a multiclass classifier trained on a @@ -1106,7 +1104,6 @@ def roc_score(res): return auc_learn -@ut.reloadable_class class MultiTaskSamples(ut.NiceRepr): """ Handles samples (i.e. feature-label pairs) with a combination of @@ -1338,7 +1335,6 @@ def subsplit_indices(samples, subset_idx, **xval_kw): return skf_list -@ut.reloadable_class class MultiClassLabels(ut.NiceRepr): """ Used by samples to encode a single set of mutually exclusive labels. These diff --git a/ibeis/algo/verif/deploy.py b/ibeis/algo/verif/deploy.py index 5140df7cd..fe9d8fa88 100644 --- a/ibeis/algo/verif/deploy.py +++ b/ibeis/algo/verif/deploy.py @@ -7,7 +7,6 @@ print, rrr, profile = ut.inject2(__name__) -@ut.reloadable_class class Deployer(object): """ Transforms a OneVsOne problem into a deployable model. diff --git a/ibeis/algo/verif/verifier.py b/ibeis/algo/verif/verifier.py index 87845793c..c199aa3b9 100644 --- a/ibeis/algo/verif/verifier.py +++ b/ibeis/algo/verif/verifier.py @@ -11,7 +11,6 @@ print, rrr, profile = ut.inject2(__name__) -@ut.reloadable_class class BaseVerifier(ut.NiceRepr): def __nice__(verif): @@ -52,7 +51,6 @@ def easiness(verif, edges, real): return easiness -@ut.reloadable_class class Verifier(BaseVerifier): """ Notes: @@ -120,7 +118,6 @@ def predict_proba_df(verif, edges): # task_probs[task_key] = probs_df -@ut.reloadable_class class IntraVerifier(BaseVerifier): """ Predicts cross-validated intra-training sample probs. diff --git a/ibeis/algo/verif/vsone.py b/ibeis/algo/verif/vsone.py index 8d076726e..ad76c6aee 100644 --- a/ibeis/algo/verif/vsone.py +++ b/ibeis/algo/verif/vsone.py @@ -45,7 +45,6 @@ class PairSampleConfig(dt.Config): ] -@ut.reloadable_class class OneVsOneProblem(clf_helpers.ClfProblem): """ Keeps information about the one-vs-one pairwise classification problem @@ -1589,7 +1588,6 @@ def qt_review_hardcases(pblm): return win -@ut.reloadable_class class AnnotPairSamples(clf_helpers.MultiTaskSamples, ub.NiceRepr): """ Manages the different ways to assign samples (i.e. feat-label pairs) to diff --git a/ibeis/annots.py b/ibeis/annots.py index ba7976211..9526d57d6 100644 --- a/ibeis/annots.py +++ b/ibeis/annots.py @@ -204,7 +204,6 @@ def __init__(metaself, name, bases, dct): BASE = _ibeis_object.ObjectList1D -# @ut.reloadable_class @six.add_metaclass(_AnnotPropInjector) class Annots(BASE): """ @@ -391,7 +390,6 @@ def ibs_unflat_getter(self, *args, **kwargs): setattr(metaself, attrname, property(ibs_unflat_getter)) -@ut.reloadable_class @six.add_metaclass(_AnnotGroupPropInjector) class AnnotGroups(ut.NiceRepr): """ Effciently handle operations on multiple groups of annotations """ diff --git a/ibeis/images.py b/ibeis/images.py index 20a5a44f7..b5931a8e9 100644 --- a/ibeis/images.py +++ b/ibeis/images.py @@ -77,7 +77,6 @@ def __init__(metaself, name, bases, dct): _ibeis_object._inject_getter_attrs(metaself, objname, attrs, []) -# @ut.reloadable_class @six.add_metaclass(ImageIBEISPropertyInjector) class Images(IMAGE_BASE): """ @@ -175,7 +174,6 @@ def __init__(metaself, name, bases, dct): _ibeis_object._inject_getter_attrs(metaself, objname, attrs, []) -# @ut.reloadable_class @six.add_metaclass(ImageSetAttrInjector) class ImageSets(IMAGESET_BASE): """ diff --git a/ibeis/scripts/_thesis_helpers.py b/ibeis/scripts/_thesis_helpers.py index 2d214135f..d4ff2fd34 100644 --- a/ibeis/scripts/_thesis_helpers.py +++ b/ibeis/scripts/_thesis_helpers.py @@ -59,7 +59,6 @@ def dbname_to_species_nice(dbname): return species_nice -@ut.reloadable_class class DBInputs(object): def __init__(self, dbname=None): self.ibs = None @@ -546,7 +545,6 @@ def split_tabular(text): return parts -@ut.reloadable_class class Tabular(object): def __init__(self, data=None, colfmt=None, hline=None, caption='', index=True, escape=True): diff --git a/ibeis/scripts/classify_shark.py b/ibeis/scripts/classify_shark.py index 0357bf43d..0a00ac40f 100644 --- a/ibeis/scripts/classify_shark.py +++ b/ibeis/scripts/classify_shark.py @@ -143,7 +143,6 @@ def shark_net(dry=False): model.fit(X_learn, y_learn, X_valid=X_valid, y_valid=y_valid) -# @ut.reloadable_class class WhaleSharkInjuryModel(AbstractCategoricalModel): """ Example: @@ -613,7 +612,6 @@ def get_shark_labels_and_metadata(target_type=None, ibs=None, config=None): return tup -# @ut.reloadable_class class ClfProblem(object): """ Harness for researching a classification problem """ def __init__(problem, ds): @@ -847,7 +845,6 @@ def gen_crossval_idxs(problem, n_folds=2): yield train_idx, test_idx -# @ut.reloadable_class class ClfSingleResult(object): r""" Reports the results of a classification problem diff --git a/ibeis/scripts/postdoc.py b/ibeis/scripts/postdoc.py index 55c5ec6ba..a88338c3b 100644 --- a/ibeis/scripts/postdoc.py +++ b/ibeis/scripts/postdoc.py @@ -45,7 +45,6 @@ def turk_pz(): pass -@ut.reloadable_class class GraphExpt(DBInputs): r""" @@ -761,7 +760,6 @@ def plot_cmcs(cdfs, labels, fnum=1, pnum=(1, 1, 1), ymin=.4): return pt.gcf() -@ut.reloadable_class class VerifierExpt(DBInputs): """ Collect data from experiments to visualize diff --git a/ibeis/scripts/thesis.py b/ibeis/scripts/thesis.py index 7dbb29c1c..275ad9415 100644 --- a/ibeis/scripts/thesis.py +++ b/ibeis/scripts/thesis.py @@ -21,7 +21,6 @@ (print, rrr, profile) = ut.inject2(__name__) -@ut.reloadable_class class Chap5(DBInputs): """ python -m ibeis Chap5.measure all GZ_Master1 @@ -1299,7 +1298,6 @@ def stacked_interval(data, color, i): pt.set_figtitle(self.dbname) -@ut.reloadable_class class Chap4(DBInputs): """ Collect data from experiments to visualize @@ -2725,7 +2723,6 @@ def custom_single_hard_case(self): vt.imwrite(fpath, pt.render_figure_to_image(fig, dpi=DPI)) -@ut.reloadable_class class Chap3Measures(object): def measure_baseline(self): """ @@ -3071,7 +3068,6 @@ def measure_dbstats(self): return info -@ut.reloadable_class class Chap3Draw(object): def draw_baseline(self): mpl.rcParams.update(TMP_RC) @@ -3415,7 +3411,6 @@ def draw_time_distri(self): return fpath -@ut.reloadable_class class Chap3(DBInputs, Chap3Draw, Chap3Measures): base_dpath = ut.truepath('~/latex/crall-thesis-2017/figures3') def _setup(self): From 69eac535a8de4c7734dd18e194780bcb84fb07ef Mon Sep 17 00:00:00 2001 From: joncrall Date: Sat, 13 Apr 2024 22:22:36 -0400 Subject: [PATCH 05/15] Bump to new version --- ibeis/__init__.py | 2 +- requirements/runtime.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ibeis/__init__.py b/ibeis/__init__.py index fbd5d5e2a..c6702f1f9 100755 --- a/ibeis/__init__.py +++ b/ibeis/__init__.py @@ -2,7 +2,7 @@ IBEIS: main package init """ -__version__ = '2.3.3' +__version__ = '2.4.0' try: import cv2 # NOQA diff --git a/requirements/runtime.txt b/requirements/runtime.txt index a29ccd3eb..5a2c9883c 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -1,5 +1,5 @@ # Our IBEIS-specific pure python packages -utool>=2.1.7 +utool>=2.2.0 vtool_ibeis>=2.2.0 dtool_ibeis>=1.1.1 plottool_ibeis>=2.2.1 From 23894d0c2612c917a8b6d294d7b1453f609e9ed4 Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 00:17:15 -0400 Subject: [PATCH 06/15] Update requirements --- requirements/runtime.txt | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/requirements/runtime.txt b/requirements/runtime.txt index 5a2c9883c..d210dcf32 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -1,9 +1,9 @@ # Our IBEIS-specific pure python packages utool>=2.2.0 vtool_ibeis>=2.2.0 -dtool_ibeis>=1.1.1 -plottool_ibeis>=2.2.1 -guitool_ibeis>=2.1.2 +dtool_ibeis>=1.1.2 +plottool_ibeis>=2.3.0 +guitool_ibeis>=2.2.0 futures_actors>=0.0.5 # Our IBEIS-specific binary packages @@ -45,10 +45,10 @@ statsmodels>=0.13.1 ; python_version < '3.10' and python_version >= '3.9' statsmodels>=0.13.1 ; python_version < '3.9' and python_version >= '3.8' # Python 3.8 statsmodels>=0.12.2 ; python_version < '3.8' and python_version >= '3.7' # Python 3.7 -delorean>=1.0.0 -ubelt>=1.2.3 +ubelt >= 1.3.4 -pyqt5>=5.15.5 +pyqt5>=5.15.10 ; python_version < '4.0' and python_version >= '3.12' # Python 3.12 +pyqt5>=5.15.5 ; python_version < '3.12' and python_version >= '2.7' # Python 3.11- pynmea2>=1.5.3 #tornado>=4.2.1 @@ -61,19 +61,20 @@ psutil>=5.9.0 ; python_version < '3.9' and python_version >= '3.8' # Py psutil>=5.9.0 ; python_version < '3.8' and python_version >= '3.7' # Python 3.7 psutil>=5.9.0 ; python_version < '3.7' and python_version >= '3.6' # Python 3.6 -matplotlib>=3.6.0 ; python_version < '4.0' and python_version >= '3.11' # Python 3.11+ -matplotlib>=3.5.0 ; python_version < '3.11' and python_version >= '3.10' # Python 3.10 +matplotlib>=3.8.4 ; python_version < '4.0' and python_version >= '3.12' # Python 3.12 +matplotlib>=3.5.0 ; python_version < '3.12' and python_version >= '3.11' # Python 3.11 matplotlib>=3.3.3 ; python_version < '3.10' and python_version >= '3.9' # Python 3.9 matplotlib>=3.6.0 ; python_version < '3.9' and python_version >= '3.8' # Python 3.8 matplotlib>=2.2.2 ; python_version < '3.8' and python_version >= '3.7' # Python 3.7 matplotlib>=1.5.3 ; python_version < '3.7' and python_version >= '3.6' # Python 3.6 -numpy>=1.23.2 ; python_version >= '3.11' # Python 3.11 +numpy>=1.26.0 ; python_version < '4.0' and python_version >= '3.12' # Python 3.12+ +numpy>=1.23.2 ; python_version < '3.12' and python_version >= '3.11' # Python 3.11 numpy>=1.21.6 ; python_version < '3.11' and python_version >= '3.10' # Python 3.10 numpy>=1.19.3 ; python_version < '3.10' and python_version >= '3.9' # Python 3.9 numpy>=1.19.2 ; python_version < '3.9' and python_version >= '3.8' # Python 3.8 -numpy>=1.19.2 ; python_version < '3.8' and python_version >= '3.7' # Python 3.7 -numpy>=1.19.2 ; python_version < '3.7' and python_version >= '3.6' # Python 3.6 +numpy>=1.19.2,<2.0 ; python_version < '3.8' and python_version >= '3.7' # Python 3.7 +numpy>=1.19.2,<2.0 ; python_version < '3.7' and python_version >= '3.6' # Python 3.6 scikit-image>=0.20.0 ; python_version < '4.0' and python_version >= '3.11' # Python 3.11+ scikit-image>=0.19.0 ; python_version < '3.11' and python_version >= '3.10' # Python 3.10 @@ -90,7 +91,8 @@ scikit-learn>=0.24.1 ; python_version < '3.8' and python_version >= '3.7' scikit-learn>=0.24.1 ; python_version < '3.7' and python_version >= '3.6' # Python 3.6 # xdev availpkg scipy -scipy>=1.9.2 ; python_version < '4.0' and python_version >= '3.11' # Python 3.11+ +scipy>=1.11.2 ; python_version < '4.0' and python_version >= '3.12' # Python 3.12+ +scipy>=1.9.2 ; python_version < '3.12' and python_version >= '3.11' # Python 3.11 scipy>=1.8.0 ; python_version < '3.11' and python_version >= '3.10' # Python 3.10 scipy>=1.8.0 ; python_version < '3.10' and python_version >= '3.9' # Python 3.9 scipy>=1.8.0 ; python_version < '3.9' and python_version >= '3.8' # Python 3.8 @@ -114,7 +116,8 @@ networkx>=2.6.2 ; python_version < '3.8' and python_version >= '3.7' networkx>=2.2.0,<=2.5.1 ; python_version < '3.7.0' and python_version >= '3.6.0' # Python 3.6 # xdev availpkg pandas --request_min=1.1.4 -pandas>=1.5.0 ; python_version < '4.0' and python_version >= '3.11' # Python 3.11+ +pandas>=2.2.0 ; python_version < '4.0' and python_version >= '3.12' # Python 3.12+ +pandas>=1.5.0 ; python_version < '3.12' and python_version >= '3.11' # Python 3.11 pandas>=1.3.5 ; python_version < '3.11' and python_version >= '3.10' # Python 3.10 pandas>=1.4.0 ; python_version < '3.10' and python_version >= '3.9' # Python 3.9 pandas>=1.4.0 ; python_version < '3.9' and python_version >= '3.8' # Python 3.8 @@ -133,8 +136,6 @@ cachetools>=4.0.0 ; python_version < '3.9' and python_version >= '3.8' cachetools>=5.0.0 ; python_version < '3.8' and python_version >= '3.7' # Python 3.7 cachetools>=4.0.0 ; python_version < '3.7' and python_version >= '3.6' # Python 3.6 -# pyparsing>=2.1.5 -# requests>=2.7.9 -pyparsing -requests +pyparsing >= 3.0.7 +requests >= 2.27.1 safer>=4.4.1 From 1167a644d6602bb7600167b6e9aad4105ae06627 Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 09:23:53 -0400 Subject: [PATCH 07/15] xcookie update --- .github/workflows/tests.yml | 168 +++++++++++++++++++++++++++++------- dev/setup_secrets.sh | 2 +- docs/source/conf.py | 21 +++-- publish.sh | 95 +++++++++++++++++--- pyproject.toml | 7 +- setup.py | 42 ++++++--- 6 files changed, 273 insertions(+), 62 deletions(-) mode change 100755 => 100644 setup.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8e8b2e5e3..d65460504 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -21,11 +21,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout source - uses: actions/checkout@v4 - - name: Set up Python 3.11 for linting - uses: actions/setup-python@v4.7.1 + uses: actions/checkout@v4.1.1 + - name: Set up Python 3.12 for linting + uses: actions/setup-python@v5.0.0 with: - python-version: '3.11' + python-version: '3.12' - name: Install dependencies run: |- python -m pip install --upgrade pip @@ -47,19 +47,19 @@ jobs: os: - ubuntu-latest python-version: - - '3.11' + - '3.12' arch: - auto steps: - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v4.1.1 - name: Set up QEMU uses: docker/setup-qemu-action@v3 if: runner.os == 'Linux' && matrix.arch != 'auto' with: platforms: all - name: Setup Python - uses: actions/setup-python@v4.7.1 + uses: actions/setup-python@v5.0.0 with: python-version: ${{ matrix.python-version }} - name: Build pure wheel @@ -71,13 +71,14 @@ jobs: - name: Show built files shell: bash run: ls -la wheelhouse - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v3.1.3 name: Upload wheels artifact with: name: wheels path: ./wheelhouse/ibeis*.whl test_purepy_wheels: name: ${{ matrix.python-version }} on ${{ matrix.os }}, arch=${{ matrix.arch }} with ${{ matrix.install-extras }} + if: "! startsWith(github.event.ref, 'refs/heads/release')" runs-on: ${{ matrix.os }} needs: - build_purepy_wheels @@ -87,10 +88,6 @@ jobs: # Xcookie generates an explicit list of environments that will be used # for testing instead of using the more concise matrix notation. include: - - python-version: '3.7' - install-extras: tests-strict,runtime-strict,headless-strict - os: ubuntu-latest - arch: auto - python-version: '3.8' install-extras: tests-strict,runtime-strict,headless-strict os: ubuntu-latest @@ -107,12 +104,12 @@ jobs: install-extras: tests-strict,runtime-strict,headless-strict os: ubuntu-latest arch: auto - - python-version: '3.7' - install-extras: tests-strict,runtime-strict,optional-strict,headless-strict + - python-version: '3.12' + install-extras: tests-strict,runtime-strict,headless-strict os: ubuntu-latest arch: auto - - python-version: '3.7' - install-extras: tests,optional,headless + - python-version: '3.8' + install-extras: tests-strict,runtime-strict,optional-strict,headless-strict os: ubuntu-latest arch: auto - python-version: '3.8' @@ -131,19 +128,23 @@ jobs: install-extras: tests,optional,headless os: ubuntu-latest arch: auto + - python-version: '3.12' + install-extras: tests,optional,headless + os: ubuntu-latest + arch: auto steps: - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v4.1.1 - name: Set up QEMU uses: docker/setup-qemu-action@v3 if: runner.os == 'Linux' && matrix.arch != 'auto' with: platforms: all - name: Setup Python - uses: actions/setup-python@v4.7.1 + uses: actions/setup-python@v5.0.0 with: python-version: ${{ matrix.python-version }} - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v2.1.1 name: Download wheels with: name: wheels @@ -160,6 +161,9 @@ jobs: pip install tomli pkginfo export WHEEL_FPATH=$(python -c "import pathlib; print(str(sorted(pathlib.Path('wheelhouse').glob('ibeis*.whl'))[-1]).replace(chr(92), chr(47)))") export MOD_VERSION=$(python -c "from pkginfo import Wheel; print(Wheel('$WHEEL_FPATH').version)") + echo "$WHEEL_FPATH=WHEEL_FPATH" + echo "$INSTALL_EXTRAS=INSTALL_EXTRAS" + echo "$MOD_VERSION=MOD_VERSION" pip install --prefer-binary "ibeis[$INSTALL_EXTRAS]==$MOD_VERSION" -f wheelhouse echo "Install finished." - name: Test wheel ${{ matrix.install-extras }} @@ -177,6 +181,7 @@ jobs: ls -altr # Get the path to the installed package and run the tests export MOD_DPATH=$(python -c "import ibeis, os; print(os.path.dirname(ibeis.__file__))") + export MOD_NAME=ibeis echo " --- MOD_DPATH = $MOD_DPATH @@ -196,15 +201,19 @@ jobs: if: github.event_name == 'push' && ! startsWith(github.event.ref, 'refs/tags') && ! startsWith(github.event.ref, 'refs/heads/release') needs: - build_purepy_wheels - - test_purepy_wheels steps: - name: Checkout source - uses: actions/checkout@v4 - - uses: actions/download-artifact@v3 - name: Download wheels and sdist + uses: actions/checkout@v4.1.1 + - uses: actions/download-artifact@v2.1.1 + name: Download wheels with: name: wheels path: wheelhouse + - uses: actions/download-artifact@v2.1.1 + name: Download sdist + with: + name: sdist_wheels + path: wheelhouse - name: Show files to upload shell: bash run: ls -la wheelhouse @@ -232,22 +241,52 @@ jobs: pip install urllib3 requests[security] twine GPG_KEYID=$(cat dev/public_gpg_key) echo "GPG_KEYID = '$GPG_KEYID'" - DO_GPG=True GPG_KEYID=$GPG_KEYID TWINE_REPOSITORY_URL=${TWINE_REPOSITORY_URL} TWINE_PASSWORD=$TWINE_PASSWORD TWINE_USERNAME=$TWINE_USERNAME GPG_EXECUTABLE=$GPG_EXECUTABLE DO_UPLOAD=True DO_TAG=False ./publish.sh + GPG_SIGN_CMD="$GPG_EXECUTABLE --batch --yes --detach-sign --armor --local-user $GPG_KEYID" + WHEEL_PATHS=(wheelhouse/*.whl wheelhouse/*.tar.gz) + WHEEL_PATHS_STR=$(printf '"%s" ' "${WHEEL_PATHS[@]}") + echo "$WHEEL_PATHS_STR" + for WHEEL_PATH in "${WHEEL_PATHS[@]}" + do + echo "------" + echo "WHEEL_PATH = $WHEEL_PATH" + $GPG_SIGN_CMD --output $WHEEL_PATH.asc $WHEEL_PATH + $GPG_EXECUTABLE --verify $WHEEL_PATH.asc $WHEEL_PATH || echo "hack, the first run of gpg very fails" + $GPG_EXECUTABLE --verify $WHEEL_PATH.asc $WHEEL_PATH + done + ls -la wheelhouse + pip install opentimestamps-client + ots stamp wheelhouse/*.whl wheelhouse/*.tar.gz wheelhouse/*.asc + ls -la wheelhouse + twine upload --username __token__ --password "$TWINE_PASSWORD" --repository-url "$TWINE_REPOSITORY_URL" wheelhouse/*.whl wheelhouse/*.tar.gz --skip-existing --verbose || { echo "failed to twine upload" ; exit 1; } + - uses: actions/upload-artifact@v3.1.3 + name: Upload deploy artifacts + with: + name: deploy_artifacts + path: |- + wheelhouse/*.whl + wheelhouse/*.zip + wheelhouse/*.tar.gz + wheelhouse/*.asc + wheelhouse/*.ots live_deploy: name: Uploading Live to PyPi runs-on: ubuntu-latest if: github.event_name == 'push' && (startsWith(github.event.ref, 'refs/tags') || startsWith(github.event.ref, 'refs/heads/release')) needs: - build_purepy_wheels - - test_purepy_wheels steps: - name: Checkout source - uses: actions/checkout@v4 - - uses: actions/download-artifact@v3 - name: Download wheels and sdist + uses: actions/checkout@v4.1.1 + - uses: actions/download-artifact@v2.1.1 + name: Download wheels with: name: wheels path: wheelhouse + - uses: actions/download-artifact@v2.1.1 + name: Download sdist + with: + name: sdist_wheels + path: wheelhouse - name: Show files to upload shell: bash run: ls -la wheelhouse @@ -275,7 +314,78 @@ jobs: pip install urllib3 requests[security] twine GPG_KEYID=$(cat dev/public_gpg_key) echo "GPG_KEYID = '$GPG_KEYID'" - DO_GPG=True GPG_KEYID=$GPG_KEYID TWINE_REPOSITORY_URL=${TWINE_REPOSITORY_URL} TWINE_PASSWORD=$TWINE_PASSWORD TWINE_USERNAME=$TWINE_USERNAME GPG_EXECUTABLE=$GPG_EXECUTABLE DO_UPLOAD=True DO_TAG=False ./publish.sh + GPG_SIGN_CMD="$GPG_EXECUTABLE --batch --yes --detach-sign --armor --local-user $GPG_KEYID" + WHEEL_PATHS=(wheelhouse/*.whl wheelhouse/*.tar.gz) + WHEEL_PATHS_STR=$(printf '"%s" ' "${WHEEL_PATHS[@]}") + echo "$WHEEL_PATHS_STR" + for WHEEL_PATH in "${WHEEL_PATHS[@]}" + do + echo "------" + echo "WHEEL_PATH = $WHEEL_PATH" + $GPG_SIGN_CMD --output $WHEEL_PATH.asc $WHEEL_PATH + $GPG_EXECUTABLE --verify $WHEEL_PATH.asc $WHEEL_PATH || echo "hack, the first run of gpg very fails" + $GPG_EXECUTABLE --verify $WHEEL_PATH.asc $WHEEL_PATH + done + ls -la wheelhouse + pip install opentimestamps-client + ots stamp wheelhouse/*.whl wheelhouse/*.tar.gz wheelhouse/*.asc + ls -la wheelhouse + twine upload --username __token__ --password "$TWINE_PASSWORD" --repository-url "$TWINE_REPOSITORY_URL" wheelhouse/*.whl wheelhouse/*.tar.gz --skip-existing --verbose || { echo "failed to twine upload" ; exit 1; } + - uses: actions/upload-artifact@v3.1.3 + name: Upload deploy artifacts + with: + name: deploy_artifacts + path: |- + wheelhouse/*.whl + wheelhouse/*.zip + wheelhouse/*.tar.gz + wheelhouse/*.asc + wheelhouse/*.ots + release: + name: Create Github Release + if: github.event_name == 'push' && (startsWith(github.event.ref, 'refs/tags') || startsWith(github.event.ref, 'refs/heads/release')) + runs-on: ubuntu-latest + permissions: + contents: write + needs: + - live_deploy + steps: + - name: Checkout source + uses: actions/checkout@v4.1.1 + - uses: actions/download-artifact@v2.1.1 + name: Download artifacts + with: + name: deploy_artifacts + path: wheelhouse + - name: Show files to release + shell: bash + run: ls -la wheelhouse + - run: 'echo "Automatic Release Notes. TODO: improve" > ${{ github.workspace }}-CHANGELOG.txt' + - name: Tag Release Commit + if: (startsWith(github.event.ref, 'refs/heads/release')) + run: |- + export VERSION=$(python -c "import setup; print(setup.VERSION)") + git tag "v$VERSION" + git push origin "v$VERSION" + - uses: softprops/action-gh-release@v1 + name: Create Release + id: create_release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + body_path: ${{ github.workspace }}-CHANGELOG.txt + tag_name: ${{ github.ref }} + name: Release ${{ github.ref }} + body: Automatic Release + generate_release_notes: true + draft: true + prerelease: false + files: |- + wheelhouse/*.whl + wheelhouse/*.asc + wheelhouse/*.ots + wheelhouse/*.zip + wheelhouse/*.tar.gz ### diff --git a/dev/setup_secrets.sh b/dev/setup_secrets.sh index 7b994cae0..6321e5ac5 100644 --- a/dev/setup_secrets.sh +++ b/dev/setup_secrets.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash __doc__=' ============================ SETUP CI SECRET INSTRUCTIONS diff --git a/docs/source/conf.py b/docs/source/conf.py index 846436d5a..8462d9afe 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -37,17 +37,17 @@ ### For gitlab - The user will need to enable the repo on their readthedocs account: - https://readthedocs.org/dashboard/import/manual/? - To enable the read-the-docs go to https://readthedocs.org/dashboard/ and login - Make sure you have a .readthedocs.yml file + The user will need to enable the repo on their readthedocs account: + https://readthedocs.org/dashboard/import/manual/? - Click import project: (for github you can select, but gitlab you need to import manually) + Enter the following information: Set the Repository NAME: ibeis Set the Repository URL: https://github.com/Erotemic/ibeis + Make sure you have a .readthedocs.yml file + For gitlab you also need to setup an integrations. Navigate to: https://readthedocs.org/dashboard/ibeis/integrations/create/ @@ -506,6 +506,17 @@ def text_art(lines): new_lines.extend(lines[1:]) return new_lines + # @self.register_section(tag='TODO', alias=['.. todo::']) + # def todo_section(lines): + # """ + # Fixup todo sections + # """ + # import xdev + # xdev.embed() + # import ubelt as ub + # print('lines = {}'.format(ub.urepr(lines, nl=1))) + # return new_lines + @self.register_section(tag='Ignore') def ignore(lines): return [] diff --git a/publish.sh b/publish.sh index 6a1d9c67d..237ee0d87 100755 --- a/publish.sh +++ b/publish.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash __doc__=' Script to publish a new version of this library on PyPI. @@ -24,6 +24,10 @@ Args: If True, sign the packages with a GPG key specified by `GPG_KEYID`. defaults to auto. + DO_OTS (bool) : + If True, make an opentimestamp for the package and signature (if + available) + DO_UPLOAD (bool) : If True, upload the packages to the pypi server specified by `TWINE_REPOSITORY_URL`. @@ -138,11 +142,21 @@ DO_UPLOAD=${DO_UPLOAD:=$ARG_1} DO_TAG=${DO_TAG:=$ARG_1} DO_GPG=${DO_GPG:="auto"} -# Verify that we want to build if [ "$DO_GPG" == "auto" ]; then DO_GPG="True" fi +DO_OTS=${DO_OTS:="auto"} +if [ "$DO_OTS" == "auto" ]; then + # Do opentimestamp if it is available + # python -m pip install opentimestamps-client + if type ots ; then + DO_OTS="True" + else + DO_OTS="False" + fi +fi + DO_BUILD=${DO_BUILD:="auto"} # Verify that we want to build if [ "$DO_BUILD" == "auto" ]; then @@ -150,6 +164,7 @@ if [ "$DO_BUILD" == "auto" ]; then fi DO_GPG=$(normalize_boolean "$DO_GPG") +DO_OTS=$(normalize_boolean "$DO_OTS") DO_BUILD=$(normalize_boolean "$DO_BUILD") DO_UPLOAD=$(normalize_boolean "$DO_UPLOAD") DO_TAG=$(normalize_boolean "$DO_TAG") @@ -237,6 +252,7 @@ GPG_KEYID = '$GPG_KEYID' DO_UPLOAD=${DO_UPLOAD} DO_TAG=${DO_TAG} DO_GPG=${DO_GPG} +DO_OTS=${DO_OTS} DO_BUILD=${DO_BUILD} MODE_LIST_STR=${MODE_LIST_STR} " @@ -375,7 +391,7 @@ ls_array(){ } -WHEEL_PATHS=() +WHEEL_FPATHS=() for _MODE in "${MODE_LIST[@]}" do if [[ "$_MODE" == "sdist" ]]; then @@ -393,32 +409,32 @@ do for new_item in "${_NEW_WHEEL_PATHS[@]}" do if [[ "$new_item" != "" ]]; then - WHEEL_PATHS+=("$new_item") + WHEEL_FPATHS+=("$new_item") fi done done # Dedup the paths -readarray -t WHEEL_PATHS < <(printf '%s\n' "${WHEEL_PATHS[@]}" | sort -u) +readarray -t WHEEL_FPATHS < <(printf '%s\n' "${WHEEL_FPATHS[@]}" | sort -u) -WHEEL_PATHS_STR=$(printf '"%s" ' "${WHEEL_PATHS[@]}") +WHEEL_PATHS_STR=$(printf '"%s" ' "${WHEEL_FPATHS[@]}") echo "WHEEL_PATHS_STR = $WHEEL_PATHS_STR" echo " MODE=$MODE VERSION='$VERSION' -WHEEL_PATHS='$WHEEL_PATHS_STR' +WHEEL_FPATHS='$WHEEL_PATHS_STR' " - +WHEEL_SIGNATURE_FPATHS=() if [ "$DO_GPG" == "True" ]; then echo " === === " - for WHEEL_FPATH in "${WHEEL_PATHS[@]}" + for WHEEL_FPATH in "${WHEEL_FPATHS[@]}" do echo "WHEEL_FPATH = $WHEEL_FPATH" check_variable WHEEL_FPATH @@ -439,6 +455,8 @@ if [ "$DO_GPG" == "True" ]; then echo "Verifying wheels" $GPG_EXECUTABLE --verify "$WHEEL_FPATH".asc "$WHEEL_FPATH" || { echo 'could not verify wheels' ; exit 1; } + + WHEEL_SIGNATURE_FPATHS+=("$WHEEL_FPATH".asc) done echo " === === @@ -448,6 +466,27 @@ else fi + +if [ "$DO_OTS" == "True" ]; then + + echo " + === === + " + if [ "$DO_GPG" == "True" ]; then + # Stamp the wheels and the signatures + ots stamp "${WHEEL_FPATHS[@]}" "${WHEEL_SIGNATURE_FPATHS[@]}" + else + # Stamp only the wheels + ots stamp "${WHEEL_FPATHS[@]}" + fi + echo " + === === + " +else + echo "DO_OTS=False, Skipping OTS sign" +fi + + if [[ "$DO_TAG" == "True" ]]; then TAG_NAME="v${VERSION}" # if we messed up we can delete the tag @@ -467,7 +506,7 @@ if [[ "$DO_UPLOAD" == "True" ]]; then check_variable TWINE_USERNAME check_variable TWINE_PASSWORD "hide" - for WHEEL_FPATH in "${WHEEL_PATHS[@]}" + for WHEEL_FPATH in "${WHEEL_FPATHS[@]}" do twine upload --username "$TWINE_USERNAME" "--password=$TWINE_PASSWORD" \ --repository-url "$TWINE_REPOSITORY_URL" \ @@ -496,3 +535,39 @@ else !!! FINISH: DRY RUN !!! """ fi + +__devel__=' +# Checking to see how easy it is to upload packages to gitlab. +# This logic should go in the CI script, not sure if it belongs here. + + +export HOST=https://gitlab.kitware.com +export GROUP_NAME=computer-vision +export PROJECT_NAME=geowatch +PROJECT_VERSION=$(geowatch --version) +echo "$PROJECT_VERSION" + +load_secrets +export PRIVATE_GITLAB_TOKEN=$(git_token_for "$HOST") +TMP_DIR=$(mktemp -d -t ci-XXXXXXXXXX) + +curl --header "PRIVATE-TOKEN: $PRIVATE_GITLAB_TOKEN" "$HOST/api/v4/groups" > "$TMP_DIR/all_group_info" +GROUP_ID=$(cat "$TMP_DIR/all_group_info" | jq ". | map(select(.name==\"$GROUP_NAME\")) | .[0].id") +echo "GROUP_ID = $GROUP_ID" + +curl --header "PRIVATE-TOKEN: $PRIVATE_GITLAB_TOKEN" "$HOST/api/v4/groups/$GROUP_ID" > "$TMP_DIR/group_info" +PROJ_ID=$(cat "$TMP_DIR/group_info" | jq ".projects | map(select(.name==\"$PROJECT_NAME\")) | .[0].id") +echo "PROJ_ID = $PROJ_ID" + +ls_array DIST_FPATHS "dist/*" + +for FPATH in "${DIST_FPATHS[@]}" +do + FNAME=$(basename $FPATH) + echo $FNAME + curl --header "PRIVATE-TOKEN: $PRIVATE_GITLAB_TOKEN" \ + --upload-file $FPATH \ + "https://gitlab.kitware.com/api/v4/projects/$PROJ_ID/packages/generic/$PROJECT_NAME/$PROJECT_VERSION/$FNAME" +done + +' diff --git a/pyproject.toml b/pyproject.toml index d14e5c016..c05661063 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,10 +13,7 @@ mod_name = "ibeis" os = [ "linux" ] repo_name = "ibeis" ci_pypy_versions = [] -supported_python_versions = [ - "3.7", "3.8", "3.9", "3.10", "3.11" - #"3.9" -] +min_python = 3.8 ci_versions_minimal_strict = '*' ci_versions_full_strict = 'min' ci_versions_minimal_loose = 'max' @@ -28,7 +25,7 @@ author="Jon Crall, Jason Parham" author_email="erotemic@gmail.com" version = "{mod_dpath}/__init__.py::__version__" license = "Apache 2" -dev_status = "beta" +dev_status = "stable" autostage = true diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 index fb8cb64a1..b79592e9c --- a/setup.py +++ b/setup.py @@ -76,6 +76,9 @@ def parse_requirements(fname="requirements.txt", versions=False): Returns: List[str]: list of requirements items + + CommandLine: + python -c "import setup, ubelt; print(ubelt.urepr(setup.parse_requirements()))" """ require_fpath = fname @@ -199,30 +202,45 @@ def gen_packages_items(): if __name__ == "__main__": setupkw = {} - setupkw["install_requires"] = parse_requirements("requirements/runtime.txt", versions="loose"), + setupkw["install_requires"] = parse_requirements( + "requirements/runtime.txt", versions="loose" + ) setupkw["extras_require"] = { "all": parse_requirements("requirements.txt", versions="loose"), - "tests": parse_requirements("requirements/tests.txt", versions="loose"), - "optional": parse_requirements("requirements/optional.txt", versions="loose"), "headless": parse_requirements("requirements/headless.txt", versions="loose"), "graphics": parse_requirements("requirements/graphics.txt", versions="loose"), - # Strict versions + "docs": parse_requirements("requirements/docs.txt", versions="loose"), + "optional": parse_requirements("requirements/optional.txt", versions="loose"), + "problematic": parse_requirements( + "requirements/problematic.txt", versions="loose" + ), + "runtime": parse_requirements("requirements/runtime.txt", versions="loose"), + "super_setup": parse_requirements( + "requirements/super_setup.txt", versions="loose" + ), + "tests": parse_requirements("requirements/tests.txt", versions="loose"), + "all-strict": parse_requirements("requirements.txt", versions="strict"), "headless-strict": parse_requirements( "requirements/headless.txt", versions="strict" ), "graphics-strict": parse_requirements( "requirements/graphics.txt", versions="strict" ), - "all-strict": parse_requirements("requirements.txt", versions="strict"), + "docs-strict": parse_requirements("requirements/docs.txt", versions="strict"), + "optional-strict": parse_requirements( + "requirements/optional.txt", versions="strict" + ), + "problematic-strict": parse_requirements( + "requirements/problematic.txt", versions="strict" + ), "runtime-strict": parse_requirements( "requirements/runtime.txt", versions="strict" ), - "tests-strict": parse_requirements("requirements/tests.txt", versions="strict"), - "optional-strict": parse_requirements( - "requirements/optional.txt", versions="strict" + "super_setup-strict": parse_requirements( + "requirements/super_setup.txt", versions="strict" ), + "tests-strict": parse_requirements("requirements/tests.txt", versions="strict"), } - setupkw["name"] = NAME setupkw["version"] = VERSION setupkw["author"] = "Jon Crall, Jason Parham" @@ -233,18 +251,18 @@ def gen_packages_items(): setupkw["long_description_content_type"] = "text/x-rst" setupkw["license"] = "Apache 2" setupkw["packages"] = find_packages(".") - setupkw["python_requires"] = ">=3.7" + setupkw["python_requires"] = ">=3.8" setupkw["classifiers"] = [ - "Development Status :: 4 - Beta", + "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities", "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", ] setupkw["entry_points"] = { "console_scripts": [ From ec848ddc018a70f2708f5afb1ddaab7c4f72c5b2 Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 09:24:06 -0400 Subject: [PATCH 08/15] rotate secrets --- dev/ci_public_gpg_key.pgp.enc | 98 +++++++++++++++---------------- dev/ci_secret_gpg_subkeys.pgp.enc | 68 ++++++++++----------- dev/gpg_owner_trust.enc | 24 ++++---- setup.py | 0 4 files changed, 95 insertions(+), 95 deletions(-) mode change 100644 => 100755 setup.py diff --git a/dev/ci_public_gpg_key.pgp.enc b/dev/ci_public_gpg_key.pgp.enc index 4f821c1cb..1b9d24d95 100644 --- a/dev/ci_public_gpg_key.pgp.enc +++ b/dev/ci_public_gpg_key.pgp.enc @@ -1,49 +1,49 @@ -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 -z0lGG7pdLlYb/6bICUgTmg== +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 +fVjTBiyltikNPveBlvdMRw== diff --git a/dev/ci_secret_gpg_subkeys.pgp.enc b/dev/ci_secret_gpg_subkeys.pgp.enc index c6520e1a4..220af520e 100644 --- a/dev/ci_secret_gpg_subkeys.pgp.enc +++ b/dev/ci_secret_gpg_subkeys.pgp.enc @@ -1,34 +1,34 @@ -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 diff --git a/dev/gpg_owner_trust.enc b/dev/gpg_owner_trust.enc index 722c669b9..897732553 100644 --- a/dev/gpg_owner_trust.enc +++ b/dev/gpg_owner_trust.enc @@ -1,12 +1,12 @@ -U2FsdGVkX1+ELfOohFT6YoLvyE6gmo87LpSv8dPgkw0T73zi3O0HdsqVpd3MucQ5 -F/qhUNxOV8kTMYyWERCV8yvjAExSDqSF0FD7b2qOW/PSVgpi+7b1YlQV4XB5j3Oz -4JZg3Kiz1VhrdgH5TxqnEwjZse7Y07h6u6YbhaN7xRBVRMENfjmPypxvMZmnwM3q -ulwNdW1GSBAsU7g2lgShJleFKzT4t0lNdlmI3pHPB3ZrnsyEnZfatWhV+zttLfuf -Oc4+lXdqNeeswJwlQVfHevAVwLtn/+vzT57giylCDC28BYq9xZEvqseOgCR/Hgcn -hr+hNlTfH4vBX8zMWy7YVZGbDjPIKmu2bZuPCSeVDGu2cZRzzUJBL2YviGALJdTB -tL1xVAjf5sY9h3xROBgLOJUuByYmKg8sMTBTgP4j4RUmfnW7DaUuM7z+523fxB90 -cfAJkhFCqqBvB1CsX0ckq81n1+QzQrWecBPDvBRu7rgBIPwWxiqP7+klBsTAccFw -p4VRETHEziswRSylotCDVOmVzqaNM6N7PCAM+yAmOq+9NQ1w5mMDcLoPp3B+xIII -JZCgRYLr4U+VYsIJh/9Dp7GRsc7l9ArTif6TMWu2cYcFjnriyU6HJtAEu3i/5XRr -uulAL4r+2uJz6ANnyWoY8ouYa6y5eCVTXCrTUWNXfotIhSJyLhppifGwcnkX5uhD -pPrfd1xytr9WVNDVRFRlzA== +U2FsdGVkX191XqqnaKPifj4OwC7u5fd6iQZwODMQLPlUcba1c6gOkY/gbJhBgIz2 +9+m3tgbln+Rro4WRPWx2lVzVqW9m5HK26d8QoHDOHOwhy7rIiremDD756m24AFk3 +vutgHi2+eLCeaFjZv/f4s9FX8Mic/lCJODRX1yMua5tYfBejz3UdeO+7aajgp3fU +TeMlDTfjuEeDFMWnZHzhdbiY0c/Dh0E9Raii9kxkeRAu+mAPGnZod7ALqoVv1wei +U+erXWywDJotsNPLSNv/eJdq9w4E0YWKmH17bDg5HxL/ClPk0ajOhjpX4x9LQRAC +5wbkxVi2VbGdxwP3Ek9fQwg2bOC1kUWFQAqE09BiIzczC254uR804GNlx4orLDfV +l14bg9T+ayVkJxdT3fkU0/BxB8kXwi5T49rjDB8QkwcqRBAX0MyS8SM4zwv/l0Xl +b4NgbR0YHLbdFrRVkZQeHN3xa/A/IncjiJoRmfX3dz8MwPq5KUQzxjiBkgx0gpch +iVdBtr123rBcswI1yAeia+IJlalMWrx9x7MOH83CZ74lRM4PwDPCxm2dPgCiJvGw +FjnCUWrUNnI9Fnm0TJA0kBYJbeMWJXs8DI9uuoxH4gHNo16UfLzd68rL3HffvA7W +R9gV5NSjLm+iYRZ3HdWSqWyrB3bU2EyZbkoo5/LVPf/4p3SJeTLdl/d6Z/B177Zw +2SyfflnYtC5HroEV8Ct72Q== diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 From f04b748711282e463aed04bfb1dac930479b418b Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 09:25:29 -0400 Subject: [PATCH 09/15] wip --- dev/_scripts/_timeits/time_uuids.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/_scripts/_timeits/time_uuids.py b/dev/_scripts/_timeits/time_uuids.py index 85f5a1945..fa8cab7d6 100755 --- a/dev/_scripts/_timeits/time_uuids.py +++ b/dev/_scripts/_timeits/time_uuids.py @@ -16,7 +16,7 @@ # My data getters from vtool_ibeis.tests import grabdata elephant = grabdata.get_testimg_path('elephant.jpg') -lena = grabdata.get_testimg_path('lena.jpg') +astro = grabdata.get_testimg_path('astro.jpg') zebra = grabdata.get_testimg_path('zebra.jpg') jeff = grabdata.get_testimg_path('jeff.png') gpath = zebra From 932522dcb31fcd871cbde4c005b26af38b0d675b Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 09:25:58 -0400 Subject: [PATCH 10/15] bump vtool --- requirements/runtime.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/runtime.txt b/requirements/runtime.txt index d210dcf32..ba5d5ba3f 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -1,6 +1,6 @@ # Our IBEIS-specific pure python packages utool>=2.2.0 -vtool_ibeis>=2.2.0 +vtool_ibeis>=2.3.0 dtool_ibeis>=1.1.2 plottool_ibeis>=2.3.0 guitool_ibeis>=2.2.0 From bdb83b383eab3665accc5b0600e7d5d82752f0ef Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 10:07:27 -0400 Subject: [PATCH 11/15] Add kwcoco export --- CHANGELOG.md | 5 +- ibeis/control/IBEISControl.py | 106 ++++++++++++++++++++++++++++++++++ ibeis/gui/guiback.py | 7 +++ ibeis/gui/guimenus.py | 5 ++ 4 files changed, 122 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0a3f2b21..abed69e95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,10 @@ We are currently working on porting this changelog to the specifications in This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -### [Version 2.3.3] - Released xx +### [Version 2.4.0] - Released xx + +### Added +* Can now dump a simplified version of the database to a kwcoco file ### [Version 2.3.2] - Released 2024-02-01 diff --git a/ibeis/control/IBEISControl.py b/ibeis/control/IBEISControl.py index 38ad17c7b..f31fbdd26 100755 --- a/ibeis/control/IBEISControl.py +++ b/ibeis/control/IBEISControl.py @@ -1095,6 +1095,112 @@ def dump_database_csv(ibs): ibs.db.dump_to_fpath(dump_fpath=join(dump_dir, '_ibsdb.dump')) return dump_dir + def dump_database_kwcoco(ibs): + """ + Ignore: + >>> # DISABLE_DOCTEST + >>> import ibeis + >>> ibs = ibeis.opendb(defaultdb='PZ_MTEST') + >>> ibs.dump_database_kwcoco() + + Ignore: + db = ibs.db + tablename = tblname = 'annotations' + db.get_table_column_data(tblname) + print(db.get_table_csv(tblname)) + """ + import kwcoco + import kwutil + import numpy as np + import kwimage + dump_dir = ub.Path(ibs.get_dbdir()) / 'KWCOCO_DUMP' + dump_dir.ensuredir() + + db = ibs.db + + def _table_rows(tablename, prefix): + column_list, column_names = db.get_table_column_data( + tablename, rowids=None, columns=None, + exclude_columns=[]) + + normalized_colnames = [] + for colname in column_names: + if colname.startswith(prefix): + colname = colname[len(prefix):] + normalized_colnames.append(colname) + + for col_values in zip(*column_list): + row = dict(zip(normalized_colnames, col_values)) + yield row + + dset = kwcoco.CocoDataset() + + # NOTE: not all ibsdb tables are dumped into kwcoco. + # It is currently a very basic encoding + + custom_tables = {} + tablename = 'species' + prefix = 'species_' + species_table = [] + for row in _table_rows(tablename, prefix): + row['id'] = row.pop('rowid') + row['uuid'] = str(row['uuid']) + species_table.append(row) + custom_tables['species'] = species_table + + tablename = 'names' + prefix = 'name_' + name_table = [] + for row in _table_rows(tablename, prefix): + row['id'] = row.pop('rowid') + row['uuid'] = str(row['uuid']) + name_table.append(row) + custom_tables['species'] = name_table + dset.dataset.update(custom_tables) + + tablename = 'images' + prefix = 'image_' + image_dpath = ub.Path(ibs.get_imgdir()) + for row in _table_rows(tablename, prefix): + row['id'] = row.pop('rowid') + row['uuid'] = str(row['uuid']) + row['datetime'] = kwutil.util_time.datetime.coerce(row['time_posix']).isoformat() + row['file_name'] = image_dpath / row.pop('uri') + dset.add_image(**row) + + tablename = 'annotations' + prefix = 'annot_' + for row in _table_rows(tablename, prefix): + row['id'] = row.pop('rowid') + row['image_id'] = row.pop('image_rowid') + row['uuid'] = str(row['uuid']) + row['visual_uuid'] = str(row['visual_uuid']) + row['semantic_uuid'] = str(row['semantic_uuid']) + x1 = row.pop('xtl') + y1 = row.pop('ytl') + width = row.pop('width') + height = row.pop('height') + theta = row.pop('theta') + exterior = np.array(eval(row.pop('verts'), {}, {})) + poly = kwimage.Polygon(exterior=exterior) + if theta == 0: + row['bbox'] = [x1, y1, width, height] + else: + row['bbox'] = list(poly.bounding_box().to_coco())[0] + row['obbox'] = {'data': [x1, y1, width, height, theta], 'format': ['xywho']} + row['polygon'] = poly.to_coco(style='new') + dset.add_annotation(**row) + + print(ibs.db.get_table_csv('images')) + + fpath = dump_dir / 'ibsdb.kwcoco.zip' + dset.fpath = fpath + dset.dump() + return dset.fpath + + # ibs.db.dump_to_fpath(dump_fpath=join(dump_dir, 'ibsdb.kwcoco.zip')) + # return dump_dir + def get_database_icon(ibs, max_dsize=(None, 192), aid=None): r""" Args: diff --git a/ibeis/gui/guiback.py b/ibeis/gui/guiback.py index c18ee4301..93ebf95fa 100755 --- a/ibeis/gui/guiback.py +++ b/ibeis/gui/guiback.py @@ -3119,6 +3119,13 @@ def export_database_as_csv(back): dump_dir = back.ibs.dump_database_csv() ut.view_directory(dump_dir) + @blocking_slot() + def export_database_as_kwcoco(back): + """ File -> Export Database """ + print('[back] export_database_as_kwcoco') + dump_dir = back.ibs.dump_database_kwcoco() + ut.view_directory(dump_dir) + @blocking_slot() def backup_database(back): """ File -> Backup Database""" diff --git a/ibeis/gui/guimenus.py b/ibeis/gui/guimenus.py index f885c2123..9ad30fc58 100755 --- a/ibeis/gui/guimenus.py +++ b/ibeis/gui/guimenus.py @@ -98,6 +98,11 @@ def setup_file_menu(mainwin, back): tooltip='Dumps and exports database as csv tables.', text='Export As CSV', triggered=back.export_database_as_csv) + menu.newAction( + name='actionExport_Database_KWCoco', + tooltip='Dumps and exports database as KWCoco.', + text='Export As KWCoco', + triggered=back.export_database_as_kwcoco) menu.newAction( name='actionDuplicate_Database', tooltip='Creates a duplicate of the database', From 2bb5e6e803829e9937200603ea70bcb902286a33 Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 10:11:07 -0400 Subject: [PATCH 12/15] pillow req --- CHANGELOG.md | 1 - requirements/runtime.txt | 8 ++++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abed69e95..bf9bc23dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -66,4 +66,3 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Added * First semi-usable pip release - diff --git a/requirements/runtime.txt b/requirements/runtime.txt index ba5d5ba3f..26e888ff6 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -125,9 +125,13 @@ pandas>=1.2.0 ; python_version < '3.8' and python_version >= '3.7' # Python pandas>=1.1.4 ; python_version < '3.7' and python_version >= '3.6' # Python 3.6.1 -Pillow>=9.2.0 ; python_version < '4.0' and python_version >= '3.11' # Python 3.11+ +Pillow>=10.0.0 ; python_version < '4.0' and python_version >= '3.12' # Python 3.12+ +Pillow>=9.4.0 ; python_version < '3.12' and python_version >= '3.11' # Python 3.11 Pillow>=9.1.0 ; python_version < '3.11' and python_version >= '3.10' # Python 3.10 -Pillow>=8.0.0 ; python_version < '3.10' and python_version >= '3.6' # Python 3.6-3.9 +Pillow>=8.3.2 ; python_version < '3.10' and python_version >= '3.9' # Python 3.9 +Pillow>=8.3.2 ; python_version < '3.9' and python_version >= '3.8' # Python 3.8 +Pillow>=9.0.0 ; python_version < '3.8' and python_version >= '3.7' # Python 3.7 +Pillow>=8.3.2 ; python_version < '3.7' and python_version >= '3.6' # Python 3.6 cachetools>=5.0.0 ; python_version < '4.0' and python_version >= '3.11' # Python 3.11+ cachetools>=5.0.0 ; python_version < '3.11' and python_version >= '3.10' # Python 3.10 From 416428572bab2d6aa482f7a493cbde4818b0d999 Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 10:26:24 -0400 Subject: [PATCH 13/15] rotate points --- dev/ci_public_gpg_key.pgp.enc | 98 +++++++++++++++---------------- dev/ci_secret_gpg_subkeys.pgp.enc | 68 ++++++++++----------- dev/gpg_owner_trust.enc | 24 ++++---- 3 files changed, 95 insertions(+), 95 deletions(-) diff --git a/dev/ci_public_gpg_key.pgp.enc b/dev/ci_public_gpg_key.pgp.enc index 1b9d24d95..a97e68150 100644 --- a/dev/ci_public_gpg_key.pgp.enc +++ b/dev/ci_public_gpg_key.pgp.enc @@ -1,49 +1,49 @@ -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 -fVjTBiyltikNPveBlvdMRw== +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 +Siv1Yf+we9qIWUiidmLgFg== diff --git a/dev/ci_secret_gpg_subkeys.pgp.enc b/dev/ci_secret_gpg_subkeys.pgp.enc index 220af520e..3a749e0dd 100644 --- a/dev/ci_secret_gpg_subkeys.pgp.enc +++ b/dev/ci_secret_gpg_subkeys.pgp.enc @@ -1,34 +1,34 @@ -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 diff --git a/dev/gpg_owner_trust.enc b/dev/gpg_owner_trust.enc index 897732553..f39632a40 100644 --- a/dev/gpg_owner_trust.enc +++ b/dev/gpg_owner_trust.enc @@ -1,12 +1,12 @@ -U2FsdGVkX191XqqnaKPifj4OwC7u5fd6iQZwODMQLPlUcba1c6gOkY/gbJhBgIz2 -9+m3tgbln+Rro4WRPWx2lVzVqW9m5HK26d8QoHDOHOwhy7rIiremDD756m24AFk3 -vutgHi2+eLCeaFjZv/f4s9FX8Mic/lCJODRX1yMua5tYfBejz3UdeO+7aajgp3fU -TeMlDTfjuEeDFMWnZHzhdbiY0c/Dh0E9Raii9kxkeRAu+mAPGnZod7ALqoVv1wei -U+erXWywDJotsNPLSNv/eJdq9w4E0YWKmH17bDg5HxL/ClPk0ajOhjpX4x9LQRAC -5wbkxVi2VbGdxwP3Ek9fQwg2bOC1kUWFQAqE09BiIzczC254uR804GNlx4orLDfV -l14bg9T+ayVkJxdT3fkU0/BxB8kXwi5T49rjDB8QkwcqRBAX0MyS8SM4zwv/l0Xl -b4NgbR0YHLbdFrRVkZQeHN3xa/A/IncjiJoRmfX3dz8MwPq5KUQzxjiBkgx0gpch -iVdBtr123rBcswI1yAeia+IJlalMWrx9x7MOH83CZ74lRM4PwDPCxm2dPgCiJvGw -FjnCUWrUNnI9Fnm0TJA0kBYJbeMWJXs8DI9uuoxH4gHNo16UfLzd68rL3HffvA7W -R9gV5NSjLm+iYRZ3HdWSqWyrB3bU2EyZbkoo5/LVPf/4p3SJeTLdl/d6Z/B177Zw -2SyfflnYtC5HroEV8Ct72Q== +U2FsdGVkX18T1u+FlRnyd4g+xZv+3/vBqg+iovWD31DiFkw2Uy6AqAXOtjSVeZhh +9Ws4au0sSBhjVEg14t0zmuJYx36M8KTwdzu/0kiTJ+BkbH6omzwiWG5hTlGvdGn+ +CHAVf99qvNo2C1MaZtrSIyrTRFt2hyU2YQsa5A9MWTpvan/DmTbj8rA3ECw0nW71 +sLBFgMSiwJ1S9R6a+BbIZW8CdnsZ4S7CkP7ve7c+cQ9LVrhjPrlAZB6zCaecafFq +/FvmkemwGCUDGyybjvM47+gpVHZFRboOU1DpHr1vPrWVNk9DeKlv1vIshUCCkX3C +75r/PLAQUywGFsOARdJ8SRMkGDVAekXCQ6gqyppXi5pva02KHBDdluXwOaurQtru +SX/24dzgcttICKMGN8WxrJuNbPgw9vHcbOm3MwdfW5/W9JvcMuzIYSMu2luCHo5A +DoOdmgzwkI9OsJ7ZN09TR0k1E9AKiAX/pr99UGPDvEykP2/St668xfRtJcsQz+j1 +t6+Uum11dUCn+KKLLxQGIafsG/H792IAdifVgR8sWEAHRVmc53qpU5EacpIEDZXa +0H4FajWJpQfYP1EAB0pwfOzV0vE8Wq4lwt6F7/wwWEGBXI9nCClh+qUzxoh2Orbu +BOSAgXe9v5B1l/KlKftumBWKBd85iEmXJ58V6DJ+94fSs0Z3Ae7u9pfj+2ddLFIx +GNFU2qSuiYA4HXq85C/++A== From acd872a04b3baa89e5cf00cd92785eadc61277b8 Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 10:27:43 -0400 Subject: [PATCH 14/15] Bump numpy --- requirements/runtime.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/runtime.txt b/requirements/runtime.txt index 26e888ff6..914634877 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -69,7 +69,7 @@ matplotlib>=2.2.2 ; python_version < '3.8' and python_version >= '3.7' matplotlib>=1.5.3 ; python_version < '3.7' and python_version >= '3.6' # Python 3.6 numpy>=1.26.0 ; python_version < '4.0' and python_version >= '3.12' # Python 3.12+ -numpy>=1.23.2 ; python_version < '3.12' and python_version >= '3.11' # Python 3.11 +numpy>=1.24.0 ; python_version < '3.12' and python_version >= '3.11' # Python 3.11 numpy>=1.21.6 ; python_version < '3.11' and python_version >= '3.10' # Python 3.10 numpy>=1.19.3 ; python_version < '3.10' and python_version >= '3.9' # Python 3.9 numpy>=1.19.2 ; python_version < '3.9' and python_version >= '3.8' # Python 3.8 From 40c465b2aa405ec57c930f99cd43ef2c438845a5 Mon Sep 17 00:00:00 2001 From: joncrall Date: Tue, 16 Apr 2024 10:33:32 -0400 Subject: [PATCH 15/15] Set max version to 3.11 --- .github/workflows/tests.yml | 14 +++----------- pyproject.toml | 1 + requirements/runtime.txt | 4 +++- setup.py | 1 - 4 files changed, 7 insertions(+), 13 deletions(-) mode change 100755 => 100644 setup.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d65460504..82f34b25b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -22,10 +22,10 @@ jobs: steps: - name: Checkout source uses: actions/checkout@v4.1.1 - - name: Set up Python 3.12 for linting + - name: Set up Python 3.11 for linting uses: actions/setup-python@v5.0.0 with: - python-version: '3.12' + python-version: '3.11' - name: Install dependencies run: |- python -m pip install --upgrade pip @@ -47,7 +47,7 @@ jobs: os: - ubuntu-latest python-version: - - '3.12' + - '3.11' arch: - auto steps: @@ -104,10 +104,6 @@ jobs: install-extras: tests-strict,runtime-strict,headless-strict os: ubuntu-latest arch: auto - - python-version: '3.12' - install-extras: tests-strict,runtime-strict,headless-strict - os: ubuntu-latest - arch: auto - python-version: '3.8' install-extras: tests-strict,runtime-strict,optional-strict,headless-strict os: ubuntu-latest @@ -128,10 +124,6 @@ jobs: install-extras: tests,optional,headless os: ubuntu-latest arch: auto - - python-version: '3.12' - install-extras: tests,optional,headless - os: ubuntu-latest - arch: auto steps: - name: Checkout source uses: actions/checkout@v4.1.1 diff --git a/pyproject.toml b/pyproject.toml index c05661063..7a6c3c364 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ os = [ "linux" ] repo_name = "ibeis" ci_pypy_versions = [] min_python = 3.8 +max_python = 3.11 ci_versions_minimal_strict = '*' ci_versions_full_strict = 'min' ci_versions_minimal_loose = 'max' diff --git a/requirements/runtime.txt b/requirements/runtime.txt index 914634877..ffbb867ee 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -50,7 +50,9 @@ ubelt >= 1.3.4 pyqt5>=5.15.10 ; python_version < '4.0' and python_version >= '3.12' # Python 3.12 pyqt5>=5.15.5 ; python_version < '3.12' and python_version >= '2.7' # Python 3.11- -pynmea2>=1.5.3 +pynmea2>=1.13.0 ; python_version < '4.0' and python_version >= '3.12' # Python 3.12+ +pynmea2>=1.5.3 ; python_version < '3.12' and python_version >= '3.6' # Python 3.6 + #tornado>=4.2.1 tornado>=6.2 diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 index b79592e9c..c002a1cb2 --- a/setup.py +++ b/setup.py @@ -262,7 +262,6 @@ def gen_packages_items(): "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", ] setupkw["entry_points"] = { "console_scripts": [