Skip to content

Commit

Permalink
Merge pull request #5 from jdcasey/master
Browse files Browse the repository at this point in the history
more tests! and some minor fixes in repo.py
  • Loading branch information
jdcasey committed Mar 2, 2017
2 parents b81c2b9 + a847485 commit 3e95a08
Show file tree
Hide file tree
Showing 14 changed files with 461 additions and 88 deletions.
83 changes: 51 additions & 32 deletions nexup/repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,21 @@ def push_zip(session, repo_key, zip_file, delete_first=False):
delete_param = '?delete=true'

url = COMPRESSED_CONTENT_PATH.format(key=repo_key, delete=delete_param)
session.post(url, f)
if session.debug is True:
print "POSTing: %s" % url
session.post(url, f, expect_status=201)

def repo_exists(session, repo_key):
return session.exists( NAMED_REPO_PATH.format(key=repo_key) )

def load(session, key, ignore_missing=True):
response, xml = session.get(NAMED_REPO_PATH.format(key=key), ignore_404=ignore_missing)
if ignore_missing and response.status == 404:
if ignore_missing and response.status_code == 404:
return None

doc = objectify.fromstring(xml)
return Repository(doc.data.id, doc.data.name)._set_xml_obj(doc)
# return Repository(doc.data.id, doc.data.name)._set_xml_obj(doc)
return Repository(doc)

def load_all(session, name_pattern=None):
response, xml = session.get(REPOS_PATH)
Expand All @@ -72,7 +75,7 @@ def load_all(session, name_pattern=None):
if name_re is not None:
match = name_re.match(name)

if match is not None:
if name_re is None or match is not None:
rid=child.xpath('id/text()')
if len(rid) < 1:
if session.debug is True:
Expand All @@ -87,7 +90,8 @@ def load_all(session, name_pattern=None):
child = r

doc = objectify.fromstring(etree.tostring(child))
repos.append(Repository(rid, name)._set_xml_obj(doc))
# repos.append(Repository(rid, name)._set_xml_obj(doc))
repos.append(Repository(doc))

