Skip to content

Commit

Permalink
feat: more soft data fields
Browse files Browse the repository at this point in the history
  • Loading branch information
zpcc committed Sep 1, 2021
1 parent 7025f93 commit 8b09e33
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 2 deletions.
1 change: 1 addition & 0 deletions mpkg/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@ def search(words, name_only, pretty):
score = [1 for w in words if w in soft['name'].lower()]
else:
score = [1 for w in words if w in soft['name'].lower()
or w in soft.get('summary', '').lower()
or w in soft.get('description', '').lower()]
if sum(score) == len(words):
if pretty:
Expand Down
80 changes: 78 additions & 2 deletions mpkg/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import gettext
import json
import os
from dataclasses import asdict, dataclass, field
from typing import Any, Dict, List

Expand All @@ -11,36 +12,111 @@
_ = gettext.gettext


def env_rpl(text, key, func):
groups = text.split(f'%{key}:')
if len(groups) == 0:
return text
else:
for name in [t.split('%')[0] for t in groups[1:]]:
text = text.replace(f'%{key}:{name}%', func(name))
return text


@dataclass
class arch_data:
links: List[str] = field(default_factory=list)
sha256: List[str] = field(default_factory=list)
bin: List[str] = field(default_factory=list)
shortcuts: List[str] = field(default_factory=list)
pre_install: List[str] = field(default_factory=list)
post_install: List[str] = field(default_factory=list)

def format(self):
for i, v in enumerate(self.links):
self.links[i] = v.format(ver=self.ver)
for i, v in enumerate(self.pre_install):
v = env_rpl(v, 'MPKG', GetConfig)
self.pre_install[i] = env_rpl(v, 'ENV', os.getenv)
for i, v in enumerate(self.post_install):
v = env_rpl(v, 'MPKG', GetConfig)
self.post_install[i] = env_rpl(v, 'ENV', os.getenv)

def asdict(self, simplify=False):
if simplify:
return dict([(k, v) for k, v in asdict(self).items() if v])
else:
return asdict(self)


def dicts_to_dataclasses(instance):
"""See also: https://stackoverflow.com/q/51564841"""
if not isinstance(instance.info, arch_data):
instance.info = arch_data(**instance.info)
for k, v in instance.arch_.items():
if not isinstance(v, arch_data):
instance.arch_[k] = arch_data(**v)


@dataclass
class soft_data:
id: str = ''
license: str = ''
categories: List[str] = field(default_factory=list)
cfg: str = ''
name: str = ''
ver: str = ''
ver_code: int = 0
date: str = ''
notes: str = ''
info: arch_data = field(default_factory=arch_data)
arch: Dict = field(default_factory=dict)
arch_: Dict[str, arch_data] = field(default_factory=dict)
sha256: Any = field(default_factory=dict)
links: List = field(default_factory=list)
links: List[str] = field(default_factory=list)
changelog: str = ''
args: str = ''
bin: Any = field(default_factory=dict)
depends: List = field(default_factory=list)
cmd: Dict = field(default_factory=dict)
valid: List = field(default_factory=list)
summary: str = ''
description: str = ''
homepage: str = ''
src: str = ''
bugs: str = ''
i18n: str = ''
build_log: str = ''
build_meta: str = ''
mpkg_src: str = ''
mpkg_bugs: str = ''
allowExtract: bool = False

def __post_init__(self):
dicts_to_dataclasses(self)

def format(self):
for k, v in self.arch.items():
self.arch[k] = v.format(ver=self.ver)
for i, v in enumerate(self.links):
self.links[i] = v.format(ver=self.ver)
for k, v in self.cmd.items():
v = env_rpl(v, 'MPKG', GetConfig)
self.cmd[k] = env_rpl(v, 'MPKG', GetConfig)
self.info.format()
for k, v in self.arch_.items():
v.format()

def asdict(self, simplify=False):
if simplify:
return dict([(k, v) for k, v in asdict(self).items() if v])
D = dict([(k, v) for k, v in asdict(self).items() if v])
D['info'] = self.info.asdict(simplify=True)
if not D['info']:
del D['info']
if self.arch_:
D['arch_'] = {}
for k, v in self.arch_.items():
D['arch_'][k] = v.asdict(simplify=True)
return D
else:
return asdict(self)

Expand Down

0 comments on commit 8b09e33

Please sign in to comment.