Initial commit

This commit is contained in:
alexpete
2021-03-05 11:26:34 -08:00
commit a10351f38d
27091 changed files with 5521199 additions and 0 deletions
@@ -0,0 +1,53 @@
# coding:utf-8
#!/usr/bin/python
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
# -- This line is 75 characters -------------------------------------------
# The __init__.py files help guide import statements without automatically
# importing all of the modules
"""azpy.shared.__init__"""
import os
from azpy import env_bool
from azpy.constants import ENVAR_DCCSI_GDEBUG
from azpy.constants import ENVAR_DCCSI_DEV_MODE
# global space
_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False)
_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False)
_PACKAGENAME = __name__
if _PACKAGENAME is '__main__':
_PACKAGENAME = 'azpy.shared'
import azpy
_LOGGER = azpy.initialize_logger(_PACKAGENAME)
_LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME}))
# -------------------------------------------------------------------------
__all__ = ['common', 'ui']
# -------------------------------------------------------------------------
# -------------------------------------------------------------------------
if _DCCSI_DEV_MODE:
# If in dev mode this will test imports of __all__
from azpy import test_imports
_LOGGER.debug('Testing Imports from {0}'.format(_PACKAGENAME))
test_imports(__all__,
_pkg=_PACKAGENAME,
_logger=_LOGGER)
# -------------------------------------------------------------------------
del _LOGGER
@@ -0,0 +1,53 @@
# coding:utf-8
#!/usr/bin/python
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
# -- This line is 75 characters -------------------------------------------
# The __init__.py files help guide import statements without automatically
# importing all of the modules
"""azpy.shared.common.__init__"""
import os
from azpy import env_bool
from azpy.constants import ENVAR_DCCSI_GDEBUG
from azpy.constants import ENVAR_DCCSI_DEV_MODE
# global space
_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False)
_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False)
_PACKAGENAME = __name__
if _PACKAGENAME is '__main__':
_PACKAGENAME = 'azpy.shared.common'
import azpy
_LOGGER = azpy.initialize_logger(_PACKAGENAME)
_LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME}))
# -------------------------------------------------------------------------
#
__all__ = ['core_utils', 'envar_utils']
#
# -------------------------------------------------------------------------
# -------------------------------------------------------------------------
if _DCCSI_DEV_MODE:
# If in dev mode this will test imports of __all__
from azpy import test_imports
_LOGGER.debug('Testing Imports from {0}'.format(_PACKAGENAME))
test_imports(__all__,
_pkg=_PACKAGENAME,
_logger=_LOGGER)
# -------------------------------------------------------------------------
del _LOGGER
@@ -0,0 +1,518 @@
# coding:utf-8
#!/usr/bin/python
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
# -- This line is 75 characters -------------------------------------------
from __future__ import unicode_literals
# from builtins import str
# A patch to make this module work in Python3 (hopefully still works in Py27)
try:
unicode = unicode
except NameError:
# 'unicode' is undefined, must be Python3
str = str
unicode = str
bytes = bytes
basestring = (str, bytes)
else:
# 'unicode' exists, must be Python2
str = str
unicode = unicode
bytes = str
basestring = basestring
# -------------------------------------------------------------------------
'''
Module Documentation:
DccScriptingInterface\\azpy\\shared\\common\\core_utils.py
A set of utility functions
<to do: further document this module>
To Do:
https://jira.agscollab.com/browse/ATOM-5859
'''
# -------------------------------------------------------------------------
# -------------------------------------------------------------------------
# built in's
import os
import sys
import site
import fnmatch
# 3rd Party
from unipath import Path
from progress.spinner import Spinner
# Lumberyard extensions
from azpy.constants import *
from azpy import initialize_logger
# -------------------------------------------------------------------------
# -------------------------------------------------------------------------
# global space debug flag
from azpy import env_bool
from azpy.constants import ENVAR_DCCSI_GDEBUG
from azpy.constants import ENVAR_DCCSI_DEV_MODE
# global space
_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False)
_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False)
_PACKAGENAME = __name__
if _PACKAGENAME is '__main__':
_PACKAGENAME = 'azpy.shared.common.core_utils'
import azpy
_LOGGER = azpy.initialize_logger(_PACKAGENAME)
_LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME}))
# -------------------------------------------------------------------------
# --------------------------------------------------------------------------
def gather_paths_of_type_from_dir(in_path=str('c:\\'),
extension=str('*.py'),
return_path_list=list(),
use_spinner=False):
'''Walks from in_path and returns list of directories that contain the
file type matching the extension'''
if use_spinner:
spinner = Spinner('Finding: {0}\r'.format(extension))
# recursive function for finding paths
dir_contents = os.listdir(in_path)
complete = False
while complete != True:
found = None
for item in dir_contents:
# found a dir to search
if os.path.isdir((in_path + "/" + item)):
return_path_list = gather_paths_of_type_from_dir((in_path + "/" + item),
extension,
return_path_list)
# found a path
elif os.path.isfile:
if fnmatch.fnmatch(item, extension):
found = True
if found:
return_path_list.append(dir_trim_following_slash(to_unix_path(os.path.abspath(in_path))))
if use_spinner:
spinner.next()
complete = True
return return_path_list
# --------------------------------------------------------------------------
# ------------------------------------------------------------------------
def dir_trim_following_slash(current_path_str):
'''removes the trailing slash from a path str'''
safe_path = current_path_str
if current_path_str.endswith('/'):
safe_path = current_path_str[0:-1]
if current_path_str.endswith('\\'):
safe_path = current_path_str[0:-1]
return safe_path
# --------------------------------------------------------------------------
# ------------------------------------------------------------------------
def to_unix_path(current_path_str):
'''converts path string to use unix slashes'''
_LOGGER.debug('to_unix_path({0})'.format(current_path_str))
safe_path = current_path_str.replace('\\', '/')
return safe_path
# --------------------------------------------------------------------------
# --------------------------------------------------------------------------
def we_are_frozen():
# All of the modules are built-in to the interpreter, e.g., by py2exe
return hasattr(sys, "frozen")
# --------------------------------------------------------------------------
# --------------------------------------------------------------------------
def module_path():
encoding = sys.getfilesystemencoding()
if we_are_frozen():
return os.path.dirname(unicode(sys.executable, encoding))
return os.path.dirname(__file__)
# --------------------------------------------------------------------------
# --------------------------------------------------------------------------
def get_stub_check_path(in_path, checkStub='engineroot.txt'):
'''
Returns the branch root directory of the dev\'engineroot.txt'
(... or you can pass it another known stub)
so we can safely build relative filepaths within that branch.
If the stub is not found, it returns None
'''
from unipath import Path
path = Path(in_path).absolute()
while 1:
testPath = Path(path, checkStub)
if testPath.isfile():
return Path(testPath)
else:
path, tail = (path.parent, path.name)
if (len(tail) == 0):
return None
# --------------------------------------------------------------------------
# -------------------------------------------------------------------------
def reorder_sys_paths(known_sys_paths):
"""Reorders new directories to the front"""
new_sys_path = []
for item in list(sys.path):
item = Path(item)
if item.lower() not in known_sys_paths:
new_sys_path.append(item)
sys.path.remove(item)
sys.path[:0] = new_sys_path
known_sys_paths = site._init_pathinfo()
return known_sys_paths
# -------------------------------------------------------------------------
# -------------------------------------------------------------------------
def check_path_exists(in_path):
"""Will bark if path does not exist"""
check = os.path.exists(in_path)
if check:
_LOGGER.info('~ Path EXISTS: {0}\r'.format(in_path))
else:
_LOGGER.info('~ Path does not exist: {0}\r'.format(in_path))
return check
# -------------------------------------------------------------------------
# -------------------------------------------------------------------------
def path_split_all(in_path):
'''Splits the in_path to all of it's parts'''
all_path_parts = []
while 1:
parts = os.path.split(path)
if parts[0] == path: # sentinel for absolute paths
all_path_parts.insert(0, parts[0])
break
elif parts[1] == path: # sentinel for relative paths
all_path_parts.insert(0, parts[1])
break
else:
path = parts[0]
all_path_parts.insert(0, parts[1])
return all_path_parts
# -------------------------------------------------------------------------
# --------------------------------------------------------------------------
def synthetic_property(inst, name, value, read_only=False):
'''
This is a convenience method for OOP
synthesizes the creation of property attr with convenience methods:
x.attrbute # the @property (and setter)
x._attribute # attribute storage (private)
x.getAttribute() # retreive attribute
x.setAttribute() # set attribute (only created if not 'read only')
x.delAttribute() # delete the attribute from object
'''
cls = type(inst)
storage_name = '_{0}'.format(name)
getter_name = 'get{0}{1}'.format(name[0].capitalize(), name[1:])
setter_name = 'set{0}{1}'.format(name[0].capitalize(), name[1:])
deleter_name = 'del{0}{1}'.format(name[0].capitalize(), name[1:])
setattr(inst, storage_name, value)
# We always define the getter
def custom_getter(self):
return getattr(self, storage_name)
# Add the Getter
if not hasattr(inst, getter_name):
setattr(cls, getter_name, custom_getter)
# Handle Read Only
if read_only:
if not hasattr(inst, name):
setattr(cls, name, property(fget=getattr(cls, getter_name, None)
or custom_getter,
fdel=getattr(cls, getter_name, None)))
else:
# We only define the setter if we aren't read only
def custom_setter(self, state):
setattr(self, storage_name, state)
if not hasattr(inst, setter_name):
setattr(cls, setter_name, custom_setter)
member = None
if hasattr(cls, name):
# we need to try to update the property fget, fset,
# fdel incase the class has defined its own custom functions
member = getattr(cls, name)
if not isinstance(member, property):
raise ValueError('Member "{0}" for class "{1}" exists and is not a property.'
''.format(name, cls.__name__))
# Regardless if the class has the property or not we still try to set it with
setattr(cls, name, property(fget=getattr(member, 'fget', None)
or getattr(cls, getter_name, None)
or custom_getter,
fset=getattr(member, 'fset', None)
or getattr(cls, setter_name, None)
or custom_setter,
fdel=getattr(member, 'fdel', None)
or getattr(cls, getter_name, None)))
# --------------------------------------------------------------------------
# --------------------------------------------------------------------------
def find_arg(arg_pos_index=None, arg_tag=None, remove_kwarg=None,
in_args=None, in_kwargs=None, default_value=None):
"""
# finds and returns an arg...
# if a positional index is given arg_pos_index=0, it checks args first
# if a arg_tag is given, it checks kwargs
# If remove_kwarg=True, it will remove the found arg from kwargs
# * I actually want/need to do this often
#
# a set kwarg will ALWAYS take precident over positional arg!!!
#
# return outArg, args, kwargs <-- get back modified kwargs!
#
# proper usage:
#
# found_arg, args, kwargs = find_arg(0, 'name',)
"""
if arg_pos_index != None:
if not isinstance(arg_pos_index, int):
raise TypeError('remove_kwarg: accepts a index integer!\r'
'got: {0}'.format(remove_kwarg))
# positional args ... check the position
if len(in_args) > 0:
try:
found_arg = in_args[arg_pos_index]
except:
pass
# check kwargs ... a set kwarg will ALWAYS take precident over
# positional arg!!!
try:
found_arg
except:
found_arg = in_kwargs.get(arg_tag, default_value) # defaults to None
if remove_kwarg:
if arg_tag in in_kwargs:
del in_kwargs[arg_tag]
# if we didn't find the arg/kwarg, the defualt return will be None
return found_arg, in_kwargs
# -------------------------------------------------------------------------
# --------------------------------------------------------------------------
def set_synth_arg_kwarg(inst, arg_pos_index, arg_tag, in_args, in_kwargs,
remove_kwarg=True, default_value=None, set_anyway=True):
"""
Uses find_arg and sets a property on a object.
Special args:
set_anyway <-- if the object has the property already, set it
"""
# find the argument, or set to default value
found_arg, in_kwargs = find_arg(arg_pos_index, arg_tag, remove_kwarg,
in_args, in_kwargs,
default_value)
# make sure the object doesn't arealdy have this property
try:
hasattr(inst, arg_tag) # <-- check if property exists
if set_anyway:
try:
setattr(inst, arg_tag, found_arg) # <-- try to set
except Exception as e:
raise e
except:
try:
found_arg = synthetic_property(inst, arg_tag, found_arg)
except Exception as e:
raise e
return found_arg, in_kwargs
# --------------------------------------------------------------------------
# -------------------------------------------------------------------------
def walk_up_dir(in_path, dir_tag='foo'):
'''
Mimic something like os.walk, but walks up the directory tree
Walks Up from the in_path looking for a dir with the name dir_tag
in_path: the path to start in
dir_tag: the name of diretory above us we are looking for
returns None if the directory named dir_tag is not found
'''
from unipath import Path
path = Path(Path(__file__).absolute())
while 1:
# hmmm, will this break on unix paths?
# what about case sensitivity?
dir_base_name = Path(path.norm_case()).name()
if (dir_base_name == dir_tag):
break
path, tail = (path.parent(), path.name())
if (len(tail) == 0):
return None
return path
# --------------------------------------------------------------------------
# --------------------------------------------------------------------------
def return_stub(stub):
'''Take a file name (stub) and returns the directory of the file (stub)'''
from unipath import Path
dir_last_file = None
if dir_last_file is None:
path = Path(__file__).absolute()
while 1:
path, tail = (path.parent, path.name)
newpath = Path(path, stub)
if newpath.isfile():
break
if (len(tail) == 0):
path = ""
_LOGGER.debug('~ Debug Message: I was not able to find the '
'path to that file (stub) in a walk-up from currnet path')
break
dir_last_file = path
return dir_last_file
# --------------------------------------------------------------------------
# --------------------------------------------------------------------------
# direct call for testing methods functions
if __name__ == "__main__":
'''To Do: Document'''
# constants for shared use.
_G_DEBUG = True
# happy _LOGGER.info
_LOGGER.info("# {0} #".format('-' * 72))
_LOGGER.info('~ constants.py ... Running script as __main__')
_LOGGER.info("# {0} #\r".format('-' * 72))
cwd = Path(os.getcwd())
# This grabs pythons known paths
_KNOWN_SITEDIR_PATHS = list(sys.path) # this appears to give me a somehow malformed syspath?
_KNOWN_SITEDIR_PATHS = site._init_pathinfo()
# this is just a debug developer convenience _LOGGER.info (for testing acess)
if _G_DEBUG:
import pkgutil
_LOGGER.info('Current working dir: {0}'.format(cwd))
search_path = ['.'] # set to None to see all modules importable from sys.path
all_modules = [x[1] for x in pkgutil.iter_modules(path=search_path)]
_LOGGER.info('All Available Modules in working dir: {0}\r'.format(all_modules))
# test toUnixPath
# assumes the current working directory (cwd) is <ly>\\dev\\Gems\\DccScriptingInterface
test_path = Path(cwd, 'LyPy', 'si_shared', 'common', 'core_utils.py')
safeTest = to_unix_path(test_path)
_LOGGER.info("Unix format: '{0}'".format(safeTest))
_LOGGER.info('')
# test dirTrimFollowingSlash
short_path = Path(cwd)
_LOGGER.info("Original: '{0}'".format(short_path))
short_path = to_unix_path(short_path)
_LOGGER.info("Unix: '{0}'".format(short_path))
trimTest = dir_trim_following_slash(short_path)
_LOGGER.info("Trimmed: '{0}'".format(trimTest))
_LOGGER.info('')
# test gather_paths_of_type_from_dir
extTest = '*.py'
fileList = gather_paths_of_type_from_dir(os.getcwd(), extTest, use_spinner=True)
_LOGGER.info('Found {0}: {1}'.format(extTest, len(fileList)))
_LOGGER.info('')
# test weAreFrozen
# none
# test modulePath
modulePathTest = module_path()
_LOGGER.info("This Module: '{0}'".format(modulePathTest))
modulePathTest = to_unix_path(modulePathTest)
_LOGGER.info("This module unix: '{0}'".format(modulePathTest))
_LOGGER.info('')
# test checkstub_getpath
stubTest = get_stub_check_path(__file__)
_LOGGER.info("Stub Path: '{0}'".format(stubTest))
# reorderSysPaths test
pkgTestPath = Path(cwd, 'LyPy', 'si_shared', 'packagetest')
site.addsitedir(pkgTestPath)
anotherTestPath = Path(cwd, 'LyPy', 'si_shared', 'dev')
site.addsitedir(anotherTestPath)
# pass in the previous list we retreived earlier
_KNOWN_SITEDIR_PATHS = reorder_sys_paths(_KNOWN_SITEDIR_PATHS) # I think this is broken,
# I get back this as one of the paths:
# G:\depot\gallowj_PC1_lrgWrlds\dev\Gems\DccScriptingInterface\Shared\Python\LyPyCommon\PYTHONPATH
_LOGGER.info('done')
pass
# checkPathExists test
# pathSplitAll test
# walkUp test
# test synthesize
# to do: write test
# test findArg
# to do: write test
# test setSynthArgKwarg
# to do: write test
@@ -0,0 +1,220 @@
# coding:utf-8
#!/usr/bin/python
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
# -- This line is 75 characters -------------------------------------------
from __future__ import unicode_literals
# -------------------------------------------------------------------------
'''
Module: <DCCsi>\azpy\shared\common\config_utils.py
A set of utility functions
<to do: further document this module>
To Do:
https://jira.agscollab.com/browse/ATOM-5859
'''
# -------------------------------------------------------------------------
# -------------------------------------------------------------------------
# built in's
import os
import sys
import logging as _logging
# 3rd Party
from box import Box
from unipath import Path
# Lumberyard extensions
from azpy.constants import *
# -------------------------------------------------------------------------
# -------------------------------------------------------------------------
from azpy import env_bool
from azpy.constants import ENVAR_DCCSI_GDEBUG
from azpy.constants import ENVAR_DCCSI_DEV_MODE
# global space
_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False)
_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False)
_PACKAGENAME = __name__
if _PACKAGENAME is '__main__':
_PACKAGENAME = 'azpy.shared.common.envar_utils'
import azpy
_LOGGER = azpy.initialize_logger(_PACKAGENAME)
_LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME}))
# -------------------------------------------------------------------------
# -- envar util ----------------------------------------------------------
def get_envar_default(envar, envar_default=None, envar_set=Box(ordered_box=True)):
'''
Check the environment variable (envar)
Get from the system environment, or the module dictionary (a Box):
like the test one in __main__ below,
TEST_ENV_VALUES = Box(ordered_box=True)
TEST_ENV_VALUES[ENVAR_LY_PROJECT] = '${0}'.format(ENVAR_LY_PROJECT)
This dictionary provides a simple way to pack a default set into a
structure and decouple the getter implementation.
These envars resolve to specific values at import time.
Envars set in the environment trump the default values.
:param var:
:return: Some value for the variable, current or default.
'''
envar = str(envar)
value = os.getenv(envar, envar_default)
if not value:
value = envar_set.get(envar)
if value is not None:
value = Path(value).expand_vars()
return value
# -------------------------------------------------------------------------
# -- envar util ----------------------------------------------------------
def set_envar_defaults(envar_set, env_root=get_envar_default(ENVAR_LY_DEV)):
"""
Set each environment variable if not alreay set with value.
Must be safe, will not over-write existing.
:return: envarSet
"""
if env_root:
env_root = Path(env_root)
if env_root.exists():
os.environ[ENVAR_LY_DEV] = env_root
envar_set[ENVAR_LY_DEV] = env_root
else:
raise ValueError("EnvVar Root is not valid: {0}".format(env_root))
for envar in iter(envar_set.keys()):
envar = str(envar)
value = os.getenv(envar)
if _G_DEBUG:
if not value:
_LOGGER.debug('~ EnVar value NOT found: {0}\r'.format(envar))
if not value:
value = envar_set.get(envar)
elif value:
if Path(value).exists():
# re-set to Path object, if it is a valid existing path
value = Path(value)
envar_set[envar] = value
os.environ[envar] = value.expand_vars()
elif value:
envar_set[envar] = value
return envar_set
# -------------------------------------------------------------------------
# -- envar util class ----------------------------------------------------
class Validate_Envar(object):
'''Simple Class to resolve environment references at runtime
after the project_root has been defined'''
def __init__(self, envar=''):
self._envar = envar
self._envar_value = None
@property
def envar(self):
return self._envar
@envar.setter
def envar(self, envar):
self._envar = envar
self._envar_value = get_envar_default(self._envar)
return self._envar
@envar.getter
def envar(self):
return self._envar
@property
def envar_value(self):
return get_envar_default(self._envar_value)
@envar_value.getter
def envar_value(self):
self._envar_value = get_envar_default(self._envar)
return self._envar_value
def __str__(self):
return str('{0}'.format(self.envar_value))
def __repr__(self):
return "Validate_Envar(envar='{0}')".format(self.envar)
# -------------------------------------------------------------------------
###########################################################################
# Main Code Block, runs this script as main (testing)
# -------------------------------------------------------------------------
if __name__ == '__main__':
# imports for local testing
import json
# srun simple tests?
test = True
# happy print
_LOGGER.info("# {0} #".format('-' * 72))
_LOGGER.info('~ config_utils.py ... Running script as __main__')
_LOGGER.info("# {0} #\r".format('-' * 72))
# set up base totally non-functional defauls (denoted with $<ENVAR>)
TEST_ENV_VALUES = Box(ordered_box=True)
# ^^ that results in "~ EnVar value NOT found: ordered_box"
# which is a little bit odd, I assume the Box object stores that
# it should be benign but leaving this comment here in case of funk
# tes envars
TEST_ENV_VALUES[ENVAR_LY_PROJECT] = '${0}'.format(ENVAR_LY_PROJECT)
TEST_ENV_VALUES[ENVAR_LY_DEV] = Path('${0}'.format(ENVAR_LY_DEV))
# try to fetch and set the base values from the environment
# this makes sure all envars set, are resolved on import
TEST_ENV_VALUES = set_envar_defaults(TEST_ENV_VALUES)
_LOGGER.info('Pretty print: TEST_ENV_VALUES')
print(json.dumps(TEST_ENV_VALUES,
indent=4, sort_keys=False,
ensure_ascii=False), '\r')
# simple tests
_ENV_TAG = 'LY_DEV'
foo = get_envar_default(_ENV_TAG)
_LOGGER.info("~ Results of getVar on tag, '{0}':'{1}'\r".format(_ENV_TAG, foo))
envar_value = Validate_Envar(envar=_ENV_TAG)
_LOGGER.info('~ Repr is: {0}\r'.format(str(repr(envar_value))))
_LOGGER.info("~ Results of ValidEnvars(envar='{0}')=='{1}'\r".format(_ENV_TAG, envar_value))
# custom prompt
sys.ps1 = "[azpy]>>"
@@ -0,0 +1,53 @@
# coding:utf-8
#!/usr/bin/python
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
# -- This line is 75 characters -------------------------------------------
# The __init__.py files help guide import statements without automatically
# importing all of the modules
"""azpy.shared.ui.__init__"""
import os
from azpy import env_bool
from azpy.constants import ENVAR_DCCSI_GDEBUG
from azpy.constants import ENVAR_DCCSI_DEV_MODE
# global space
_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False)
_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False)
_PACKAGENAME = __name__
if _PACKAGENAME is '__main__':
_PACKAGENAME = 'azpy.shared.ui'
import azpy
_LOGGER = azpy.initialize_logger(_PACKAGENAME)
_LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME}))
# -------------------------------------------------------------------------
#
__all__ = []
#
# -------------------------------------------------------------------------
# -------------------------------------------------------------------------
if _DCCSI_DEV_MODE:
# If in dev mode this will test imports of __all__
from azpy import test_imports
_LOGGER.debug('Testing Imports from {0}'.format(_PACKAGENAME))
test_imports(__all__,
_pkg=_PACKAGENAME,
_logger=_LOGGER)
# -------------------------------------------------------------------------
del _LOGGER
@@ -0,0 +1,272 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>809</width>
<height>846</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Watch Directories</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="projec_tag_label">
<property name="minimumSize">
<size>
<width>100</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>Project</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="project_slug_lineEdit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>MockProject</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>222</width>
<height>27</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QLabel" name="default_project_watch_path_label">
<property name="minimumSize">
<size>
<width>100</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>Project Path</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="default_project_watch_path_lineEdit">
<property name="minimumSize">
<size>
<width>400</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>C:\Lumberyard\Dev\Gems\DccScriptingInterface\MockProject\</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="update_project_path_dir_pushButton">
<property name="minimumSize">
<size>
<width>225</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>Update Project Path ...</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="file_patterns_label">
<property name="minimumSize">
<size>
<width>100</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>File Patterns</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="file_pattern_lineEdit">
<property name="minimumSize">
<size>
<width>400</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>*.sbs, *.sbsar</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="search_and_add_dirs_pushButton">
<property name="minimumSize">
<size>
<width>225</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>Search and Add</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTreeView" name="WatchdogList_treeView">
<property name="minimumSize">
<size>
<width>0</width>
<height>250</height>
</size>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="remove_selected_watch_dir_pushButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>Remove Selected Watch Directory</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="browse_and_add_dir_pushButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>Browse and Add Watch Directory ...</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Substance Watcher</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="start_watcher_pushButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>Start Watcher</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="stop_watcher_pushButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>Stop Watcher</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QFrame" name="console_ancor_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QTextEdit" name="output_console_textEdit">
<property name="minimumSize">
<size>
<width>0</width>
<height>250</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:afe9402162c5b4527f12c863d389ee9d75b53a1069b7e177497beba389d91d35
size 525
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dc1e37e22cb75f616d6ada02cce006bae7fb1da515b15afea0fc98fcc542a092
size 547
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c7c9c4c8c5bdc755cc026aa23044f546010c0d1e079ecba34ceb8f0eb9e44bde
size 530
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6111d15f1dc946742b00317bda789a5c625333f65a362f38931dabc50afb2067
size 518
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8ac79e7fbd6be51465e0b685dca32c1236f95ad76ab8c5877ec73d20a1de4365
size 546
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a86de88cf4ee32c352776caf46d5512d27679da8b571ea7e791287495fad4514
size 569
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5c5b8427bd1497006b8adbcbc445f11b07ec388a3398fe2997f65bdc56f2644f
size 565
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:95ad920de52fd198f1af6d569917be20dc24a39dabdbe6c555c812d424bd9736
size 541
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cb5b2d9b40652764f074dcea9856d6748b0efeac57ef58f306efa999f4b411c1
size 518
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6a38dcd5b4078df430fa05780844af3e88e0a8e01c1fa910482e4c217354d728
size 553
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5f60b2dfce514a6f558134b942f255ddf81ca3dc77b0d899a87f6d4cbac38e26
size 543
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:84379a7bd6ffa75692648c6fce328616e8a009d7ea3a83c2288f82ecce37e729
size 544
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d7ee7bfb0c60d4687c8a0dcc38a12ee7cacaa2cbb9eb0ae24faa82b992ade445
size 512
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:571b1afb9c2d7e01f56b75e1526dd0a3ffd49a60a4bcb7981ba34823b44a74c0
size 538
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:45d805ec94b8144bf121ba74ee96dd27f2f8c0890b2eca5e78df39cb5266f94d
size 530
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d49428a947ea424fabedd5a08e1d78e0bc57dc8a2d5a231b5d9ec06977870f5a
size 518
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d33b23ed0d8450413a2582d8f00bcb808d39f7e09ff394cee1669a4b7e79207e
size 1256
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d33b23ed0d8450413a2582d8f00bcb808d39f7e09ff394cee1669a4b7e79207e
size 1256
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d33b23ed0d8450413a2582d8f00bcb808d39f7e09ff394cee1669a4b7e79207e
size 1256
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d33b23ed0d8450413a2582d8f00bcb808d39f7e09ff394cee1669a4b7e79207e
size 1256
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:56776b4655640d46eb1031b9c19c2341fdfe1201c774a84bc5c2801fbcfefc37
size 350
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d48862b1c68efdf376551d1c35d5d3a68e2ce9809e7c2723f42ece7c77fca009
size 373
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:62cc47f4b7751e22ffe4b26289ecc632b4a2c4e5c33ac79864fcfb32398b1139
size 380
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ad6e74b57c8876fa28c3a43d1a38369415790507d65d758ea3e77b796c401da2
size 372
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:63324c154ead46027729bcf307ba45fbeb5a8de3ec5e8cef55d315a84a087115
size 142
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8a8b091785c84d37de57aacb7fe5a9b854933cc94b9b6f1f6e0b155879c7d6d0
size 146
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4f89a6b105df07325dcf7bdcea2165bb065dd99b648aa12ae4e0c6693e04d0a2
size 146
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:76f44758619badecf11b3b0d9914612e584ad750a695c942811fe215457b25be
size 146
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:50a35383d40b4e8a646931e4057cd25045f05a48208e2cb9d9935be76b53bf94
size 130
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ba7550922e9d244620f8f9ad76fe546d542764eba02378f81b188dec5fd7438a
size 134
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:52bec8528e3c8edd583136d90a37f46bcb45e0d406fc0fb680a8b4d75cfeb731
size 134
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1b8d2c9a8593a52221c91d2a8c2d3cbd837e408a5f6d1dcad6f79328a13a3bcf
size 134
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5087f4f06a9718230e1aec2ba681f3432ecd2640a135b4e90c7b009188ec4c29
size 155
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dec80a2e8439a0787e10aee70a365e30b5d1f43c29e4c33989cc6cd2f5cac478
size 162
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:39930fd3e240c9ad94d748d6cda73b2943682fc4825edd1240e882be18c06198
size 162
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0d07da719927b26db1c3087bbfe7203510fce077efe9e121935b3aefbb49b95d
size 162
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:05a1980b268f598ebb3520067679a8beb4fa3f00da9c87dd93be2642718ceb44
size 354
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:047c00f910dd279e871a6329ea533816d8b458063539b8efbe9949d7363996bf
size 375
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6bc79f30e3fdc52ec30eb0e9c6b03d1538f7c8c7855033d24d5f993e8ceb9cc1
size 367
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:aa65cf58b8a02bf5f4142ad80de05aba868245c55a790af6ba0230bfd01a2a06
size 369
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:95c1c1651a13f0562383087549a35a97bbb7899c7d3717d79d4624485b72bf9f
size 452
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:80a1d02e6ac7e5d0439b2a077ab8cf82739853ce46ac1556d4035e3bba713242
size 467
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:64d5ed4d01a9778912b98c9147eb67431560acb5805d1d0832a765c441b9ed9b
size 441
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f0ffa46106a643a71835056acce66ebe09745a9e6d91fac30ff1caf0589a6677
size 418
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8b291eb9180c0e27d1de6ff008ff4259b2c675a65efa94866a66c7c932fc1260
size 581
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8c7d3d64e8cb5e2f8bc6620b0d58492a56800fc78fc0229a5fa495d3a43987a1
size 614
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:43d494685f5d2ed740b69f04fefe0e757626db94685ecc8f4411c6c68a626a5a
size 576
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7af182d82449663ac37955e45ccc3f8fc86d185649fa9bed24c10167351bd5ee
size 563
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:232451d0bd9cf1d54c777862030b667cd5078f2f4ff387ec03c44d56eb207c03
size 397
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7b54771eaad56ee45f8871248ee1c6b18035aa732f9e4e9257d008a73be04c25
size 386
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ae293d387fda8a89d68fc3f15db07ef084e3537a033d02351ff918cfcc82ea8a
size 394
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f8ccf5cb638a090f0e64f6d336e4c6312cfaf53971afd0f00cd16d0c0759f1b4
size 403
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:256f010c3084112888189bcbea2995a37f8acbf12d61a4a261a94aca797cd964
size 117
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:85522a94ec26125f65dcafc6158665f40ea570e4a08cbdfbbdf5f6772b887eb7
size 121
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ae4766527d9e5a2226107ede231878118538e8be89f2dc2ac92b7c5a68ad0fc6
size 120
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5f4bdbb4d207aa40366ad90d363a95d80e2b4a43574ca1ad3256ee6e0617f25e
size 120
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:50a35383d40b4e8a646931e4057cd25045f05a48208e2cb9d9935be76b53bf94
size 130
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ba7550922e9d244620f8f9ad76fe546d542764eba02378f81b188dec5fd7438a
size 134
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:52bec8528e3c8edd583136d90a37f46bcb45e0d406fc0fb680a8b4d75cfeb731
size 134
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1b8d2c9a8593a52221c91d2a8c2d3cbd837e408a5f6d1dcad6f79328a13a3bcf
size 134
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:abee85006ecef454df64f65a6aa7dbb85bff9c51f53ed87b47e9f4ef1adefec3
size 1224
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7e22fc4d6bf116cebab4655b6bf81b1c384789b45a96f05d8a4b535e34978cb9
size 1325
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3db59af5ba4caa97ac07834e1a919adafdcd610324dacac68cbd2cde551c2397
size 1293
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:34bce34b70cf7c24d1e54f87f4225f0c4cf8e7dd8c6fd8a38f81e981bae2a2ce
size 1276
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f675766febe18edf774b0dd7db11177ca76793c0d2b693b1ffb6a447b79369d2
size 963
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6d5af9296f23e58fc7fde5c9b278a801bd51bb3650d0e5f84dd9eb84434308cc
size 1040
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c0b650dda797331b8c23ece7e313babb8e6e9118bd3d53e689a7381a33cb5e00
size 1032
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2dd40885e1d7b1d3f37cfc3afff07fe47db552602bdc46aa9a8ce7a0c8df30db
size 1022
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:054d47979c0879378a6f5e36d9e5b251c31e15610adeed109b8f128115d4b5ec
size 150
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9eca88a1ebba5d42107da4c3b3af3b52a8de1c76bc1bae8d27190ff5e69f8198
size 155
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e11a73fcc79cebd854cbdf3c6539eca99b016440c590b5326f90fa9790e9a69d
size 154
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7371a89813b6f4843dc90b4abe866de943ba670057e0802dcc7f0284d9aa079b
size 154
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8e4d88b8da4d94d4ecaa0eda448d18adcad14c5a62d4e6c9d0ffb2673683d855
size 137
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e7422317ab56297babc9025f42dd1f7179588ac4e066cb1b976b1bb56efca656
size 140
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b9a1520ad62a2b20f53c0709d643af3e8e0d775891597c4bc05e46ed75617bd9
size 144
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:73b0e2dddb1c22848b9b858975cdaae02f0b7b47696922a863358afa30f81dfa
size 143
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e2986d7bca86f3359817f002ecf125afab71281561925a6ecbffe844a2be9699
size 145
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4f7909f6aa1843cb2382ea0e49afb10967a331e128cc8103ab8082c3e46a90aa
size 151
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b4c628767e58d08e929a4bfc3f730e1347b186a44a1b0d4159fa722776a660ea
size 149
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c2bcf16dee85252fbf33d3eb05009b988f4c7b3795c01d66e471712d76def3ab
size 149
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5db0c6a32f562204a4dc77c8958ef29e016af621f11891ca1795da808a879288
size 133
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c705854e5a7aae10edb4d0cd28d1217a0b6599845031053d502aa05030ce5134
size 135
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:39bd3c687b5bc56d6a62728d3dbfa522f3e1e74ec4de752987768f60c947adf5
size 139
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0966303eb702647e3463ffa644611d817741b1ee0d016ecd56c600e9f04ac114
size 138
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:17cedbceacd7ae3a97319a3db9606b40d8ef31428828b08bdbfe73f5642b4ae5
size 104
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:17cedbceacd7ae3a97319a3db9606b40d8ef31428828b08bdbfe73f5642b4ae5
size 104
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:17cedbceacd7ae3a97319a3db9606b40d8ef31428828b08bdbfe73f5642b4ae5
size 104
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:17cedbceacd7ae3a97319a3db9606b40d8ef31428828b08bdbfe73f5642b4ae5
size 104
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f7b31e2fb43e9c3dbd9f0e32680422a7d8c8e7ff7cd600e446103e45b0df0523
size 766
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:528a22b6955681f34373fc72a2dfdd19e6255e18c73f0804c09b34ea01c1f0a0
size 838
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bbc009bf89ac37957e2ff6532a9328f71e63f5edb45bd918048c8a69f61a72e2
size 756
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cd117b3874dec17ebf78f136784eca821f4d916fe34081187c8c28bc2223f545
size 745
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2c2ebc9c32505a0489879f7429034143af2ed48e71d2b2eba449a45c7253a2b7
size 426
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0e7ffdf7643cd2078127953690098b8ea8899428f7906efa778d70422d254f1e
size 447

Some files were not shown because too many files have changed in this diff Show More