def test_version_invalid_values(self): self.assertRaises(ValueError, Version, '-0') self.assertRaises(ValueError, Version, '0.a') self.assertRaises(ValueError, Version('1.0').__eq__, None) self.assertRaises(ValueError, Version('1.0').__eq__, 5) self.assertRaises(ValueError, Version('1.0').__eq__, {})
def test_version_le(self): self.assertLessEqual(Version('1'), '1') self.assertLessEqual(Version('1'), '1.0.0') self.assertLessEqual(Version('1'), Version('1.0.0')) self.assertLessEqual(Version('1'), '1.1') self.assertLessEqual(Version('1'), Version('1.1')) self.assertFalse(Version('1') <= '0.9') self.assertFalse(Version('1') <= Version('0.9'))
def test_version_ne(self): self.assertNotEqual(Version('1'), '1.1') self.assertNotEqual(Version('1'), Version('1.1')) self.assertNotEqual(Version('1'), '0.9') self.assertNotEqual(Version('1'), Version('0.9')) self.assertFalse(Version('1') != '1.0') self.assertFalse(Version('1') != Version('1'))
def test_version_ge(self): self.assertGreaterEqual(Version('1'), '1.0.0') self.assertGreaterEqual(Version('1'), Version('1.0.0')) self.assertGreaterEqual(Version('1'), '0.9') self.assertGreaterEqual(Version('1'), Version('0.9')) self.assertFalse(Version('1') >= '1.1') self.assertFalse(Version('1') >= Version('1.1'))
def get_latest_resource_version(name, vendor): resources = CatalogueResource.objects.filter(vendor=vendor, short_name=name) if resources.count() > 0: newest_version = Version(resources[0].version) newest_resource = resources[0] for resource in resources[1:]: current_version = Version(resource.version) if current_version > newest_version: newest_version = current_version newest_resource = resource return newest_resource return None
def read(self, request, vendor, name, version): from_version = request.GET.get('from') if from_version is not None: try: from_version = Version(from_version) except: return build_error_response( request, 422, _("Missing parameter: template_uri or file")) resource = get_object_or_404(CatalogueResource, vendor=vendor, short_name=name, version=version) resource_info = resource.get_processed_info(process_urls=False) if resource_info['changelog'] == '': raise Http404 doc_relative_path = url2pathname(resource_info['changelog']) doc_base_url = force_trailing_slash( urljoin(resource.get_template_url(request=request, for_base=True), pathname2url(os.path.dirname(doc_relative_path)))) doc_path = os.path.join( catalogue_utils.wgt_deployer.get_base_dir(vendor, name, version), doc_relative_path) (doc_filename_root, doc_filename_ext) = os.path.splitext(doc_path) localized_doc_path = doc_filename_root + '.' + get_language( ) + doc_filename_ext try: doc_code = download_local_file(localized_doc_path).decode('utf-8') except: try: doc_code = download_local_file(doc_path).decode('utf-8') except: msg = _('Error opening the changelog file') doc_code = '<div class="margin-top: 10px"><p>%s</p></div>' % msg doc_pre_html = markdown.markdown(doc_code, output_format='xhtml5', extensions=[ 'markdown.extensions.codehilite', 'markdown.extensions.fenced_code' ]) if from_version: doc_pre_html = filter_changelog(doc_pre_html, from_version) if doc_pre_html.strip() == '': raise Http404 doc = clean_html(doc_pre_html, base_url=doc_base_url) return HttpResponse( doc, content_type='application/xhtml+xml; charset=UTF-8')
def filter_changelog(code, from_version): parser = XHTMLParser() doc = fragment_fromstring(code, create_parent=True, parser=parser) parentelement = None for header in doc.xpath('/div/h1|/div/h2|/div/h3'): title = header.text[1:] if header.text.startswith('v') else header.text try: version = Version(VERSION_HEADER_RE.split(title, 1)[0]) except: continue parentelement = header.getparent() headerelement = header.tag for elem in header.itersiblings(preceding=True): elem.tail = "" elem.drop_tree() break if parentelement is not None: for header in parentelement.xpath(headerelement): title = header.text[1:] if header.text.startswith( 'v') else header.text try: version = Version(VERSION_HEADER_RE.split(title, 1)[0]) except: continue if version <= from_version: for elem in header.itersiblings(): elem.drop_tree() header.tail = "" header.drop_tree() break return (doc.text or '') + ''.join([ etree.tostring(child, method='xml').decode('utf-8') for child in doc.iterchildren() ])
def buildVersionSortable(version, length=5): code = 0 ver = Version(version) code += ver.version[0] * 1000 * 1000 code += ver.version[1] * 1000 if len(ver.version) > 1 else 0 code += ver.version[2] if len(ver.version) > 2 else 0 # Prerelease prerelease = ver.prerelease if prerelease is None: code += .999 elif prerelease[0] == "a": code += prerelease[1] / 1000 elif prerelease[0] == "b": code += (100 + prerelease[1]) / 1000 else: # prerelease[0:1] == "rc" code += (200 + prerelease[1]) / 1000 return code
def order_by_version(searcher, docnum): return Version(searcher.stored_fields(docnum)['version'], reverse=True)
def test_filter_changelog(self): initial_code = '<h1>1.0.2</h1><p>1.0.2 change list</p><h1>1.0.1</h1><p>1.0.1 change list</p><h1>1.0.0</h1><p>Initial release</p>' expected_code = '<h1>1.0.2</h1><p>1.0.2 change list</p>' self.assertEqual(filter_changelog(initial_code, Version('1.0.1')), expected_code)
def test_version_order(self): self.assertLess(Version('1.0'), Version('1.11a1')) self.assertLess(Version('1.11a1'), Version('1.11a2')) self.assertLess(Version('1.11a2'), Version('1.11b1')) self.assertLess(Version('1.11b1'), Version('1.11rc1')) self.assertLess(Version('1.11rc1'), Version('1.11')) self.assertLess(Version('1.11'), Version('1.11.5.1')) self.assertLess(Version('1.11.5.1'), Version('1.11.5.4')) self.assertLess(Version('1.11.5.4'), Version('1.100')) self.assertLess(Version('1.0.0-dev'), Version("1.0.1-dev")) self.assertLess(Version('1.0.0-dev'), Version("1.0.0")) self.assertGreater(Version('1.0'), Version('1.0a1')) self.assertGreater(Version('1.0', reverse=True), Version('1.11a1', reverse=True)) self.assertGreater(Version('1.11b1', reverse=True), Version('1.11rc1', reverse=True)) self.assertGreater(Version('1.0.0'), Version("1.0.0-dev")) self.assertEqual(Version('1'), '1.0.0') self.assertEqual(Version('1.0'), '1.0.0') self.assertEqual(Version('1.0'), Version('1.0.0')) self.assertEqual(Version('1.0', reverse=True), Version('1.0.0', reverse=True))
def test_filter_changelog_not_exact_version_v(self): # Filter html, exact version not found, but there is a lower version. initial_code = '<h1>v1.0.2</h1><p>v1.0.2 change list</p><h1>v1.0.1</h1><p>v1.0.1 change list</p><h1>v1.0.0</h1><p>Initial release</p>' expected_code = '<h1>v1.0.2</h1><p>v1.0.2 change list</p><h1>v1.0.1</h1><p>v1.0.1 change list</p>' self.assertEqual(filter_changelog(initial_code, Version('1.0.0.1')), expected_code)
def test_filter_changelog_headers_with_extra_content_v(self): initial_code = '<h1>v1.0.2 (2015-05-01)</h1><p>v1.0.2 change list</p><h1>v1.0.1 (2015-04-01)</h1><p>v1.0.1 change list</p><h1>v1.0.0 (2015-03-01)</h1><p>Initial release</p>' expected_code = '<h1>v1.0.2 (2015-05-01)</h1><p>v1.0.2 change list</p>' self.assertEqual(filter_changelog(initial_code, Version('1.0.1')), expected_code)
def test_filter_changelog_mixed(self): # Filter html, there are mixed sections between version sections initial_code = '<h2>v1.0.2</h2><p>v1.0.2 change list</p><h2>Extra header</h2><p>my extra info</p><h2>v1.0.1</h2><p>v1.0.1 change list</p><h2>v1.0.0</h2><p>Initial release</p>' expected_code = '<h2>v1.0.2</h2><p>v1.0.2 change list</p><h2>Extra header</h2><p>my extra info</p>' self.assertEqual(filter_changelog(initial_code, Version('1.0.1')), expected_code)
def test_filter_changelog_nested(self): # Filter html, exact version found, there is extra info before that must be discarded initial_code = '<h1>My Widgets changes</h1> my intro<h2>v1.0.2</h2><p>v1.0.2 change list</p><h2>v1.0.1</h2><p>v1.0.1 change list</p><h2>v1.0.0</h2><p>Initial release</p>' expected_code = '<h2>v1.0.2</h2><p>v1.0.2 change list</p>' self.assertEqual(filter_changelog(initial_code, Version('1.0.1')), expected_code)
def test_filter_changelog_no_changes_v(self): # Filter html, exact version found, but there are no change info before initial_code = '<h2>v1.0.2</h2> tail <p>v1.0.2 change list</p><h2>v1.0.1</h2><p>v1.0.1 change list</p><h2>v1.0.0</h2><p>Initial release</p> tail' expected_code = '' self.assertEqual(filter_changelog(initial_code, Version('1.0.2')), expected_code)