From e3ab233a6cee8482c1c98b1e2c759e7a17cceab9 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 11 Mar 2015 18:47:37 +0100 Subject: [PATCH] fix(schema): no unused types anymore Due to shared global state which was altered, we got wrong results. This is fixed now, thanks to a deepcopy. Amazing, how altering global state is always biting you, even though you are convinced it's safe to do in just this case ! General rule: Just don't do it, no matter what ! --- src/mako/lib/rbuild.mako | 2 +- src/mako/lib/util.py | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/mako/lib/rbuild.mako b/src/mako/lib/rbuild.mako index 0d5f024aff..b9caacad14 100644 --- a/src/mako/lib/rbuild.mako +++ b/src/mako/lib/rbuild.mako @@ -1,7 +1,7 @@ <%! from util import (put_and, rust_test_fn_invisible, rust_doc_test_norun, rust_doc_comment, rb_type, singular, hub_type, mangle_ident, mb_type, method_params, property, - to_fqan, indent_all_but_first_by, schema_markers, + to_fqan, indent_all_but_first_by, activity_input_type, TREF, IO_REQUEST, schema_to_required_property, rust_copy_value_s, is_required_property, organize_params, REQUEST_VALUE_PROPERTY_NAME, build_all_params, rb_type_params_s, hub_type_params_s, mb_type_params_s, mb_additional_type_params) diff --git a/src/mako/lib/util.py b/src/mako/lib/util.py index 2d19bf8529..98c7a3ecd6 100644 --- a/src/mako/lib/util.py +++ b/src/mako/lib/util.py @@ -269,7 +269,7 @@ def _is_map_prop(p): def _assure_unique_type_name(schemas, tn): if tn in schemas: - tn += 'Internal' + tn += 'Nested' return tn # map a json type to an rust type @@ -352,6 +352,7 @@ def is_pod_property(p): def schema_markers(s, c): res = set() ids = s['parents'] + [s.id] + print ids for sid in ids: activities = c.sta_map.get(sid, dict()) if len(activities) == 0: @@ -584,17 +585,22 @@ def new_context(schemas, resources): # end utility # A dict of {s.id -> schema} , with all schemas having the 'parents' key set with [s.id, ...] of all parents - # in order of traversal, [0] is first parent, [-1] is the root of them all - # current schemas - the dict will be altered ! Changing global state seems odd, but we own it ! - def build_schema_map(schemas): + # in order of traversal, [-1] is first parent, [0] is the root of them all + def build_schema_map(): # 'type' in t and t.type == 'object' and 'properties' in t or ('items' in t and 'properties' in t.items) PKEY = 'parents' + UBKEY = 'used_by' + all_schemas = deepcopy(schemas) def recurse_properties(prefix, properties, parent_ids): for pn, p in properties.iteritems(): + if TREF in p: + # they can be used in mulFinternaltiple spots - just brute-force copy all parents in there + # which should probably be renamed to used_by instead + pass if is_nested_type_property(p): ns = deepcopy(p) ns.id = _assure_unique_type_name(schemas, nested_type_name(prefix, pn)) - schemas[ns.id] = ns + all_schemas[ns.id] = ns ns[PKEY] = parent_ids # To allow us recursing arrays, we simply put items one level up @@ -615,19 +621,21 @@ def new_context(schemas, resources): # end utility for s in schemas.values(): s[PKEY] = list() # roots never have parents + if UBKEY not in s: + s[UBKEY] = list() if 'properties' not in s: continue recurse_properties(s.id, s.properties, [s.id]) # end for each schema - return schemas + return all_schemas # end utility if schemas: - schemas = build_schema_map(schemas) + all_schemas = build_schema_map() else: - schemas = dict() + all_schemas = dict() if not resources: - return Context(dict(), dict(), dict(), dict(), schemas) + return Context(dict(), dict(), dict(), dict(), all_schemas) sta_map, fqan_map = build_activity_mappings(resources) rta_map = dict() rtc_map = dict() @@ -635,7 +643,7 @@ def new_context(schemas, resources): category, resource, activity = activity_split(an) rta_map.setdefault(resource, list()).append(activity) assert rtc_map.setdefault(resource, category) == category - return Context(sta_map, fqan_map, rta_map, rtc_map, schemas) + return Context(sta_map, fqan_map, rta_map, rtc_map, all_schemas) # Expects v to be 'v\d+', throws otherwise def to_api_version(v):