1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 """Utilities for making samples.
16
17 Consolidates a lot of code commonly repeated in sample applications.
18 """
19 from __future__ import absolute_import
20
21 __author__ = "jcgregorio@google.com (Joe Gregorio)"
22 __all__ = ["init"]
23
24
25 import argparse
26 import os
27
28 from googleapiclient import discovery
29 from googleapiclient.http import build_http
30
31
32 -def init(
33 argv, name, version, doc, filename, scope=None, parents=[], discovery_filename=None
34 ):
35 """A common initialization routine for samples.
36
37 Many of the sample applications do the same initialization, which has now
38 been consolidated into this function. This function uses common idioms found
39 in almost all the samples, i.e. for an API with name 'apiname', the
40 credentials are stored in a file named apiname.dat, and the
41 client_secrets.json file is stored in the same directory as the application
42 main file.
43
44 Args:
45 argv: list of string, the command-line parameters of the application.
46 name: string, name of the API.
47 version: string, version of the API.
48 doc: string, description of the application. Usually set to __doc__.
49 file: string, filename of the application. Usually set to __file__.
50 parents: list of argparse.ArgumentParser, additional command-line flags.
51 scope: string, The OAuth scope used.
52 discovery_filename: string, name of local discovery file (JSON). Use when discovery doc not available via URL.
53
54 Returns:
55 A tuple of (service, flags), where service is the service object and flags
56 is the parsed command-line flags.
57 """
58 try:
59 from oauth2client import client
60 from oauth2client import file
61 from oauth2client import tools
62 except ImportError:
63 raise ImportError(
64 "googleapiclient.sample_tools requires oauth2client. Please install oauth2client and try again."
65 )
66
67 if scope is None:
68 scope = "https://www.googleapis.com/auth/" + name
69
70
71 parent_parsers = [tools.argparser]
72 parent_parsers.extend(parents)
73 parser = argparse.ArgumentParser(
74 description=doc,
75 formatter_class=argparse.RawDescriptionHelpFormatter,
76 parents=parent_parsers,
77 )
78 flags = parser.parse_args(argv[1:])
79
80
81
82
83
84 client_secrets = os.path.join(os.path.dirname(filename), "client_secrets.json")
85
86
87 flow = client.flow_from_clientsecrets(
88 client_secrets, scope=scope, message=tools.message_if_missing(client_secrets)
89 )
90
91
92
93
94
95 storage = file.Storage(name + ".dat")
96 credentials = storage.get()
97 if credentials is None or credentials.invalid:
98 credentials = tools.run_flow(flow, storage, flags)
99 http = credentials.authorize(http=build_http())
100
101 if discovery_filename is None:
102
103 service = discovery.build(name, version, http=http)
104 else:
105
106 with open(discovery_filename) as discovery_file:
107 service = discovery.build_from_document(
108 discovery_file.read(), base="https://www.googleapis.com/", http=http
109 )
110 return (service, flags)
111