コード例 #1
0
def test_call_and_target():
    class F(object):
        def __init__(s, a, b, c):
            s.a, s.b, s.c = a, b, c

    call_f = Call(F, kwargs=dict(a=T, b=T, c=T))
    assert repr(call_f)
    val = glom(1, call_f)
    assert (val.a, val.b, val.c) == (1, 1, 1)

    class F(object):
        def __init__(s, a):
            s.a = a

    val = glom({'one': F('two')}, Call(F, args=(T['one'].a, )))
    assert val.a == 'two'
    assert glom({'a': 1}, Call(F, kwargs=T)).a == 1
    assert glom([1], Call(F, args=T)).a == 1
    assert glom(F, T(T)).a == F
    assert glom([F, 1], T[0](T[1]).a) == 1
    assert glom([[1]], S[UP][Literal(T)][0][0]) == 1
    assert glom([[1]], S[UP][UP][UP][Literal(T)]) == [[1]]  # tops out

    assert list(glom({'a': 'b'}, Call(T.values))) == ['b']

    with pytest.raises(TypeError, match='expected func to be a callable or T'):
        Call(func=object())

    assert glom(lambda: 'hi', Call()) == 'hi'
    return
コード例 #2
0
ファイル: test_basic.py プロジェクト: sanjaysiddhanti/glom
def test_literal():
    expected = {'value': 'c', 'type': 'a.b'}
    target = {'a': {'b': 'c'}}
    val = glom(target, {'value': 'a.b', 'type': Literal('a.b')})

    assert val == expected

    assert glom(None, Literal('success')) == 'success'
    assert repr(Literal(3.14)) == 'Literal(3.14)'
コード例 #3
0
 def deconstruction_specs(cls):
     """
     Return a list of deconstruction_specs=dict(description='doc string',
                                                check_type='callable for checking if obj satisfies spec',
                                                spec='describes how to generate ctor_dict',
                                                validate_conversion='optional callable comparing obj to ctor_dict')
     """
     return [
         {
             'description':
             'For numpy.ndarray',
             'check_type':
             lambda x: isinstance(x, np.ndarray),
             'spec': {
                 Ctor.CONSTRUCTOR: Literal(np.array),
                 Ctor.ARGS: lambda x: [x.tolist()],
                 Ctor.KWARGS: Literal(None),
             },
             'validate_conversion':
             lambda x, serialized_x: np.allclose(
                 x, Ctor._construct_obj(serialized_x)),
         },
         {
             'description':
             'For objects that have from_jdict and to_jdict methods',
             'check_type':
             lambda x: hasattr(x, 'from_jdict') and hasattr(x, 'to_jdict'),
             'spec': {
                 Ctor.CONSTRUCTOR: lambda x: type(x).from_jdict,
                 Ctor.ARGS: lambda x: [x.to_jdict()],
                 Ctor.KWARGS: Literal(None),
             },
             'validate_conversion':
             lambda x, serialized_x: x.to_jdict() == Ctor._construct_obj(
                 serialized_x).to_jdict(),
         },
         {
             'description':
             'for class methods or class constructors',
             'check_type':
             lambda x: inspect.ismethod(x) or inspect.isclass(x),
             'spec': {
                 Ctor.CONSTRUCTOR:
                 Literal(cls._deserialize_ctor_from_jdict),
                 Ctor.ARGS: lambda x: [cls._serialize_ctor_to_jdict(x)],
                 Ctor.KWARGS: Literal(None),
             },
             'validate_conversion':
             lambda x, serialized_x: np.allclose(
                 x, Ctor._construct_obj(serialized_x)),
         },
     ]
コード例 #4
0
def classes_sync(master_id, environments):
    cert_instance = CertsClass(master_id)
    cert_path = cert_instance.get_cert()
    private_key_path = cert_instance.get_key()
    master_address = cert_instance.get_master_address()

    url = f"https://{master_address}:8140/puppet/v3/environment_classes/"
    data = []
    for environment in environments:
        req = requests.get(
            f"{url}?environment={environment}",
            verify=False,
            cert=(cert_path, private_key_path),
        )
        target = req.json()["files"]
        spec = [
            Coalesce(
                (
                    "classes",
                    [{
                        "name":
                        "name",
                        "params": (
                            "params",
                            [{
                                "name":
                                "name",
                                "type":
                                Coalesce("type", Literal("String")),
                                "default_source":
                                Coalesce("default_source", Literal("")),
                            }],
                        ),
                        "master":
                        Literal(master_id),
                    }],
                ),
                Literal([]),
            )
        ]
        for class_data in list(chain(*glom(target, spec))):
            class_data["environment"] = environment
            data.append(class_data)

    user = os.environ.get("WEBAPP_USER", "")
    password = os.environ.get("WEBAPP_PASS", "")
    requests.post("http://webapp:8000/api/classes/sync/",
                  json=data,
                  auth=(user, password))
