Esempio n. 1
0
    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls)

        # Make really sure that properties and annotations exist before
        # any object methods get invoked. This is important because the
        # dot operator magic methods have been overridden and depend on
        # properties and annotations existing.
        obj.__dict__['properties'] = DictObject()
        obj.__dict__['annotations'] = DictObject()
        return obj
Esempio n. 2
0
def test_DictObject():
    """Test creation and property access on DictObjects"""
    d = DictObject({'args_working?': 'yes'}, a=123, b='foobar', nerds=['chris', 'jen', 'janey'])
    assert_equals(d.a, 123)
    assert_equals(d['a'], 123)
    assert_equals(d.b, 'foobar')
    assert_equals(d['b'], 'foobar')
    assert_equals(d.nerds, ['chris', 'jen', 'janey'])
    assert_true(hasattr(d, 'nerds'))
    assert_equals(d['nerds'], ['chris', 'jen', 'janey'])
    assert_false(hasattr(d, 'qwerqwer'))

    assert_true(all([key in d.keys() for key in ['args_working?', 'a', 'b', 'nerds']]))
    d.new_key = 'new value!'
    assert_equals(d['new_key'], 'new value!')
def test_DictObject():
    """Test creation and property access on DictObjects"""
    d = DictObject({"args_working?": "yes"}, a=123, b="foobar", nerds=["chris", "jen", "janey"])
    assert d.a == 123
    assert d["a"] == 123
    assert d.b == "foobar"
    assert d["b"] == "foobar"
    assert d.nerds == ["chris", "jen", "janey"]
    assert d["nerds"] == ["chris", "jen", "janey"]

    print d.keys()
    assert all([key in d.keys() for key in ["args_working?", "a", "b", "nerds"]])
    print d
    d.new_key = "new value!"
    assert d["new_key"] == "new value!"
def test_findEntityIdByNameAndParent__404_error_no_result():
    entity_name = "Kappa 123"
    fake_response = DictObject({"status_code": 404})
    with patch.object(syn,
                      "restPOST",
                      side_effect=SynapseHTTPError(response=fake_response)):
        assert_is_none(syn.findEntityId(entity_name))
def create_challenge_object(project, participants_team):
    challenge_json = {
        'participantTeamId': utils.id_of(participants_team),
        'projectId': utils.id_of(project)
    }
    return DictObject(
        **syn.restPOST("/challenge", body=json.dumps(challenge_json)))
def test_DictObject():
    """Test creation and property access on DictObjects"""
    d = DictObject({'args_working?':'yes'}, a=123, b='foobar', nerds=['chris','jen','janey'])
    assert d.a==123
    assert d['a']==123
    assert d.b=='foobar'
    assert d['b']=='foobar'
    assert d.nerds==['chris','jen','janey']
    assert hasattr(d,'nerds')
    assert d['nerds']==['chris','jen','janey']
    assert not hasattr(d,'qwerqwer')

    print(d.keys())
    assert all([key in d.keys() for key in ['args_working?', 'a', 'b', 'nerds']])
    print(d)
    d.new_key = 'new value!'
    assert d['new_key'] == 'new value!'
def test_findEntityIdByNameAndParent__404_error_no_result():
    entity_name = "Kappa 123"
    expected_uri = "/entity/child"
    expected_body = json.dumps({"parentId": None, "entityName": entity_name})
    fake_response = DictObject({"status_code": 404})
    with patch.object(syn,
                      "restPOST",
                      side_effect=SynapseHTTPError(
                          response=fake_response)) as mocked_POST:
        assert_is_none(syn._findEntityIdByNameAndParent(entity_name))
def test_DictObject():
    """Test creation and property access on DictObjects"""
    d = DictObject({'args_working?': 'yes'},
                   a=123,
                   b='foobar',
                   nerds=['chris', 'jen', 'janey'])
    assert d.a == 123
    assert d['a'] == 123
    assert d.b == 'foobar'
    assert d['b'] == 'foobar'
    assert d.nerds == ['chris', 'jen', 'janey']
    assert hasattr(d, 'nerds')
    assert d['nerds'] == ['chris', 'jen', 'janey']
    assert not hasattr(d, 'qwerqwer')

    assert all(
        [key in d.keys() for key in ['args_working?', 'a', 'b', 'nerds']])
    d.new_key = 'new value!'
    assert d['new_key'] == 'new value!'