if session.debug is True:
print "+ %s" % name
Expand All @@ -111,23 +115,35 @@ class Repository(object):
methods for accessing repository configuration without knowing all of the xml
structure.
"""
def __init__(self, key, name):
self.new = True
self.xml = objectify.Element('repository')
self.data = etree.SubElement(self.xml, 'data')
self.data.id=key
self.data.name=name
self.data.repoType = 'hosted'
self.data.writePolicy = WRITE_POLICIES.read_write
self.data.exposed = 'true'
self.data.browseable = 'true'
self.data.indexable = 'true'
self.data.downloadRemoteIndexes = 'false'
self.data.provider = 'maven2'
self.data.format = 'maven2'
self.data.providerRole='org.sonatype.nexus.proxy.repository.Repository'
self.data.checksumPolicy = CHECKSUM_POLICIES.warn
self.data.repoPolicy = REPO_POLICIES.release
def __init__(self, key_or_doc, name=None):
if type(key_or_doc) is objectify.ObjectifiedElement:
self.new=False
self._set_xml_obj(key_or_doc)
elif name is None:
raise Exception('Invalid new repository; must supply key AND name (name is missing)')
else:
self.new = True
self.xml = objectify.Element('repository')
self.data = etree.SubElement(self.xml, 'data')
self.data.id=key_or_doc
self.data.name=name
self.data.repoType = 'hosted'
self.data.writePolicy = WRITE_POLICIES.read_write
self.data.exposed = 'true'
self.data.browseable = 'true'
self.data.indexable = 'true'
self.data.downloadRemoteIndexes = 'false'
self.data.provider = 'maven2'
self.data.format = 'maven2'
self.data.providerRole='org.sonatype.nexus.proxy.repository.Repository'
self.data.checksumPolicy = CHECKSUM_POLICIES.warn
self.data.repoPolicy = REPO_POLICIES.release

def __str__(self):
return "Repository: %s" % self.data.id

def __repr__(self):
return self.__str__();

def _set_xml_string(self, xml):
self.xml = objectify.fromstring(xml)
Expand All @@ -146,7 +162,7 @@ def _set_xml_obj(self, xml_obj):
return self

def set_hosted(self, storage_location=None):
self.data.repoType = 'hosted'
self.data.repoType = REPO_TYPES.hosted

if hasattr(self.data, 'remoteStorage'):
self.data.remove(self.data.remoteStorage)
Expand All @@ -161,32 +177,34 @@ def set_hosted(self, storage_location=None):
return self

def set_remote(self, url):
if hasattr(self.data, 'remoteStorage'):
self.data.remove(self.data.remoteStorage)

self.set('remoteStorage/remoteStorageUrl', url)
self.data.repoType = 'remote'
self.data.repoType = REPO_TYPES.remote

if hasattr(self.data, 'writePolicy'):
self.data.remove(self.data.writePolicy)

self.data.downloadRemoteIndexes = 'true'
if hasattr(self.data, 'overrideLocalStorageUrl'):
self.data.remove(self.data.overrideLocalStorageUrl)

return self

def set_exposed(self, exposed):
exposed = nexus_boolean(exposed)
# exposed = nexus_boolean(exposed)
self.data.exposed = exposed
return self

def set_browseable(self, browse):
browse = nexus_boolean(browse)
# browse = nexus_boolean(browse)
self.data.browseable = browse
return self

def set_indexable(self, index):
index = nexus_boolean(index)
# index = nexus_boolean(index)
self.data.indexable = index
return self

def set_download_remote_indexes(self, download):
download = self._get_nexus_boolean(download)
# download = nexus_boolean(download)
self.data.downloadRemoteIndexes = download
return self

Expand Down Expand Up @@ -234,6 +252,7 @@ def set(self, path, value=None):

def render(self, pretty_print=True):
objectify.deannotate(self.xml, xsi_nil=True)
etree.cleanup_namespaces(self.xml)
return etree.tostring(self.xml, pretty_print=pretty_print)

def content_uri(self):
Expand Down
90 changes: 90 additions & 0 deletions test-input/all-repos.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<repositories>
<data>
<repositories-item>
<resourceURI>http://localhost:8081/nexus/service/local/repositories/snapshots</resourceURI>
<contentResourceURI>http://localhost:8081/nexus/content/repositories/snapshots</contentResourceURI>
<id>snapshots</id>
<name>Snapshots</name>
<repoType>hosted</repoType>
<repoPolicy>SNAPSHOT</repoPolicy>
<provider>maven2</provider>
<providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
<format>maven2</format>
<userManaged>true</userManaged>
<exposed>true</exposed>
<effectiveLocalStorageUrl>file:/sonatype-work/storage/snapshots</effectiveLocalStorageUrl>
</repositories-item>
<repositories-item>
<resourceURI>http://localhost:8081/nexus/service/local/repositories/central</resourceURI>
<contentResourceURI>http://localhost:8081/nexus/content/repositories/central</contentResourceURI>
<id>central</id>
<name>Central</name>
<repoType>proxy</repoType>
<repoPolicy>RELEASE</repoPolicy>
<provider>maven2</provider>
<providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
<format>maven2</format>
<userManaged>true</userManaged>
<exposed>true</exposed>
<effectiveLocalStorageUrl>file:/sonatype-work/storage/central</effectiveLocalStorageUrl>
<remoteUri>https://repo1.maven.org/maven2/</remoteUri>
</repositories-item>
<repositories-item>
<resourceURI>http://localhost:8081/nexus/service/local/repositories/apache-snapshots</resourceURI>
<contentResourceURI>http://localhost:8081/nexus/content/repositories/apache-snapshots</contentResourceURI>
<id>apache-snapshots</id>
<name>Apache Snapshots</name>
<repoType>proxy</repoType>
<repoPolicy>SNAPSHOT</repoPolicy>
<provider>maven2</provider>
<providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
<format>maven2</format>
<userManaged>true</userManaged>
<exposed>true</exposed>
<effectiveLocalStorageUrl>file:/sonatype-work/storage/apache-snapshots</effectiveLocalStorageUrl>
<remoteUri>https://repository.apache.org/snapshots/</remoteUri>
</repositories-item>
<repositories-item>
<resourceURI>http://localhost:8081/nexus/service/local/repositories/central-m1</resourceURI>
<contentResourceURI>http://localhost:8081/nexus/content/shadows/central-m1</contentResourceURI>
<id>central-m1</id>
<name>Central M1 shadow</name>
<repoType>virtual</repoType>
<repoPolicy>RELEASE</repoPolicy>
<provider>m2-m1-shadow</provider>
<providerRole>org.sonatype.nexus.proxy.repository.ShadowRepository</providerRole>
<format>maven1</format>
<userManaged>true</userManaged>
<exposed>true</exposed>
<effectiveLocalStorageUrl>file:/sonatype-work/storage/central-m1</effectiveLocalStorageUrl>
</repositories-item>
<repositories-item>
<resourceURI>http://localhost:8081/nexus/service/local/repositories/thirdparty</resourceURI>
<contentResourceURI>http://localhost:8081/nexus/content/repositories/thirdparty</contentResourceURI>
<id>thirdparty</id>
<name>3rd party</name>
<repoType>hosted</repoType>
<repoPolicy>RELEASE</repoPolicy>
<provider>maven2</provider>
<providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
<format>maven2</format>
<userManaged>true</userManaged>
<exposed>true</exposed>
<effectiveLocalStorageUrl>file:/sonatype-work/storage/thirdparty</effectiveLocalStorageUrl>
</repositories-item>
<repositories-item>
<resourceURI>http://localhost:8081/nexus/service/local/repositories/releases</resourceURI>
<contentResourceURI>http://localhost:8081/nexus/content/repositories/releases</contentResourceURI>
<id>releases</id>
<name>Releases</name>
<repoType>hosted</repoType>
<repoPolicy>RELEASE</repoPolicy>
<provider>maven2</provider>
<providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
<format>maven2</format>
<userManaged>true</userManaged>
<exposed>true</exposed>
<effectiveLocalStorageUrl>file:/sonatype-work/storage/releases</effectiveLocalStorageUrl>
</repositories-item>
</data>
</repositories>
28 changes: 28 additions & 0 deletions test-input/central-repo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<repository>
<data>
<contentResourceURI>http://localhost:8081/nexus/content/repositories/central</contentResourceURI>
<id>central</id>
<name>Central</name>
<provider>maven2</provider>
<providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
<format>maven2</format>
<repoType>proxy</repoType>
<exposed>true</exposed>
<writePolicy>READ_ONLY</writePolicy>
<browseable>true</browseable>
<indexable>true</indexable>
<notFoundCacheTTL>1440</notFoundCacheTTL>
<repoPolicy>RELEASE</repoPolicy>
<checksumPolicy>WARN</checksumPolicy>
<downloadRemoteIndexes>false</downloadRemoteIndexes>
<defaultLocalStorageUrl>file:/sonatype-work/storage/central</defaultLocalStorageUrl>
<remoteStorage>
<remoteStorageUrl>https://repo1.maven.org/maven2/</remoteStorageUrl>
</remoteStorage>
<fileTypeValidation>true</fileTypeValidation>
<artifactMaxAge>-1</artifactMaxAge>
<metadataMaxAge>1440</metadataMaxAge>
<itemMaxAge>1440</itemMaxAge>
<autoBlockActive>true</autoBlockActive>
</data>
</repository>
36 changes: 36 additions & 0 deletions tests/base.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
import nexup
import traceback
import os
import tempfile
import shutil
import unittest
import yaml
from nexup import config
import zipfile
from random import randint


WORDS = ['/usr/share/dict/words', '/usr/dict/words']

TEST_BASEURL='http://localhost:8080/nexus'
TEST_INPUT_DIR='test-input'

class NexupBaseTest(unittest.TestCase):
"""
Creates config files, configures the environment, and cleans up afterwards.
Expand Down Expand Up @@ -39,6 +47,29 @@ def load_words(self):
with open(w) as f:
self.words.extend([line.rstrip() for line in f.readlines()])

