def encrypt(self, repo_slug, value): """Encrypt value using a repository's public key.""" key = RSA.importKey(self.repo_key(repo_slug)) cipher = PKCS1_v1_5.new(key) return base64.b64encode(cipher.encrypt(value)) try: res = self.v3client.get('{}/repo/{}/key'.format(V3URI, repo_slug)) return get_response_contents(res) except Exception as e: res = self.v3client.post('{}/repo/{}/key'.format(V3URI, repo_slug)) return get_response_contents(res)
def find_one3(cls, session, entity_id, **kwargs): from travispy.entities import COMMAND_TO_ENTITY command = cls.one() #print(command) #print(**kwargs) #print(entity_id) #print(cls) response = session.get( session.uri + cls._find_one_command(command, str(entity_id), **kwargs)) #print("contents",response.json()) contents = get_response_contents(response) #print("step1",contents) result = cls._load(contents, session)[0] #print("step2",result) for name in contents.keys(): #print(name) # Unknown entity. if name not in COMMAND_TO_ENTITY: continue entity_class = COMMAND_TO_ENTITY[name] #print(entity_class) dependency = entity_class._load(contents[name], session) if name == entity_class.one(): dependency = dependency[0] setattr(result, name, dependency) result._data[name] = dependency return result
def test_get_response_contents(): response = Response() response.status_code = 111 response._content = b'foo' with pytest.raises(TravisError) as exception_info: get_response_contents(response) assert str(exception_info.value) == '[111] foo' response._content = '' with pytest.raises(TravisError) as exception_info: get_response_contents(response) assert str(exception_info.value) == textwrap.dedent(''' [111] Unexpected error Possible reasons are: - Communication with Travis CI has failed. - Insufficient permissions. - Invalid contents returned. ''')[1:] response._content = b'{"error": "foo"}' with pytest.raises(TravisError) as exception_info: get_response_contents(response) assert str(exception_info.value) == '[111] foo' response.status_code = 200 assert get_response_contents(response) == {'error': 'foo'}
def cron_enable(self, repo_slug, branch, interval='weekly', dont_run_if_recent_build_exists=True): """Enable cron for specific branc on a repository.""" repo_id = self.repo(repo_slug).id endpoint = '{}/repo/{}/branch/{}/cron'.format(V3URI, repo_id, branch) res = self.v3client.post(endpoint, json={ 'interval': interval, 'dont_run_if_recent_build_exists': True, }) return get_response_contents(res)
def find_many(cls, session, **kwargs): ''' Method responsible for returning as many as possible matches for current class. :type session: :class:`.Session` :param session: Session that must be used to search for results. :rtype: list(:class:`.Entity`) :raises TravisError: when response has status code different than 200. ''' from travispy.entities import COMMAND_TO_ENTITY count = 0 for param in cls._FIND_MANY_EXCLUSIVE_PARAMETERS: if param in kwargs: count += 1 if count != 1 and len(cls._FIND_MANY_EXCLUSIVE_PARAMETERS) > 0: exclusive_parameters = '", "'.join( cls._FIND_MANY_EXCLUSIVE_PARAMETERS) raise RuntimeError('You have to supply either "%s".' % exclusive_parameters) command = cls.many() response = session.get(session.uri + '/%s' % command, params=kwargs) dependencies_result = {} contents = get_response_contents(response) # Retrieving information from Travis and loading into respective classes. infos = contents.pop(command, []) result = cls._load(infos, session) for name in contents.keys(): #print("DEBUG",name) if name in COMMAND_TO_ENTITY: entity_class = COMMAND_TO_ENTITY[name] dependencies_result[entity_class.one()] = \ entity_class._load(contents[name], session) # Injecting dependencies into main objects. for i, entity in enumerate(result): for dependency_name, dependencies in dependencies_result.items(): setattr(entity, dependency_name, dependencies[i]) result._data[dependency_name] = dependencies[i] return result
def find_one2(cls, session, entity_id, **kwargs): ''' Method responsible for returning exactly one instance of current class. :type session: :class:`.Session` :param session: Session that must be used to search for result. :param int entity_id: The ID of the entity. :rtype: :class:`.Entity` :raises TravisError: when response has status code different than 200. ''' from travispy.entities import COMMAND_TO_ENTITY command = cls.one() print(command) print(**kwargs) print(entity_id) print(cls) response = session.get(session.uri + cls._find_one_command2(command, **kwargs)) print(response) print(response.json()) contents = get_response_contents(response) #if command not in contents: # return #info = contents.pop(command, {}) result = cls._load(contents, session)[0] for name in contents.keys(): # Unknown entity. if name not in COMMAND_TO_ENTITY: continue entity_class = COMMAND_TO_ENTITY[name] dependency = entity_class._load(contents[name], session) if name == entity_class.one(): dependency = dependency[0] setattr(result, name, dependency) result._data[name] = dependency #result. return result
def find_one(cls, session, entity_id, **kwargs): ''' Method responsible for returning exactly one instance of current class. :type session: :class:`.Session` :param session: Session that must be used to search for result. :param int entity_id: The ID of the entity. :rtype: :class:`.Entity` :raises TravisError: when response has status code different than 200. ''' from travispy.entities import COMMAND_TO_ENTITY command = cls.one() response = session.get( session.uri + cls._find_one_command(cls.many(), str(entity_id), **kwargs) ) contents = get_response_contents(response) if command not in contents: return info = contents.pop(command, {}) result = cls._load(info, session)[0] for name in contents.keys(): # Unknown entity. if name not in COMMAND_TO_ENTITY: continue entity_class = COMMAND_TO_ENTITY[name] dependency = entity_class._load(contents[name], session) if name == entity_class.one(): dependency = dependency[0] setattr(result, name, dependency) return result
def find_many(cls, session, **kwargs): ''' Method responsible for returning as many as possible matches for current class. :type session: :class:`.Session` :param session: Session that must be used to search for results. :rtype: list(:class:`.Entity`) :raises TravisError: when response has status code different than 200. ''' from travispy.entities import COMMAND_TO_ENTITY count = 0 for param in cls._FIND_MANY_EXCLUSIVE_PARAMETERS: if param in kwargs: count += 1 if count != 1 and len(cls._FIND_MANY_EXCLUSIVE_PARAMETERS) > 0: exclusive_parameters = '", "'.join(cls._FIND_MANY_EXCLUSIVE_PARAMETERS) raise RuntimeError('You have to supply either "%s".' % exclusive_parameters) command = cls.many() response = session.get(session.uri + '/%s' % command, params=kwargs) dependencies_result = {} contents = get_response_contents(response) # Retrieving information from Travis and loading into respective classes. infos = contents.pop(command, []) result = cls._load(infos, session) for name in contents.keys(): entity_class = COMMAND_TO_ENTITY[name] dependencies_result[entity_class.one()] = \ entity_class._load(contents[name], session) # Injecting dependencies into main objects. for i, entity in enumerate(result): for dependency_name, dependencies in dependencies_result.items(): setattr(entity, dependency_name, dependencies[i]) return result
def crons(self, repo_slug): """List enabled crons.""" repo_id = self.repo(repo_slug).id res = self.v3client.get('{}/repo/{}/crons'.format(V3URI, repo_id)) return (AttrDict(c) for c in get_response_contents(res)['crons'])