Esempio n. 1
0
    def initialize(cls,
                   _recipe={},
                   _task=None,
                   _instance=1,
                   _project=None,
                   _user=None,
                   _service=None,
                   _client=None,
                   _filepath=None,
                   _verbose=False,
                   _force=False,
                   _trace_print=False,
                   _trace_file=False):
        """Used in StarThinker scripts as programmatic entry point. 

    Set up the project singleton for execution of a task, be sure to mimic defaults in helper
    this function loads credentials from various source ( command line argument, json, default credentials )
    it also sets up time zone aware date and various helper flags such as force and verbose.

    Usage example:
    ```
       from starthinker.util.project import project

       if __name__ == "__main__":
         user = '******'
         service = 'service.json' 
         recipe = {'setup':..., 'tasks':.... }
         project.initialize(_recipe=recipe, _user=user, _service=service, _verbose=True)
    ```

    Args:
      - _recipe: (dict) JSON object representing the project ( setup plus at least one task )
      - _task: (string) Task name form recipe json task list to execute.
      - _instance: (integer) See module description.
      - _project: (string) See module description.
      - _user: (string) See module description.
      - _service: (string) See module description.
      - _client: (string) See module description.
      - _verbose: (boolean) See module description.
      - _force: (boolean) See module description.
      - _trace_print: (boolean) True if writing execution trace to stdout.
      - _trace_file: (boolean) True if writing execution trace to file ( see config.py ).

    Returns:
      Nothing, this manipulates a singleton object.  All calls to project.* result in the same object.
    """

        starthinker_trace_start(_trace_print, _trace_file)

        cls.recipe = _recipe
        cls.function = _task
        cls.instance = _instance
        cls.force = _force

        # populates the task variable based on function and instance
        cls.get_task()

        cls.verbose = _verbose
        cls.filepath = _filepath

        # add setup to json if not provided and loads command line credentials if given
        if 'setup' not in cls.recipe: cls.recipe['setup'] = {}
        if 'auth' not in cls.recipe['setup']: cls.recipe['setup']['auth'] = {}
        if _service: cls.recipe['setup']['auth']['service'] = _service
        if _client: cls.recipe['setup']['auth']['client'] = _client
        # if user explicity specified by command line
        if _user: cls.recipe['setup']['auth']['user'] = _user
        # or if user not given, then try default credentials ( disabled security risk to assume on behalf of recipe )
        #elif not cls.recipe['setup']['auth'].get('user'):
        #  cls.recipe['setup']['auth']['user'] = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS', None)

        # if project id given, use it
        if _project: cls.recipe['setup']['id'] = _project
        # TBD: if project id not given, use service credentials
        #elif not cls.recipe['setup'].get('id') and cls.recipe['setup']['auth'].get('service'):
        # TBD: if project id not given, use client credentials
        #elif not cls.recipe['setup'].get('id') and cls.recipe['setup']['auth'].get('client'):

        cls.id = cls.recipe['setup'].get('id')

        # find date based on timezone
        cls.timezone = pytz.timezone(cls.recipe['setup'].get(
            'timezone', 'America/Los_Angeles'))
        cls.now = datetime.now(cls.timezone)
        cls.date = cls.now.date()
        cls.hour = cls.now.hour

        if cls.verbose:
            print('TASK:', _task or 'all')
            print('DATE:', cls.now.date())
            print('HOUR:', cls.now.hour)
Esempio n. 2
0
  def __init__(
    self,
    recipe={},
    project=None,
    user=None,
    service=None,
    client=None,
    filepath=None,
    key=None,
    verbose=False,
    trace_print=False,
    trace_file=False,
  ):
    """Used in StarThinker scripts as programmatic entry point.

    Args:
      * recipe: (dict) JSON object representing the recipe
      * project: (string) See module description.
      * user: (string) See module description.
      * service: (string) See module description.
      * client: (string) See module description.
      * key: (string) See module description.
      * verbose: (boolean) See module description.
      * trace_print: (boolean) True if writing execution trace to stdout.
      * trace_file: (boolean) True if writing execution trace to file.
      * args: (dict) dictionary of arguments (used with argParse).

    Returns:
      Nothing.
    """

    starthinker_trace_start(trace_print, trace_file)

    self.recipe = recipe
    self.verbose = verbose
    self.filepath = filepath

    # add setup to json if not provided and loads command line credentials if given
    if 'setup' not in self.recipe:
      self.recipe['setup'] = {}
    if 'auth' not in self.recipe['setup']:
      self.recipe['setup']['auth'] = {}

    if service:
      self.recipe['setup']['auth']['service'] = service
    if client:
      self.recipe['setup']['auth']['client'] = client
    if user:
      self.recipe['setup']['auth']['user'] = user
    if project:
      self.recipe['setup']['id'] = project
    if key:
      self.recipe['setup']['key'] = key

    # TBD: if project id not given, use service credentials
    #elif not self.recipe['setup'].get('id') and self.recipe['setup']['auth'].get('service'):
    # TBD: if project id not given, use client credentials
    #elif not self.recipe['setup'].get('id') and self.recipe['setup']['auth'].get('client'):

    self.project = self.recipe['setup'].get('project', self.recipe['setup'].get('id'))
    self.key = self.recipe['setup'].get('key')

    # find date based on timezone
    self.timezone = pytz.timezone(
      self.recipe['setup'].get(
        'timezone',
        'America/Los_Angeles'
      )
    )
    self.now = datetime.now(self.timezone)
    self.date = self.now.date()
    self.hour = self.now.hour

    if self.verbose:
      print('DATE:', self.now.date())
      print('HOUR:', self.now.hour)