Skip to content

Commit

Permalink
Fixed issues with recursive structures and external references.
Browse files Browse the repository at this point in the history
  • Loading branch information
Bob Aman committed Oct 5, 2011
1 parent 06af19a commit bb4e15b
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 2 deletions.
39 changes: 38 additions & 1 deletion lib/google/api_client/discovery/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,43 @@ def self.parse(api, schema_data)
# unavoidable dependence on closures and execution context.
schema_name = schema_data['id']

# Due to an oversight, schema IDs may not be URI references.
# TODO(bobaman): Remove this code once this has been resolved.
schema_uri = (
api.document_base +
(schema_name[0..0] != '#' ? '#' + schema_name : schema_name)
)
# puts schema_uri

# Due to an oversight, schema IDs may not be URI references.
# TODO(bobaman): Remove this whole lambda once this has been resolved.
reformat_references = lambda do |data|
# This code is not particularly efficient due to recursive traversal
# and excess object creation, but this hopefully shouldn't be an
# issue since it should only be called only once per schema per
# process.
if data.kind_of?(Hash) && data['$ref']
reference = data['$ref']
reference = '#' + reference if reference[0..0] != '#'
data.merge({
'$ref' => reference
})
elsif data.kind_of?(Hash)
data.inject({}) do |accu, (key, value)|
if value.kind_of?(Hash)
accu[key] = reformat_references.call(value)
else
accu[key] = value
end
accu
end
else
data
end
end
schema_data = reformat_references.call(schema_data)
# puts schema_data.inspect

if schema_name
api_name_string =
Google::INFLECTOR.camelize(api.name)
Expand All @@ -57,7 +94,7 @@ def self.parse(api, schema_data)
# redefine it. This means that reloading a schema which has already
# been loaded into memory is not possible.
unless schema_class
schema_class = AutoParse.generate(schema_data)
schema_class = AutoParse.generate(schema_data, schema_uri)
if schema_name
api_version.const_set(schema_name, schema_class)
end
Expand Down
12 changes: 12 additions & 0 deletions spec/google/api_client/discovery_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,18 @@
status.should == 200
end

it 'should correctly handle nested schema objects' do
result = @client.execute(
@buzz.activities.list,
{'alt' => 'json', 'userId' => 'hikingfan', 'scope' => '@public'},
'',
[],
:authenticated => false
)
feed = result.data
puts feed.inspect
end

it 'should not be able to execute requests without authorization' do
result = @client.execute(
@buzz.activities.list,
Expand Down
2 changes: 1 addition & 1 deletion tasks/gem.rake
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ namespace :gem do
s.add_runtime_dependency('signet', '~> 0.2.2')
s.add_runtime_dependency('addressable', '~> 2.2.2')
s.add_runtime_dependency('httpadapter', '~> 1.0.0')
s.add_runtime_dependency('autoparse', '~> 0.1.0')
s.add_runtime_dependency('autoparse', '~> 0.2.0')
s.add_runtime_dependency('json', '>= 1.4.6')
s.add_runtime_dependency('extlib', '>= 0.9.15')

Expand Down

0 comments on commit bb4e15b

Please sign in to comment.