lib/jsonapi/include_directives.rb in jsonapi-resources-0.8.3 vs lib/jsonapi/include_directives.rb in jsonapi-resources-0.9.0.beta1

- old
+ new

@@ -34,10 +34,14 @@ def model_includes get_includes(@include_directives_hash) end + def paths + delve_paths(get_includes(@include_directives_hash, false)) + end + private def get_related(current_path) current = @include_directives_hash current_resource_klass = @resource_klass @@ -57,13 +61,16 @@ current = current[:include_related][fragment] end current end - def get_includes(directive) - directive[:include_related].select { |k,v| v[:include_in_join] }.map do |name, directive| - sub = get_includes(directive) + def get_includes(directive, only_joined_includes = true) + ir = directive[:include_related] + ir = ir.select { |k,v| v[:include_in_join] } if only_joined_includes + + ir.map do |name, sub_directive| + sub = get_includes(sub_directive, only_joined_includes) sub.any? ? { name => sub } : name end end def parse_include(include) @@ -72,9 +79,22 @@ parts.each do |name| local_path += local_path.length > 0 ? ".#{name}" : name related = get_related(local_path) related[:include] = true + end + end + + def delve_paths(obj) + case obj + when Array + obj.map{|elem| delve_paths(elem)}.flatten(1) + when Hash + obj.map{|k,v| [[k]] + delve_paths(v).map{|path| [k] + path } }.flatten(1) + when Symbol, String + [[obj]] + else + raise "delve_paths cannot descend into #{obj.class.name}" end end end end