diff --git a/lib/google/apis/core/base_service.rb b/lib/google/apis/core/base_service.rb index e7b9e806b..8cbef3840 100644 --- a/lib/google/apis/core/base_service.rb +++ b/lib/google/apis/core/base_service.rb @@ -164,10 +164,10 @@ module Google batch_command.options = request_options.merge(options) apply_command_defaults(batch_command) begin - Thread.current[:google_api_batch] = batch_command + start_batch(batch_command) yield self ensure - Thread.current[:google_api_batch] = nil + end_batch end batch_command.execute(client) end @@ -196,10 +196,10 @@ module Google batch_command.options = request_options.merge(options) apply_command_defaults(batch_command) begin - Thread.current[:google_api_batch] = batch_command + start_batch(batch_command) yield self ensure - Thread.current[:google_api_batch] = nil + end_batch end batch_command.execute(client) end @@ -347,6 +347,7 @@ module Google def execute_or_queue_command(command, &callback) batch_command = current_batch if batch_command + fail "Can not combine services in a batch" if Thread.current[:google_api_batch_service] != self batch_command.add(command, &callback) nil else @@ -374,6 +375,20 @@ module Google !current_batch.nil? end + # Start a new thread-local batch context + # @param [Google::Apis::Core::BatchCommand] cmd + def start_batch(cmd) + fail "Batch already in progress" if batch? + Thread.current[:google_api_batch] = cmd + Thread.current[:google_api_batch_service] = self + end + + # Clear thread-local batch context + def end_batch + Thread.current[:google_api_batch] = nil + Thread.current[:google_api_batch_service] = nil + end + # Create a new HTTP client # @return [HTTPClient] def new_client diff --git a/lib/google/apis/generator/templates/service.rb.tmpl b/lib/google/apis/generator/templates/service.rb.tmpl index 7bf7315ee..6eb622ba7 100644 --- a/lib/google/apis/generator/templates/service.rb.tmpl +++ b/lib/google/apis/generator/templates/service.rb.tmpl @@ -42,6 +42,7 @@ module Google <% end -%> def initialize super('<%= api.root_url %>', '<%= api.service_path %>') + @batch_path = '<%= api.batch_path %>' end <% for api_method in api.all_methods -%> <%= indent(include('method', :api_method => api_method, :api => api), 8) -%> diff --git a/spec/fixtures/files/test_api.json b/spec/fixtures/files/test_api.json index 3447ac5be..29a46871a 100644 --- a/spec/fixtures/files/test_api.json +++ b/spec/fixtures/files/test_api.json @@ -7,6 +7,7 @@ "basePath": "/test/", "rootUrl": "https://www.googleapis.com/", "servicePath": "test/v1/", + "batchPath": "batch/test/v1", "rpcPath": "/rpc", "auth": { "oauth2": { diff --git a/spec/google/apis/core/service_spec.rb b/spec/google/apis/core/service_spec.rb index 673b8311c..3b85f10b6 100644 --- a/spec/google/apis/core/service_spec.rb +++ b/spec/google/apis/core/service_spec.rb @@ -196,6 +196,20 @@ EOF end end.to raise_error(Google::Apis::ClientError) end + + it 'should prevent mixing services in batch' do + expect do |b| + service.batch do |service| + command = service.send(:make_simple_command, :get, 'zoo/animals', {}) + service.send(:execute_or_queue_command, command, &b) + + service2 = service.dup + command2 = service.send(:make_simple_command, :get, 'zoo/animals', {}) + service2.send(:execute_or_queue_command, command2, &b) + end + end.to raise_error + + end end context 'with batch uploads' do diff --git a/spec/google/apis/generator/generator_spec.rb b/spec/google/apis/generator/generator_spec.rb index 07dd53283..ce0fde179 100644 --- a/spec/google/apis/generator/generator_spec.rb +++ b/spec/google/apis/generator/generator_spec.rb @@ -30,6 +30,7 @@ RSpec.describe Google::Apis::Generator do puts generator.dump_api_names tempdir = Dir.mktmpdir generated_files.each do |key, content| + puts content path = File.join(tempdir, key) FileUtils.mkdir_p(File.dirname(path)) File.open(path, 'w') do |f| @@ -47,6 +48,10 @@ RSpec.describe Google::Apis::Generator do expect(service.root_url.to_s).to eql('https://www.googleapis.com/') end + it 'should set the batch path' do + expect(service.batch_path).to eql('batch/test/v1') + end + it 'should define global methods from discovery' do expect(service.method(:query)).to_not be_nil end