Esempio n. 9
0
    def _update_file_handle(self, file_handle_update_dict=None):
        """
        Sets the file handle
        
        Should not need to be called by users
        """

        #replace the file handle dict
        fh_dict = DictObject(
            file_handle_update_dict
        ) if file_handle_update_dict is not None else DictObject()
        self.__dict__['_file_handle'] = fh_dict

        if file_handle_update_dict is not None and file_handle_update_dict.get('concreteType') == "org.sagebionetworks.repo.model.file.ExternalFileHandle"\
                and utils.urlparse(file_handle_update_dict.get('externalURL')).scheme != 'sftp':
            self.__dict__['synapseStore'] = False

        #initialize all nonexistent keys to have value of None
        for key in self.__class__._file_handle_keys:
            if key not in fh_dict:
                fh_dict[key] = None
Esempio n. 10
0
def split_entity_namespaces(entity):
    """
    Given a plain dictionary or an Entity object,
    splits the object into properties, annotations and local state.
    A dictionary will be processed as a specific type of Entity
    if it has a valid 'concreteType' field,
    otherwise it is treated as a generic Entity.

    :returns: a 3-tuple (properties, annotations, local_state).
    """
    if isinstance(entity, Entity):
        # Defensive programming: return copies
        return (entity.properties.copy(), entity.annotations.copy(),
                entity.local_state())

    if not isinstance(entity, collections.Mapping):
        raise SynapseMalformedEntityError("Can't split a %s object." %
                                          entity.__class__.__name__)

    if 'concreteType' in entity and entity[
            'concreteType'] in _entity_type_to_class:
        entity_class = _entity_type_to_class[entity['concreteType']]
    else:
        entity_class = Entity

    properties = DictObject()
    annotations = DictObject()
    local_state = DictObject()

    property_keys = entity_class._property_keys
    local_keys = entity_class._local_keys
    for key, value in six.iteritems(entity):
        if key in property_keys:
            properties[key] = value
        elif key in local_keys:
            local_state[key] = value
        else:
            annotations[key] = value

    return (properties, annotations, local_state)
Esempio n. 11
0
 def __setitem__(self, key, value):
     if key in self.__dict__:
         # If we assign like so:
         #   entity.annotations = {'foo';123, 'bar':'bat'}
         # Wrap the dictionary in a DictObject so we can
         # later do:
         #   entity.annotations.foo = 'bar'
         if (key=='annotations' or key=='properties') and not isinstance(value, DictObject):
             value = DictObject(value)
         self.__dict__[key] = value
     elif key in self.__class__._property_keys:
         self.properties[key] = value
     else:
         self.annotations[key] = value
Esempio n. 12
0
def test_raise_for_status():
    class FakeResponse(DictObject):
        def json(self):
            return self._json

    response = FakeResponse(
        status_code=501,
        headers={"content-type": "application/json;charset=utf-8"},
        reason="SchlumpError",
        text='{"reason":"it schlumped"}',
        _json={"reason": "it schlumped"},
        request=DictObject(url="http://foo.com/bar/bat",
                           headers={"xyz": "pdq"},
                           method="PUT",
                           body="body"))

    assert_raises(SynapseHTTPError, _raise_for_status, response, verbose=False)
def test_upload_chunk__expired_url():
    upload_parts = [{
        'uploadPresignedUrl': 'https://www.fake.url/fake/news',
        'partNumber': 420
    }, {
        'uploadPresignedUrl': 'https://www.google.com',
        'partNumber': 421
    }, {
        'uploadPresignedUrl': 'https://rito.pls/',
        'partNumber': 422
    }, {
        'uploadPresignedUrl': 'https://never.lucky.gg',
        'partNumber': 423
    }]

    with patch.object(multipart_upload, "_put_chunk",
                      side_effect=SynapseHTTPError("useless message",response=MagicMock(status_code=403))) as mocked_put_chunk, \
                      patch.object(warnings, "warn") as mocked_warn, \
                      patch.object(multipart_upload, '_start_multipart_upload',
                        return_value=DictObject({'partsState': '0', 'uploadId': '1', 'state': 'COMPLETED', 'resultFileHandleId': '1'})), \
                      patch.object(multipart_upload, "_get_presigned_urls", return_value=upload_parts):

        file_size = 1 * MB
        filepath = make_bogus_binary_file(n=file_size)

        try:
            multipart_upload.multipart_upload(syn, filepath)
        finally:
            if os.path.isfile(filepath):
                os.remove(filepath)

        mocked_warn.assert_called_with(
            'The pre-signed upload URL has expired. Restarting upload...\n')

        # 4 URLs, 7 retries.
        assert mocked_warn.call_count == 28

        # assert _put_chunk was called at least once
        assert_greater_equal(len(mocked_put_chunk.call_args_list), 1)
 def foo(x, y):
     """docstring of foo"""
     if x + y < 0:
         raise Exception('Foobar exception!')
     return DictObject(status_code=200, text=(x + y))