google-api-client 0.4.7 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +11 -0
- data/Gemfile +6 -1
- data/Gemfile.lock +80 -0
- data/README.md +152 -45
- data/Rakefile +2 -2
- data/bin/google-api +2 -9
- data/lib/compat/multi_json.rb +2 -3
- data/lib/google/api_client.rb +87 -278
- data/lib/google/api_client/auth/jwt_asserter.rb +139 -0
- data/lib/google/api_client/auth/pkcs12.rb +48 -0
- data/lib/google/api_client/batch.rb +164 -136
- data/lib/google/api_client/client_secrets.rb +45 -1
- data/lib/google/api_client/discovery/api.rb +7 -8
- data/lib/google/api_client/discovery/method.rb +20 -27
- data/lib/google/api_client/discovery/resource.rb +16 -10
- data/lib/google/api_client/discovery/schema.rb +2 -0
- data/lib/google/api_client/media.rb +76 -64
- data/lib/google/api_client/reference.rb +7 -285
- data/lib/google/api_client/request.rb +336 -0
- data/lib/google/api_client/result.rb +147 -55
- data/lib/google/api_client/service_account.rb +2 -120
- data/lib/google/api_client/version.rb +2 -3
- data/spec/google/api_client/batch_spec.rb +9 -10
- data/spec/google/api_client/discovery_spec.rb +184 -114
- data/spec/google/api_client/media_spec.rb +27 -39
- data/spec/google/api_client/result_spec.rb +30 -11
- data/spec/google/api_client/service_account_spec.rb +38 -6
- data/spec/google/api_client_spec.rb +48 -32
- data/spec/spec_helper.rb +46 -0
- data/tasks/gem.rake +1 -0
- metadata +36 -70
@@ -17,20 +17,33 @@
|
|
17
17
|
|
18
18
|
require 'spec_helper'
|
19
19
|
|
20
|
-
gem 'faraday', '~> 0.8.1'
|
21
20
|
require 'faraday'
|
22
21
|
require 'faraday/utils'
|
23
22
|
require 'multi_json'
|
24
23
|
require 'compat/multi_json'
|
25
|
-
|
26
|
-
gem 'signet', '~> 0.4.0'
|
27
24
|
require 'signet/oauth_1/client'
|
28
|
-
|
29
25
|
require 'google/api_client'
|
30
26
|
require 'google/api_client/version'
|
31
27
|
|
28
|
+
def TestHandler
|
29
|
+
def initialize(&block)
|
30
|
+
@block = block
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(env)
|
34
|
+
@block.call(env)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def mock_connection(&block)
|
39
|
+
connection = Faraday.new do |builder|
|
40
|
+
use TestHandler block
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
32
44
|
describe Google::APIClient do
|
33
|
-
|
45
|
+
include ConnectionHelpers
|
46
|
+
CLIENT = Google::APIClient.new unless defined?(CLIENT)
|
34
47
|
|
35
48
|
after do
|
36
49
|
# Reset client to not-quite-pristine state
|
@@ -67,7 +80,7 @@ describe Google::APIClient do
|
|
67
80
|
|
68
81
|
it 'should raise an error for bogus methods' do
|
69
82
|
(lambda do
|
70
|
-
CLIENT.
|
83
|
+
CLIENT.execute(42)
|
71
84
|
end).should raise_error(TypeError)
|
72
85
|
end
|
73
86
|
|
@@ -90,44 +103,49 @@ describe Google::APIClient do
|
|
90
103
|
|
91
104
|
it 'should correctly determine the discovery URI if :user_ip is set' do
|
92
105
|
CLIENT.user_ip = '127.0.0.1'
|
93
|
-
|
106
|
+
|
107
|
+
conn = stub_connection do |stub|
|
108
|
+
stub.get('/discovery/v1/apis/prediction/v1.2/rest?userIp=127.0.0.1') do |env|
|
109
|
+
end
|
110
|
+
end
|
111
|
+
CLIENT.execute(
|
94
112
|
:http_method => 'GET',
|
95
113
|
:uri => CLIENT.discovery_uri('prediction', 'v1.2'),
|
96
|
-
:authenticated => false
|
97
|
-
|
98
|
-
request.to_env(Faraday.default_connection)[:url].to_s.should === (
|
99
|
-
'https://www.googleapis.com/discovery/v1/apis/prediction/v1.2/rest' +
|
100
|
-
'?userIp=127.0.0.1'
|
114
|
+
:authenticated => false,
|
115
|
+
:connection => conn
|
101
116
|
)
|
117
|
+
conn.verify
|
102
118
|
end
|
103
119
|
|
104
120
|
it 'should correctly determine the discovery URI if :key is set' do
|
105
121
|
CLIENT.key = 'qwerty'
|
106
|
-
|
122
|
+
conn = stub_connection do |stub|
|
123
|
+
stub.get('/discovery/v1/apis/prediction/v1.2/rest?key=qwerty') do |env|
|
124
|
+
end
|
125
|
+
end
|
126
|
+
request = CLIENT.execute(
|
107
127
|
:http_method => 'GET',
|
108
128
|
:uri => CLIENT.discovery_uri('prediction', 'v1.2'),
|
109
|
-
:authenticated => false
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
'?key=qwerty'
|
114
|
-
)
|
129
|
+
:authenticated => false,
|
130
|
+
:connection => conn
|
131
|
+
)
|
132
|
+
conn.verify
|
115
133
|
end
|
116
134
|
|
117
135
|
it 'should correctly determine the discovery URI if both are set' do
|
118
136
|
CLIENT.key = 'qwerty'
|
119
137
|
CLIENT.user_ip = '127.0.0.1'
|
120
|
-
|
138
|
+
conn = stub_connection do |stub|
|
139
|
+
stub.get('/discovery/v1/apis/prediction/v1.2/rest?key=qwerty&userIp=127.0.0.1') do |env|
|
140
|
+
end
|
141
|
+
end
|
142
|
+
request = CLIENT.execute(
|
121
143
|
:http_method => 'GET',
|
122
144
|
:uri => CLIENT.discovery_uri('prediction', 'v1.2'),
|
123
|
-
:authenticated => false
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
).query_values.should == {
|
128
|
-
'key' => 'qwerty',
|
129
|
-
'userIp' => '127.0.0.1'
|
130
|
-
}
|
145
|
+
:authenticated => false,
|
146
|
+
:connection => conn
|
147
|
+
)
|
148
|
+
conn.verify
|
131
149
|
end
|
132
150
|
|
133
151
|
it 'should correctly generate API objects' do
|
@@ -169,7 +187,7 @@ describe Google::APIClient do
|
|
169
187
|
|
170
188
|
it 'should raise an error for bogus methods' do
|
171
189
|
(lambda do
|
172
|
-
CLIENT.
|
190
|
+
CLIENT.execute(:api_method => CLIENT.discovered_api('prediction', 'v1.2'))
|
173
191
|
end).should raise_error(TypeError)
|
174
192
|
end
|
175
193
|
|
@@ -183,43 +201,58 @@ describe Google::APIClient do
|
|
183
201
|
end
|
184
202
|
|
185
203
|
it 'should generate valid requests' do
|
186
|
-
|
204
|
+
conn = stub_connection do |stub|
|
205
|
+
stub.post('/prediction/v1.2/training?data=12345') do |env|
|
206
|
+
env[:body].should == ''
|
207
|
+
end
|
208
|
+
end
|
209
|
+
request = CLIENT.execute(
|
187
210
|
:api_method => @prediction.training.insert,
|
188
|
-
:parameters => {'data' => '12345'}
|
211
|
+
:parameters => {'data' => '12345'},
|
212
|
+
:connection => conn
|
189
213
|
)
|
190
|
-
|
191
|
-
request.to_env(Faraday.default_connection)[:url].to_s.should ===
|
192
|
-
'https://www.googleapis.com/prediction/v1.2/training?data=12345'
|
193
|
-
request.headers.should be_empty
|
194
|
-
request.body.should == ''
|
214
|
+
conn.verify
|
195
215
|
end
|
196
216
|
|
197
217
|
it 'should generate valid requests when repeated parameters are passed' do
|
198
|
-
|
218
|
+
pending("This is caused by Faraday's encoding of query parameters.")
|
219
|
+
conn = stub_connection do |stub|
|
220
|
+
stub.post('/prediction/v1.2/training?data=1&data=2') do |env|
|
221
|
+
env[:params]['data'].should include('1', '2')
|
222
|
+
end
|
223
|
+
end
|
224
|
+
request = CLIENT.execute(
|
199
225
|
:api_method => @prediction.training.insert,
|
200
|
-
:parameters => [['data', '1'], ['data','2']]
|
226
|
+
:parameters => [['data', '1'], ['data','2']],
|
227
|
+
:connection => conn
|
201
228
|
)
|
202
|
-
|
203
|
-
request.to_env(Faraday.default_connection)[:url].to_s.should ===
|
204
|
-
'https://www.googleapis.com/prediction/v1.2/training?data=1&data=2'
|
229
|
+
conn.verify
|
205
230
|
end
|
206
231
|
|
207
232
|
it 'should generate requests against the correct URIs' do
|
208
|
-
|
233
|
+
conn = stub_connection do |stub|
|
234
|
+
stub.post('/prediction/v1.2/training?data=12345') do |env|
|
235
|
+
end
|
236
|
+
end
|
237
|
+
request = CLIENT.execute(
|
209
238
|
:api_method => @prediction.training.insert,
|
210
|
-
:parameters => {'data' => '12345'}
|
239
|
+
:parameters => {'data' => '12345'},
|
240
|
+
:connection => conn
|
211
241
|
)
|
212
|
-
|
213
|
-
'https://www.googleapis.com/prediction/v1.2/training?data=12345'
|
242
|
+
conn.verify
|
214
243
|
end
|
215
244
|
|
216
245
|
it 'should generate requests against the correct URIs' do
|
217
|
-
|
246
|
+
conn = stub_connection do |stub|
|
247
|
+
stub.post('/prediction/v1.2/training?data=12345') do |env|
|
248
|
+
end
|
249
|
+
end
|
250
|
+
request = CLIENT.execute(
|
218
251
|
:api_method => @prediction.training.insert,
|
219
|
-
:parameters => {'data' => '12345'}
|
252
|
+
:parameters => {'data' => '12345'},
|
253
|
+
:connection => conn
|
220
254
|
)
|
221
|
-
|
222
|
-
'https://www.googleapis.com/prediction/v1.2/training?data=12345'
|
255
|
+
conn.verify
|
223
256
|
end
|
224
257
|
|
225
258
|
it 'should allow modification to the base URIs for testing purposes' do
|
@@ -228,37 +261,58 @@ describe Google::APIClient do
|
|
228
261
|
Google::APIClient.new.discovered_api('prediction', 'v1.2')
|
229
262
|
prediction_rebase.method_base =
|
230
263
|
'https://testing-domain.example.com/prediction/v1.2/'
|
231
|
-
|
264
|
+
|
265
|
+
conn = stub_connection do |stub|
|
266
|
+
stub.post('/prediction/v1.2/training') do |env|
|
267
|
+
env[:url].host.should == 'testing-domain.example.com'
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
request = CLIENT.execute(
|
232
272
|
:api_method => prediction_rebase.training.insert,
|
233
|
-
:parameters => {'data' => '123'}
|
234
|
-
|
235
|
-
request.to_env(Faraday.default_connection)[:url].to_s.should === (
|
236
|
-
'https://testing-domain.example.com/' +
|
237
|
-
'prediction/v1.2/training?data=123'
|
273
|
+
:parameters => {'data' => '123'},
|
274
|
+
:connection => conn
|
238
275
|
)
|
276
|
+
conn.verify
|
239
277
|
end
|
240
278
|
|
241
279
|
it 'should generate OAuth 1 requests' do
|
242
280
|
CLIENT.authorization = :oauth_1
|
243
281
|
CLIENT.authorization.token_credential_key = '12345'
|
244
282
|
CLIENT.authorization.token_credential_secret = '12345'
|
245
|
-
|
283
|
+
|
284
|
+
conn = stub_connection do |stub|
|
285
|
+
stub.post('/prediction/v1.2/training?data=12345') do |env|
|
286
|
+
env[:request_headers].should have_key('Authorization')
|
287
|
+
env[:request_headers]['Authorization'].should =~ /^OAuth/
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
request = CLIENT.execute(
|
246
292
|
:api_method => @prediction.training.insert,
|
247
|
-
:parameters => {'data' => '12345'}
|
293
|
+
:parameters => {'data' => '12345'},
|
294
|
+
:connection => conn
|
248
295
|
)
|
249
|
-
|
250
|
-
request.headers['Authorization'].should =~ /^OAuth/
|
296
|
+
conn.verify
|
251
297
|
end
|
252
298
|
|
253
299
|
it 'should generate OAuth 2 requests' do
|
254
300
|
CLIENT.authorization = :oauth_2
|
255
301
|
CLIENT.authorization.access_token = '12345'
|
256
|
-
|
302
|
+
|
303
|
+
conn = stub_connection do |stub|
|
304
|
+
stub.post('/prediction/v1.2/training?data=12345') do |env|
|
305
|
+
env[:request_headers].should have_key('Authorization')
|
306
|
+
env[:request_headers]['Authorization'].should =~ /^Bearer/
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
request = CLIENT.execute(
|
257
311
|
:api_method => @prediction.training.insert,
|
258
|
-
:parameters => {'data' => '12345'}
|
312
|
+
:parameters => {'data' => '12345'},
|
313
|
+
:connection => conn
|
259
314
|
)
|
260
|
-
|
261
|
-
request.headers['Authorization'].should =~ /^Bearer/
|
315
|
+
conn.verify
|
262
316
|
end
|
263
317
|
|
264
318
|
it 'should not be able to execute improperly authorized requests' do
|
@@ -306,15 +360,21 @@ describe Google::APIClient do
|
|
306
360
|
end
|
307
361
|
|
308
362
|
it 'should correctly handle unnamed parameters' do
|
363
|
+
conn = stub_connection do |stub|
|
364
|
+
stub.post('/prediction/v1.2/training') do |env|
|
365
|
+
env[:request_headers].should have_key('Content-Type')
|
366
|
+
env[:request_headers]['Content-Type'].should == 'application/json'
|
367
|
+
end
|
368
|
+
end
|
309
369
|
CLIENT.authorization = :oauth_2
|
310
370
|
CLIENT.authorization.access_token = '12345'
|
311
|
-
|
312
|
-
@prediction.training.insert,
|
313
|
-
{},
|
314
|
-
|
315
|
-
|
371
|
+
CLIENT.execute(
|
372
|
+
:api_method => @prediction.training.insert,
|
373
|
+
:body => MultiJson.dump({"id" => "bucket/object"}),
|
374
|
+
:headers => {'Content-Type' => 'application/json'},
|
375
|
+
:connection => conn
|
316
376
|
)
|
317
|
-
|
377
|
+
conn.verify
|
318
378
|
end
|
319
379
|
end
|
320
380
|
|
@@ -354,22 +414,26 @@ describe Google::APIClient do
|
|
354
414
|
end
|
355
415
|
|
356
416
|
it 'should generate requests against the correct URIs' do
|
357
|
-
|
417
|
+
conn = stub_connection do |stub|
|
418
|
+
stub.get('/plus/v1/people/107807692475771887386/activities/public' +
|
419
|
+
'?collection=public&userId=107807692475771887386') do |env|
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
request = CLIENT.execute(
|
358
424
|
:api_method => @plus.activities.list,
|
359
425
|
:parameters => {
|
360
426
|
'userId' => '107807692475771887386', 'collection' => 'public'
|
361
427
|
},
|
362
|
-
:authenticated => false
|
363
|
-
|
364
|
-
request.to_env(Faraday.default_connection)[:url].to_s.should === (
|
365
|
-
'https://www.googleapis.com/plus/v1/' +
|
366
|
-
'people/107807692475771887386/activities/public'
|
428
|
+
:authenticated => false,
|
429
|
+
:connection => conn
|
367
430
|
)
|
431
|
+
conn.verify
|
368
432
|
end
|
369
433
|
|
370
434
|
it 'should correctly validate parameters' do
|
371
435
|
(lambda do
|
372
|
-
CLIENT.
|
436
|
+
CLIENT.execute(
|
373
437
|
:api_method => @plus.activities.list,
|
374
438
|
:parameters => {'alt' => 'json'},
|
375
439
|
:authenticated => false
|
@@ -379,17 +443,18 @@ describe Google::APIClient do
|
|
379
443
|
|
380
444
|
it 'should correctly validate parameters' do
|
381
445
|
(lambda do
|
382
|
-
CLIENT.
|
446
|
+
CLIENT.execute(
|
383
447
|
:api_method => @plus.activities.list,
|
384
448
|
:parameters => {
|
385
449
|
'userId' => '107807692475771887386', 'collection' => 'bogus'
|
386
450
|
},
|
387
451
|
:authenticated => false
|
388
|
-
)
|
452
|
+
).to_env(Faraday.default_connection)
|
389
453
|
end).should raise_error(ArgumentError)
|
390
454
|
end
|
391
455
|
end
|
392
|
-
|
456
|
+
|
457
|
+
=begin
|
393
458
|
describe 'with the latitude API' do
|
394
459
|
before do
|
395
460
|
CLIENT.authorization = nil
|
@@ -452,6 +517,7 @@ describe Google::APIClient do
|
|
452
517
|
result.response.status.should == 401
|
453
518
|
end
|
454
519
|
end
|
520
|
+
=end
|
455
521
|
|
456
522
|
describe 'with the moderator API' do
|
457
523
|
before do
|
@@ -490,26 +556,21 @@ describe Google::APIClient do
|
|
490
556
|
end
|
491
557
|
|
492
558
|
it 'should generate requests against the correct URIs' do
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
request.
|
498
|
-
'https://www.googleapis.com/moderator/v1/profiles/@me'
|
499
|
-
end
|
500
|
-
|
501
|
-
it 'should generate requests against the correct URIs' do
|
502
|
-
request = CLIENT.generate_request(
|
559
|
+
conn = stub_connection do |stub|
|
560
|
+
stub.get('/moderator/v1/profiles/@me') do |env|
|
561
|
+
end
|
562
|
+
end
|
563
|
+
request = CLIENT.execute(
|
503
564
|
:api_method => @moderator.profiles.get,
|
504
|
-
:authenticated => false
|
565
|
+
:authenticated => false,
|
566
|
+
:connection => conn
|
505
567
|
)
|
506
|
-
|
507
|
-
'https://www.googleapis.com/moderator/v1/profiles/@me'
|
568
|
+
conn.verify
|
508
569
|
end
|
509
570
|
|
510
571
|
it 'should not be able to execute requests without authorization' do
|
511
572
|
result = CLIENT.execute(
|
512
|
-
|
573
|
+
@moderator.profiles.get,
|
513
574
|
{},
|
514
575
|
'',
|
515
576
|
[],
|
@@ -550,26 +611,21 @@ describe Google::APIClient do
|
|
550
611
|
end
|
551
612
|
|
552
613
|
it 'should generate requests against the correct URIs' do
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
request.
|
558
|
-
'https://www.googleapis.com/adsense/v1/adclients'
|
559
|
-
end
|
560
|
-
|
561
|
-
it 'should generate requests against the correct URIs' do
|
562
|
-
request = CLIENT.generate_request(
|
614
|
+
conn = stub_connection do |stub|
|
615
|
+
stub.get('/adsense/v1/adclients') do |env|
|
616
|
+
end
|
617
|
+
end
|
618
|
+
request = CLIENT.execute(
|
563
619
|
:api_method => @adsense.adclients.list,
|
564
|
-
:authenticated => false
|
620
|
+
:authenticated => false,
|
621
|
+
:connection => conn
|
565
622
|
)
|
566
|
-
|
567
|
-
'https://www.googleapis.com/adsense/v1/adclients'
|
623
|
+
conn.verify
|
568
624
|
end
|
569
625
|
|
570
626
|
it 'should not be able to execute requests without authorization' do
|
571
627
|
result = CLIENT.execute(
|
572
|
-
:api_method =>
|
628
|
+
:api_method => @adsense.adclients.list,
|
573
629
|
:authenticated => false
|
574
630
|
)
|
575
631
|
result.response.status.should == 401
|
@@ -577,7 +633,7 @@ describe Google::APIClient do
|
|
577
633
|
|
578
634
|
it 'should fail when validating missing required parameters' do
|
579
635
|
(lambda do
|
580
|
-
CLIENT.
|
636
|
+
CLIENT.execute(
|
581
637
|
:api_method => @adsense.reports.generate,
|
582
638
|
:authenticated => false
|
583
639
|
)
|
@@ -585,8 +641,12 @@ describe Google::APIClient do
|
|
585
641
|
end
|
586
642
|
|
587
643
|
it 'should succeed when validating parameters in a correct call' do
|
644
|
+
conn = stub_connection do |stub|
|
645
|
+
stub.get('/adsense/v1/reports?dimension=DATE&endDate=2010-01-01&metric=PAGE_VIEWS&startDate=2000-01-01') do |env|
|
646
|
+
end
|
647
|
+
end
|
588
648
|
(lambda do
|
589
|
-
CLIENT.
|
649
|
+
CLIENT.execute(
|
590
650
|
:api_method => @adsense.reports.generate,
|
591
651
|
:parameters => {
|
592
652
|
'startDate' => '2000-01-01',
|
@@ -594,14 +654,16 @@ describe Google::APIClient do
|
|
594
654
|
'dimension' => 'DATE',
|
595
655
|
'metric' => 'PAGE_VIEWS'
|
596
656
|
},
|
597
|
-
:authenticated => false
|
657
|
+
:authenticated => false,
|
658
|
+
:connection => conn
|
598
659
|
)
|
599
660
|
end).should_not raise_error
|
661
|
+
conn.verify
|
600
662
|
end
|
601
663
|
|
602
664
|
it 'should fail when validating parameters with invalid values' do
|
603
665
|
(lambda do
|
604
|
-
CLIENT.
|
666
|
+
CLIENT.execute(
|
605
667
|
:api_method => @adsense.reports.generate,
|
606
668
|
:parameters => {
|
607
669
|
'startDate' => '2000-01-01',
|
@@ -615,8 +677,14 @@ describe Google::APIClient do
|
|
615
677
|
end
|
616
678
|
|
617
679
|
it 'should succeed when validating repeated parameters in a correct call' do
|
680
|
+
conn = stub_connection do |stub|
|
681
|
+
stub.get('/adsense/v1/reports?dimension%5B%5D=DATE&dimension%5B%5D=PRODUCT_CODE'+
|
682
|
+
'&endDate=2010-01-01&metric%5B%5D=CLICKS&metric%5B%5D=PAGE_VIEWS&'+
|
683
|
+
'startDate=2000-01-01') do |env|
|
684
|
+
end
|
685
|
+
end
|
618
686
|
(lambda do
|
619
|
-
CLIENT.
|
687
|
+
CLIENT.execute(
|
620
688
|
:api_method => @adsense.reports.generate,
|
621
689
|
:parameters => {
|
622
690
|
'startDate' => '2000-01-01',
|
@@ -624,14 +692,16 @@ describe Google::APIClient do
|
|
624
692
|
'dimension' => ['DATE', 'PRODUCT_CODE'],
|
625
693
|
'metric' => ['PAGE_VIEWS', 'CLICKS']
|
626
694
|
},
|
627
|
-
:authenticated => false
|
695
|
+
:authenticated => false,
|
696
|
+
:connection => conn
|
628
697
|
)
|
629
698
|
end).should_not raise_error
|
699
|
+
conn.verify
|
630
700
|
end
|
631
701
|
|
632
702
|
it 'should fail when validating incorrect repeated parameters' do
|
633
703
|
(lambda do
|
634
|
-
CLIENT.
|
704
|
+
CLIENT.execute(
|
635
705
|
:api_method => @adsense.reports.generate,
|
636
706
|
:parameters => {
|
637
707
|
'startDate' => '2000-01-01',
|