Hi, your project fsdl-text-recognizer-project requires "boltons==20.0.0" in its dependency. After analyzing the source code, we found that the following versions of boltons can also be suitable without affecting your project, i.e., boltons 19.0.0, 19.0.1, 19.1.0, 19.2.0, 19.3.0, 20.1.0, 20.2.0, 20.2.1, 21.0.0. Therefore, we suggest to loosen the dependency on boltons from "boltons==20.0.0" to "boltons>=19.0.0,<=21.0.0" to avoid any possible conflict for importing more packages or for downstream projects that may use fsdl-text-recognizer-project.
May I pull a request to further loosen the dependency on boltons?
By the way, could you please tell us whether such dependency analysis may be potentially helpful for maintaining dependencies easier during your development?
We also give our detailed analysis as follows for your reference:
Your project fsdl-text-recognizer-project directly uses 1 APIs from package boltons.
boltons.cacheutils.cachedproperty.__init__
Beginning from the 1 APIs above, 0 functions are then indirectly called, including 0 boltons's internal APIs and 0 outsider APIs. The specific call graph is listed as follows (neglecting some repeated function occurrences).
[/full-stack-deep-learning/fsdl-text-recognizer-project]
+--boltons.cacheutils.cachedproperty.__init__
We scan boltons's versions and observe that during its evolution between any version from [19.0.0, 19.0.1, 19.1.0, 19.2.0, 19.3.0, 20.1.0, 20.2.0, 20.2.1, 21.0.0] and 20.0.0, the changing functions (diffs being listed below) have none intersection with any function or API we mentioned above (either directly or indirectly called by this project).
diff: 20.0.0(original) 19.0.0
['boltons.funcutils.wraps', 'boltons.dictutils.OneToOne.__init__', 'boltons.pathutils.shrinkuser', 'boltons.funcutils.inspect_formatargspec', 'boltons.funcutils.FunctionBuilder.get_func', 'boltons.funcutils.FunctionBuilder', 'boltons.setutils._ComplementSet.__rsub__', 'boltons.cacheutils.MinIDMap.iteritems', 'boltons.tbutils.TracebackInfo.from_frame', 'boltons.cacheutils.ThresholdCounter.most_common', 'boltons.pathutils.expandpath', 'boltons.strutils.StringBuffer.__init__', 'boltons.strutils.StringBuffer.getvalue', 'boltons.setutils._ComplementSet', 'boltons.strutils.StringBuffer', 'boltons.strutils.StringBuffer.truncate', 'boltons.strutils.StringBuffer.write', 'boltons.dictutils.OrderedMultiDict', 'boltons.fileutils.iter_find_files', 'boltons.setutils.complement', 'boltons.funcutils.format_exp_repr', 'boltons.cacheutils.MinIDMap', 'boltons.mathutils.Bits', 'boltons.funcutils.FunctionBuilder.get_invocation_str', 'boltons.funcutils.FunctionBuilder.add_arg', 'boltons.dictutils.OneToOne', 'boltons.pathutils.augpath', 'boltons.strutils.unwrap_text', 'boltons.iterutils.chunked_iter', 'boltons.statsutils.Stats', 'boltons.cacheutils.ThresholdCounter', 'boltons.urlutils.OrderedMultiDict.sorted', 'boltons.funcutils.format_nonexp_repr', 'boltons.strutils.gzip_bytes', 'boltons.setutils._ComplementSet.__len__', 'boltons.setutils._ComplementSet.__bool__', 'boltons.dictutils.OrderedMultiDict.sorted', 'boltons.urlutils.OrderedMultiDict', 'boltons.funcutils.FunctionBuilder.get_defaults_dict', 'boltons.setutils._ComplementSet.__iter__', 'boltons.iterutils.flatten', 'boltons.queueutils.BasePriorityQueue', 'boltons.funcutils.FunctionBuilder.get_sig_str', 'boltons.cacheutils.ThresholdCounter.get_common_count', 'boltons.funcutils.format_invocation', 'boltons.statsutils.Stats.format_histogram', 'boltons.tbutils.TracebackInfo', 'boltons.funcutils.FunctionBuilder.get_arg_names', 'boltons.iterutils.partition', 'boltons.fileutils.FilePerms', 'boltons.funcutils.FunctionBuilder.from_func', 'boltons.cacheutils.MinIDMap.__iter__', 'boltons.iterutils.bucketize', 'boltons.dictutils.OneToOne.unique', 'boltons.fileutils.FilePerms.from_path']
diff: 20.0.0(original) 19.0.1
['boltons.dictutils.OneToOne.__init__', 'boltons.pathutils.shrinkuser', 'boltons.funcutils.inspect_formatargspec', 'boltons.funcutils.FunctionBuilder', 'boltons.setutils._ComplementSet.__rsub__', 'boltons.cacheutils.MinIDMap.iteritems', 'boltons.tbutils.TracebackInfo.from_frame', 'boltons.cacheutils.ThresholdCounter.most_common', 'boltons.pathutils.expandpath', 'boltons.strutils.StringBuffer.__init__', 'boltons.strutils.StringBuffer.getvalue', 'boltons.setutils._ComplementSet', 'boltons.strutils.StringBuffer', 'boltons.strutils.StringBuffer.truncate', 'boltons.strutils.StringBuffer.write', 'boltons.dictutils.OrderedMultiDict', 'boltons.fileutils.iter_find_files', 'boltons.setutils.complement', 'boltons.funcutils.format_exp_repr', 'boltons.cacheutils.MinIDMap', 'boltons.funcutils.FunctionBuilder.get_invocation_str', 'boltons.dictutils.OneToOne', 'boltons.pathutils.augpath', 'boltons.strutils.unwrap_text', 'boltons.iterutils.chunked_iter', 'boltons.statsutils.Stats', 'boltons.cacheutils.ThresholdCounter', 'boltons.urlutils.OrderedMultiDict.sorted', 'boltons.funcutils.format_nonexp_repr', 'boltons.strutils.gzip_bytes', 'boltons.setutils._ComplementSet.__len__', 'boltons.setutils._ComplementSet.__bool__', 'boltons.dictutils.OrderedMultiDict.sorted', 'boltons.urlutils.OrderedMultiDict', 'boltons.funcutils.FunctionBuilder.get_defaults_dict', 'boltons.setutils._ComplementSet.__iter__', 'boltons.iterutils.flatten', 'boltons.queueutils.BasePriorityQueue', 'boltons.funcutils.FunctionBuilder.get_sig_str', 'boltons.cacheutils.ThresholdCounter.get_common_count', 'boltons.funcutils.format_invocation', 'boltons.statsutils.Stats.format_histogram', 'boltons.tbutils.TracebackInfo', 'boltons.funcutils.FunctionBuilder.get_arg_names', 'boltons.iterutils.partition', 'boltons.fileutils.FilePerms', 'boltons.cacheutils.MinIDMap.__iter__', 'boltons.iterutils.bucketize', 'boltons.dictutils.OneToOne.unique', 'boltons.fileutils.FilePerms.from_path']
diff: 20.0.0(original) 19.1.0
['boltons.dictutils.OneToOne.__init__', 'boltons.pathutils.shrinkuser', 'boltons.funcutils.inspect_formatargspec', 'boltons.funcutils.FunctionBuilder', 'boltons.setutils._ComplementSet.__rsub__', 'boltons.cacheutils.MinIDMap.iteritems', 'boltons.tbutils.TracebackInfo.from_frame', 'boltons.cacheutils.ThresholdCounter.most_common', 'boltons.pathutils.expandpath', 'boltons.setutils._ComplementSet', 'boltons.dictutils.OrderedMultiDict', 'boltons.fileutils.iter_find_files', 'boltons.setutils.complement', 'boltons.funcutils.format_exp_repr', 'boltons.cacheutils.MinIDMap', 'boltons.funcutils.FunctionBuilder.get_invocation_str', 'boltons.dictutils.OneToOne', 'boltons.pathutils.augpath', 'boltons.strutils.unwrap_text', 'boltons.iterutils.chunked_iter', 'boltons.statsutils.Stats', 'boltons.cacheutils.ThresholdCounter', 'boltons.urlutils.OrderedMultiDict.sorted', 'boltons.funcutils.format_nonexp_repr', 'boltons.setutils._ComplementSet.__len__', 'boltons.setutils._ComplementSet.__bool__', 'boltons.dictutils.OrderedMultiDict.sorted', 'boltons.urlutils.OrderedMultiDict', 'boltons.setutils._ComplementSet.__iter__', 'boltons.iterutils.flatten', 'boltons.funcutils.FunctionBuilder.get_sig_str', 'boltons.cacheutils.ThresholdCounter.get_common_count', 'boltons.funcutils.format_invocation', 'boltons.statsutils.Stats.format_histogram', 'boltons.tbutils.TracebackInfo', 'boltons.iterutils.partition', 'boltons.fileutils.FilePerms', 'boltons.cacheutils.MinIDMap.__iter__', 'boltons.iterutils.bucketize', 'boltons.dictutils.OneToOne.unique', 'boltons.fileutils.FilePerms.from_path']
diff: 20.0.0(original) 19.2.0
['boltons.strutils.unwrap_text', 'boltons.fileutils.iter_find_files', 'boltons.pathutils.shrinkuser', 'boltons.iterutils.chunked_iter', 'boltons.cacheutils.ThresholdCounter.get_common_count', 'boltons.funcutils.format_invocation', 'boltons.funcutils.format_exp_repr', 'boltons.cacheutils.ThresholdCounter', 'boltons.funcutils.format_nonexp_repr', 'boltons.cacheutils.MinIDMap', 'boltons.cacheutils.MinIDMap.__iter__', 'boltons.cacheutils.MinIDMap.iteritems', 'boltons.cacheutils.ThresholdCounter.most_common', 'boltons.pathutils.expandpath', 'boltons.pathutils.augpath']
diff: 20.0.0(original) 19.3.0
['boltons.strutils.unwrap_text', 'boltons.fileutils.iter_find_files', 'boltons.pathutils.shrinkuser', 'boltons.iterutils.chunked_iter', 'boltons.cacheutils.ThresholdCounter.get_common_count', 'boltons.funcutils.format_invocation', 'boltons.cacheutils.ThresholdCounter', 'boltons.cacheutils.MinIDMap', 'boltons.cacheutils.MinIDMap.__iter__', 'boltons.cacheutils.MinIDMap.iteritems', 'boltons.cacheutils.ThresholdCounter.most_common', 'boltons.pathutils.expandpath', 'boltons.pathutils.augpath']
diff: 20.0.0(original) 20.1.0
['boltons.funcutils.wraps', 'boltons.funcutils.FunctionBuilder', 'boltons.ioutils.SpooledIOBase', 'boltons.socketutils.NetstringSocket.setmaxsize', 'boltons.ioutils.SpooledIOBase.readable', 'boltons.setutils.IndexedSet.index', 'boltons.funcutils.InstancePartial._partialmethod', 'boltons.funcutils.InstancePartial', 'boltons.funcutils.CachedInstancePartial', 'boltons.funcutils.CachedInstancePartial._partialmethod', 'boltons.urlutils.URL', 'boltons.socketutils.NetstringSocket._calc_msgsize_maxsize', 'boltons.funcutils.update_wrapper', 'boltons.setutils.IndexedSet._get_apparent_index', 'boltons.socketutils.NetstringSocket', 'boltons.ioutils.SpooledIOBase.writable', 'boltons.ioutils.SpooledIOBase.seekable', 'boltons.socketutils.NetstringSocket.read_ns', 'boltons.setutils.IndexedSet', 'boltons.funcutils.FunctionBuilder.from_func', 'boltons.ecoutils.get_profile_json']
diff: 20.0.0(original) 20.2.0
['boltons.funcutils.wraps', 'boltons.strutils.strip_ansi', 'boltons.listutils.BarrelList.__iter__', 'boltons.funcutils.FunctionBuilder', 'boltons.ioutils.SpooledIOBase', 'boltons.iterutils.lstrip_iter', 'boltons.iterutils.rstrip', 'boltons.socketutils.NetstringSocket.setmaxsize', 'boltons.iterutils.lstrip', 'boltons.ioutils.SpooledIOBase.readable', 'boltons.listutils.BarrelList', 'boltons.setutils.IndexedSet.index', 'boltons.funcutils.InstancePartial._partialmethod', 'boltons.iterutils.untyped_sorted', 'boltons.funcutils.InstancePartial', 'boltons.funcutils.CachedInstancePartial', 'boltons.funcutils.CachedInstancePartial._partialmethod', 'boltons.setutils.IndexedSet.__rsub__', 'boltons.urlutils.URL', 'boltons.socketutils.NetstringSocket._calc_msgsize_maxsize', 'boltons.strutils.int_ranges_from_int_list', 'boltons.funcutils.update_wrapper', 'boltons.setutils.IndexedSet._get_apparent_index', 'boltons.socketutils.NetstringSocket', 'boltons.ioutils.SpooledIOBase.writable', 'boltons.fileutils.AtomicSaver.__init__', 'boltons.iterutils.strip_iter', 'boltons.ioutils.SpooledIOBase.seekable', 'boltons.strutils.complement_int_list', 'boltons.iterutils.rstrip_iter', 'boltons.socketutils.NetstringSocket.read_ns', 'boltons.iterutils.strip', 'boltons.fileutils.AtomicSaver', 'boltons.setutils.IndexedSet', 'boltons.funcutils.FunctionBuilder.from_func', 'boltons.ecoutils.get_profile_json']
diff: 20.0.0(original) 20.2.1
['boltons.funcutils.wraps', 'boltons.strutils.strip_ansi', 'boltons.listutils.BarrelList.__iter__', 'boltons.iterutils.SequentialGUIDerator.reseed', 'boltons.funcutils.FunctionBuilder', 'boltons.ioutils.SpooledIOBase', 'boltons.iterutils.lstrip_iter', 'boltons.iterutils.GUIDerator.__init__', 'boltons.iterutils.rstrip', 'boltons.socketutils.NetstringSocket.setmaxsize', 'boltons.iterutils.lstrip', 'boltons.ioutils.SpooledIOBase.readable', 'boltons.listutils.BarrelList', 'boltons.setutils.IndexedSet.index', 'boltons.funcutils.InstancePartial._partialmethod', 'boltons.iterutils.untyped_sorted', 'boltons.funcutils.InstancePartial', 'boltons.funcutils.CachedInstancePartial', 'boltons.funcutils.CachedInstancePartial._partialmethod', 'boltons.setutils.IndexedSet.__rsub__', 'boltons.urlutils.URL', 'boltons.socketutils.NetstringSocket._calc_msgsize_maxsize', 'boltons.iterutils.GUIDerator.__next__', 'boltons.strutils.int_ranges_from_int_list', 'boltons.funcutils.update_wrapper', 'boltons.iterutils.GUIDerator.reseed', 'boltons.setutils.IndexedSet._get_apparent_index', 'boltons.socketutils.NetstringSocket', 'boltons.ioutils.SpooledIOBase.writable', 'boltons.fileutils.AtomicSaver.__init__', 'boltons.iterutils.GUIDerator', 'boltons.iterutils.redundant', 'boltons.iterutils.strip_iter', 'boltons.ioutils.SpooledIOBase.seekable', 'boltons.strutils.complement_int_list', 'boltons.iterutils.rstrip_iter', 'boltons.funcutils.format_invocation', 'boltons.socketutils.NetstringSocket.read_ns', 'boltons.iterutils.strip', 'boltons.fileutils.AtomicSaver', 'boltons.setutils.IndexedSet', 'boltons.funcutils.FunctionBuilder.from_func', 'boltons.ecoutils.get_profile_json', 'boltons.iterutils.SequentialGUIDerator']
diff: 20.0.0(original) 21.0.0
['boltons.funcutils.wraps', 'boltons.jsonutils.reverse_iter_lines', 'boltons.strutils.strip_ansi', 'boltons.listutils.BarrelList.__iter__', 'boltons.iterutils.SequentialGUIDerator.reseed', 'boltons.funcutils.FunctionBuilder', 'boltons.typeutils.make_sentinel', 'boltons.iterutils.lstrip_iter', 'boltons.ioutils.SpooledIOBase', 'boltons.iterutils.GUIDerator.__init__', 'boltons.iterutils.rstrip', 'boltons.socketutils.NetstringSocket.setmaxsize', 'boltons.formatutils.DeferredValue', 'boltons.iterutils.lstrip', 'boltons.dictutils.OrderedMultiDict', 'boltons.ioutils.SpooledIOBase.readable', 'boltons.funcutils.format_exp_repr', 'boltons.listutils.BarrelList', 'boltons.setutils.IndexedSet.index', 'boltons.funcutils.InstancePartial._partialmethod', 'boltons.iterutils.untyped_sorted', 'boltons.fileutils.copy_tree', 'boltons.funcutils.InstancePartial', 'boltons.funcutils.CachedInstancePartial.__set_name__', 'boltons.dictutils.OrderedMultiDict.addlist', 'boltons.funcutils.CachedInstancePartial', 'boltons.funcutils.CachedInstancePartial._partialmethod', 'boltons.fileutils.atomic_save', 'boltons.dictutils.FrozenDict', 'boltons.setutils.IndexedSet.__rsub__', 'boltons.urlutils.URL', 'boltons.dictutils.OrderedMultiDict.poplast', 'boltons.socketutils.NetstringSocket._calc_msgsize_maxsize', 'boltons.funcutils.noop', 'boltons.funcutils.format_nonexp_repr', 'boltons.iterutils.GUIDerator.__next__', 'boltons.strutils.int_ranges_from_int_list', 'boltons.funcutils.update_wrapper', 'boltons.iterutils.GUIDerator.reseed', 'boltons.setutils.IndexedSet._get_apparent_index', 'boltons.socketutils.NetstringSocket', 'boltons.formatutils.DeferredValue.__init__', 'boltons.funcutils.CachedInstancePartial.__get__', 'boltons.ioutils.SpooledIOBase.writable', 'boltons.fileutils.AtomicSaver.__init__', 'boltons.iterutils.GUIDerator', 'boltons.iterutils.redundant', 'boltons.strutils.multi_replace', 'boltons.iterutils.strip_iter', 'boltons.ioutils.SpooledIOBase.seekable', 'boltons.strutils.complement_int_list', 'boltons.iterutils.rstrip_iter', 'boltons.funcutils.format_invocation', 'boltons.socketutils.NetstringSocket.read_ns', 'boltons.iterutils.strip', 'boltons.fileutils.AtomicSaver', 'boltons.setutils.IndexedSet', 'boltons.funcutils.FunctionBuilder.from_func', 'boltons.iterutils.bucketize', 'boltons.ecoutils.get_profile_json', 'boltons.iterutils.SequentialGUIDerator']
Therefore, we believe that it is quite safe to loose your dependency on boltons from "boltons==20.0.0" to "boltons>=19.0.0,<=21.0.0". This will improve the applicability of fsdl-text-recognizer-project and reduce the possibility of any further dependency conflict with other projects.