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