Git Product home page Git Product logo

Comments (4)

kurtbrose avatar kurtbrose commented on May 21, 2024

practical use case of macro -- adding defaults to a dictionary before validation

>>> glom({'optional': 'val'}, (Fill([T, Literal(T)]), lambda t: Fill(t), lambda t: Merge(t)))
Merge(Fill([{'optional': 'val'}, T]), init=<class 'dict'>, op=<method 'update' of 'dict' objects>)

base version didn't work for some reason, we should look into this since it is a blocker for macros

>>> glom({'optional': 'val'}, (Fill([T, Literal(T)]), Fill, Merge))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\kurt\workspace\glom\glom\core.py", line 1764, in glom
    ret = _glom(target, spec, scope)
  File "C:\Users\kurt\workspace\glom\glom\core.py", line 1785, in _glom
    return scope[MODE](target, spec, scope)
  File "C:\Users\kurt\workspace\glom\glom\core.py", line 1794, in _glom_auto
    return _handle_tuple(target, spec, scope)
  File "C:\Users\kurt\workspace\glom\glom\core.py", line 1494, in _handle_tuple
    nxt = scope[glom](res, subspec, scope)
  File "C:\Users\kurt\workspace\glom\glom\core.py", line 1783, in _glom
    return spec.glomit(target, scope)
TypeError: glomit() missing 1 required positional argument: 'scope'

from glom.

kurtbrose avatar kurtbrose commented on May 21, 2024

for comparison, here is the non-marco version

# no macro
lambda defaults: Merge(Fill([defaults, T]))
# macro
lambda defaults: glom(defaults, (Fill([T, Literal(T)]), Fill, Merge))

from glom.

kurtbrose avatar kurtbrose commented on May 21, 2024

another practical use case -- and this works too

transform a django database configuration to a tableau REST api connection + datasource object

_BUILDER2ASSIGNER = Spec((
    Let(type=T[1]),
    T[0].items(),
    [Invoke(Assign).specs(
        lambda t: getattr(T[0], t[0]),
        Invoke(Spec).specs(T[1]))],
    Fill((
        Invoke(Fill).specs(Fill((
                Invoke(Invoke).specs(S['type']),
                Literal(T)
            ))),
        T,
        Literal(T[0])
        ))
    ))
"""
_BUILDER2ASSIGNER is a meta-spec to trasform

({'a': 'b', 'c': 'd'}, type)

to

(
    Fill( (Invoke(type), T) ),
    (
        Assign(T[0].a, T[1].b),
        Assign(T[0].c, T[1].d
    ),
    T[0]
)
"""


_DICT2LITERALS = Spec((
    T.items(),
    [Fill((T[0], Invoke(Literal).specs(T[1])))],
    dict))
"""
_DICT2LITERALS converts {key: val} to {key: Literal(val)}
"""



def django_db2tableau_conn(project_id, django_db):
    """
    convert a django database entry from settings.py into
    a tableau data-source with that connection
    """
    return glom(
        django_db,
        _BUILDER2ASSIGNER.glom((
            {
                'username': 'USER',
                'password': 'PASSWORD',
                'server_address': 'HOST',
                'server_port': 'PORT',
            },
            TSC.ConnectionItem)))

    return glom(
        {},
        _BUILDER2ASSIGNER.glom((
            _DICT2LITERALS.glom({
                'connections': [connection],
                'datasource_type': 'postgres',
                'name': django_db['NAME'],
            }),
            lambda: TSC.DatasourceItem(project_id)
            ))
        )

from glom.

kurtbrose avatar kurtbrose commented on May 21, 2024

alright, some real meta-glomming happening

one thing has become clear: for large-scale meta-glom to work well, it needs to be possible to determine the mode statically

this means one of two things:

1- 'compilation' is parallel to execution, with some kind of "test" object floated through the system; something kind of like T which will accept all operations

2- all modes are themselves compilation steps, which break the various constants out into their equivalent specs; we'd need a fleet of specs with names like auto_dict and fill_tuple and then meta-glom would refer to these

from glom.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.