class Story(Model, Node): _schema = story_schema def _on_init(self): try: self._validate() except Exception as e: print('ERROR in validation for Story:') print() print(str(e)) print() print(self._yaml()) print() mpd = property(lambda self: get_manifest(self)) image = property(lambda self: get_image_url(self)) video = property(lambda self: get_video_url(self)) __repr__ = lambda self: f'Story(pk={self.pk})' location = property(lambda self: fallback( lambda: self['story_locations'][0]['location'], lambda: self[ 'story_locations']['location'], lambda: None)) geotag: compose( property, silent)(lambda self: self['story_locations'][0]['location']) swipeup_url = property( silent(lambda self: self['story_cta'][0]['links'][0]['webUri'])) spotyfy_song = property( lambda self: self['story_app_attribution']['content_url'])
def scorer(self): def from_attr(): if self._scorer is not None: return self._scorer else: raise ValueError def from_sklearn_metrics(): return sklearn.metrics.get_scorer(self.name) def from_import(): module_name, scorer_name = self.name.rsplit('.', maxsplit=1) mod = import_module_from_modname(module_name) return getattr(mod, scorer_name) self._scorer = fallback( from_attr, from_sklearn_metrics, from_import, raiser( BalletError, 'Could not get a scorer with configuration {}'.format( self.name)), ) return self._scorer
def detect_github_username(project: 'Project') -> str: """Detect github username Looks in the following order: 1. github.user git config variable 2. git remote origin 3. $USER 4. 'username' """ @raiseifnone def get_config_variable(): return project.repo.config_reader().get_value('github', 'user', default=None) @raiseifnone def get_remote(): url = list(project.repo.remote('origin').urls)[0] # protocol:user/repo, i.e. '[email protected]:ballet/ballet' return re_find(r'.+:(.+)/.+', url) @raiseifnone def get_user_env(): return sys.environ.get('USER') def get_default(): return 'username' return fallback(get_config_variable, get_remote, get_user_env, (get_default, ()))
class Media(Node, Model): def _on_init(self): try: self._validate() except Exception as e: print('ERROR in validation for Media:') print() print(str(e)) print() print(self._yaml()) print() _schema = media_schema __repr__ = lambda self: f'Media(url={self.url})' # id = property(lambda self: self.pk) url = property(lambda self: url_from_id(self.pk)) # for image data, for video posts returns the thumbnail images = property(lambda self: \ list(map(get_image_url, self['carousel_media'])) if self['carousel_media'] \ else [get_image_url(self)] or [] ) # for videos, it is a MDP, if it is long it needs to be recomposed mpd = property(lambda self: \ list(map(get_manifest, self['carousel_media'] or [])) if self['carousel_media'] \ else [get_manifest(self)] or [] ) videos = property(lambda self: \ list(map(get_video_url, self['carousel_media'] or [])) if self['carousel_media'] \ else [get_video_url(self)] or [] ) # def fallback(*args): # first = lambda arr: arr[1:] if len(arr) > 0 else lambda: None # rest = lambda arr: arr[:1]if len(arr) > 0 else [] # return first(args)() or fallback(rest(args)) _usertags = property(lambda self: fallback( lambda: self['usertags']['in']['user'], lambda: list( map(lambda x: x['user'], self['usertags']['in'])), lambda: list( map(lambda x: x['user'], self['caption']['usertags']['in'])), lambda: list( mapcat( lambda data: map(lambda x: x['user'], data['usertags']['in']), self['carousel_media'] or [])), lambda: list( mapcat( lambda data: map(lambda x: x['user'], data['caption'][ 'usertags']['in']), self['carousel_media'] or []) ), lambda: []))
def _get_name(func): return fallback( lambda: func.__closure__[1].cell_contents.__name__, lambda: func.__name__, lambda: func.__class__.__name__, )
# TODO, in pyton 3.2 attribtes aren't ordered def attributes(instance): list = [ v for k, v in instance.__dict__.items() if not k.startswith('__') and not k.endswith('__') and not isinstance(v, (FunctionType, classmethod, staticmethod)) ] return tuple(list) class SafeDict(dict): def __missing__(self, key): return '{' + key + '}' get_image_url = lambda data: fallback( lambda: data['image_versions2']['candidates'][0]['url'], lambda: data['image_versions2'][0]['url'], lambda: None, ) get_video_url = lambda data: fallback( lambda: data['video_versions'][0]['url'], # lambda: get_mdp_url(data['video_dash_manifest']), lambda: None, ) # get_media_url = lambda data: get_image_url(data) get_manifest = lambda data: data['video_dash_manifest']