コード例 #5
0
ファイル: master_nodes.py プロジェクト: thiagopena/grua
def nodes_sync(master_id, master_address):
    cert_instance = CertsClass(master_id)
    cert_path = cert_instance.get_cert()
    private_key_path = cert_instance.get_key()

    req = requests.get(
        f"https://{master_address}:8081/pdb/meta/v1/version",
        verify=False,
        cert=(cert_path, private_key_path),
    )
    if req.status_code == 404:
        # PuppetDB <= 2.x
        nodes_uri = f"https://{master_address}:8081/v4/nodes"
    else:
        # PuppetDB >= 3.x
        nodes_uri = f"https://{master_address}:8081/pdb/query/v4/nodes"
    req = requests.get(nodes_uri,
                       verify=False,
                       cert=(cert_path, private_key_path))
    target = req.json()
    spec = [{"certname": "certname", "master_zone": Literal(master_id)}]
    user = os.environ.get("WEBAPP_USER", "")
    password = os.environ.get("WEBAPP_PASS", "")
    requests.post(
        "http://webapp:8000/api/nodes/sync/",
        json=glom(target, spec),
        auth=(user, password),
    )
コード例 #6
0
def field_expression(f):
    if isinstance(f, PhoneNumberField):
        return (f.name, Coalesce("as_e164", default=""))
    elif isinstance(f, GeometryField):
        return (f.name, str)
    elif isinstance(f, CountryField):
        return (f.name, str)
    elif isinstance(f, StdImageField):
        return (f.name,
                lambda u: settings.FRONT_DOMAIN + settings.MEDIA_URL + u.url)
    elif f.name == "password":
        return Literal("(caché)")

    return f.name
コード例 #7
0
def test_let():
    data = {'a': 1, 'b': [{'c': 2}, {'c': 3}]}
    output = [{'a': 1, 'c': 2}, {'a': 1, 'c': 3}]
    assert glom(data, (Let(a='a'), ('b', [{'a': S['a'], 'c': 'c'}]))) == output
    assert glom(data, ('b', [{
        'a': S[ROOT][Literal(T)]['a'],
        'c': 'c'
    }])) == output

    with pytest.raises(TypeError):
        Let('posarg')
    with pytest.raises(TypeError):
        Let()

    assert repr(Let(a=T.a.b)) == 'Let(a=T.a.b)'
コード例 #8
0
def _parse_api_response(resp_json):
    """Parse the json returned by the alerts API and extract relevant bits."""

    service_subspec = {
        'ServiceType': 'ServiceType',
        'ServiceTypeDescription': 'ServiceTypeDescription',
        'ServiceName': 'ServiceName',
        'ServiceId': 'ServiceId'
    }

    spec = (
        'CTAAlerts.Alert',
        [

            # for each entry in CTAAlerts.Alert pull out the following info
            {
                'AlertId': ('AlertId', int),
                'ShortDescription':
                'ShortDescription',
                'FullDescription':
                'FullDescription.#cdata-section',
                'Impact':
                'Impact',
                'SeverityScore': ('SeverityScore', int),
                'LastSeen':
                Literal(pytz.UTC.localize(dt.datetime.utcnow()).isoformat()),
                'EventStart':
                Coalesce(('EventStart', _chicago_to_utc), default=None),
                'EventEnd':
                Coalesce(('EventEnd', _chicago_to_utc), default=None),

                # pull out each entry in ImpactedService if there are multiple
                'ImpactedService': (
                    'ImpactedService.Service',
                    # some chicanery to make sure this entry is always a
                    # list even though the API just returns a nested dict
                    # when there's only one service
                    lambda s: glom(s, [service_subspec])
                    if isinstance(s, list) else [glom(s, service_subspec)])
            }
        ])

    return glom(resp_json, spec)
コード例 #9
0
ファイル: config.py プロジェクト: kirank0220/api-examples
    "Vendor Contact Email": "third_party_contact_email",
    "Vendor Contact Phone": "third_party_contact_phone",
    # Assessment Order Info
    "Order Assessment Tier": "assessment_order",
}

# Better change of mapping to column headers
HEADER_MAPPING.update({k.lower().strip(): v for k, v in HEADER_MAPPING.items()})
HEADER_MAPPING.update({k.upper().strip(): v for k, v in HEADER_MAPPING.items()})
HEADER_MAPPING.update({re.sub(r"[^0-9a-zA-Z ]+", "", k): v for k, v in HEADER_MAPPING.items()})
HEADER_MAPPING.update({k.replace(" ", "_"): v for k, v in HEADER_MAPPING.items()})
HEADER_MAPPING.update({k.replace(" ", ""): v for k, v in HEADER_MAPPING.items()})

COMPANY_SCHEMA = {
    "name": "name",
    "subscription_status": Literal(None),
    "address": {"city": Literal("Denver"), "country": Literal("USA"),},
    # Map the assessment order column to a valid order request, skip this field if it is not present or invalid
    "order_info": Coalesce(("assessment_order", valid_assessment_order), default=OMIT),
    "third_party_contact": (
        {
            # Prefer the first and last name from the spread sheet, fallback to using the email address
            "first_name": (
                Coalesce(
                    ("third_party_contact_first_name", required),
                    ("third_party_contact_name", split(False), required),
                    ("third_party_contact_email", email_metadata("first_name")),
                    default=OMIT,
                ),
                skip_falsy,
            ),