def write_zip(self, src_zip, paths, content=None):
zf = zipfile.ZipFile(src_zip, mode='w')
for path in paths:
if content is None:
content = ''
for i in range(randint(1,10)):
content += self.words[randint(1,len(self.words))]
content += ' '
zf.writestr(path, content)
zf.close()

def write_dir(self, srcdir, paths, content=None):
for fname in paths:
path = os.path.join(srcdir, fname)
os.makedirs(os.path.dirname(path))
with open(path, 'w') as f:
if content is None:
for i in range(randint(1,10)):
f.write(self.words[randint(1,len(self.words))])
f.write(' ')
else:
f.write(content)

def write_config(self, conf):
"""
Create an empty file in the temporary directory, return the full path.
Expand All @@ -59,3 +90,8 @@ def write_config(self, conf):

return fpath

def create_and_load_conf(self, conf={'test':{nexup.config.URL: TEST_BASEURL}}):
fpath = self.write_config(conf)
return nexup.config.load('test')


16 changes: 2 additions & 14 deletions tests/test_archive_dir.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,11 @@
from base import NexupBaseTest
from nexup import archive
from base import NexupBaseTest
import tempfile
import os
from random import randint
import zipfile

class ArchiveTest(NexupBaseTest):

def write_dir(self, srcdir, paths, content=None):
for fname in paths:
path = os.path.join(srcdir, fname)
os.makedirs(os.path.dirname(path))
with open(path, 'w') as f:
if content is None:
for i in range(randint(1,10)):
f.write(self.words[randint(1,len(self.words))])
f.write(' ')
else:
f.write(content)
class ArchiveZipest(NexupBaseTest):

def test_small(self):
self.load_words()
Expand Down
15 changes: 2 additions & 13 deletions tests/test_archive_zip.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,11 @@
from base import NexupBaseTest
from nexup import archive
from base import NexupBaseTest
import tempfile
import os
from random import randint
import zipfile

class ArchiveTest(NexupBaseTest):

def write_zip(self, src_zip, paths, content=None):
zf = zipfile.ZipFile(src_zip, mode='w')
for path in paths:
if content is None:
content = ''
for i in range(randint(1,10)):
content += self.words[randint(1,len(self.words))]
content += ' '
zf.writestr(path, content)
zf.close()
class ArchiveZipest(NexupBaseTest):

def test_small(self):
self.load_words()
Expand Down
Loading

0 comments on commit 3e95a08

Please sign in to comment.