From 194ad21366d8794cd4269c3521806dafab0417a1 Mon Sep 17 00:00:00 2001 From: idgserpro Date: Thu, 13 Oct 2016 14:55:50 -0300 Subject: [PATCH] Implementa https://github.com/plonegovbr/portalpadrao.release/issues/11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O pacote agora tem mais de um job em integração contínua. Por causa das modificações feitas no buildout.cfg e no .travis.yml, também foi necessário corrigir o code-analysis. --- .travis.yml | 43 ++- bootstrap.py | 303 +++++++----------- buildout.cfg | 48 ++- setup.cfg | 7 + setup.py | 1 + src/brasil/gov/vcge/at/configure.zcml | 25 +- src/brasil/gov/vcge/at/extender.py | 20 +- src/brasil/gov/vcge/browser/configure.zcml | 4 +- .../gov/vcge/browser/templates/vcge_head.pt | 4 +- src/brasil/gov/vcge/browser/viewlets.py | 9 +- src/brasil/gov/vcge/config.py | 8 +- src/brasil/gov/vcge/configure.zcml | 13 +- src/brasil/gov/vcge/contentrules/action.py | 34 +- src/brasil/gov/vcge/contentrules/condition.py | 22 +- .../gov/vcge/contentrules/configure.zcml | 4 +- src/brasil/gov/vcge/contentrules/utils.py | 7 +- src/brasil/gov/vcge/dx/skos_input.pt | 33 +- src/brasil/gov/vcge/dx/widget.py | 88 ++--- src/brasil/gov/vcge/profiles.zcml | 32 +- .../gov/vcge/profiles/default/metadata.xml | 8 +- .../gov/vcge/profiles/default/viewlets.xml | 6 +- src/brasil/gov/vcge/tests/test_behavior.py | 50 ++- src/brasil/gov/vcge/tests/test_collection.py | 14 +- .../vcge/tests/test_contentrules_action.py | 67 ++-- .../vcge/tests/test_contentrules_condition.py | 57 ++-- src/brasil/gov/vcge/tests/test_setup.py | 20 +- src/brasil/gov/vcge/tests/test_viewlet.py | 16 +- src/brasil/gov/vcge/utils.py | 2 +- src/brasil/gov/vcge/vocabulary.py | 4 +- travis.cfg | 22 -- 30 files changed, 496 insertions(+), 475 deletions(-) delete mode 100644 travis.cfg diff --git a/.travis.yml b/.travis.yml index fbf887c..402e986 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,43 @@ language: python python: 2.7 +sudo: false +cache: + directories: + - eggs + - parts/node env: - - PLONE_VERSION=4.2 - - PLONE_VERSION=4.3 QA=true + matrix: + - PLONE_VERSION=4.2 + # Nos demais pacotes plonegovbr, como não testo as versões além do Plone + # 4.3 (ou seja, por padrão testo sõ a 4.3), não uso a variável + # PLONE_VERSION, apenas a MASTER e a PENDING_RELEASE. + - PLONE_VERSION=4.3 MASTER=true + - PLONE_VERSION=4.3 PENDING_RELEASE=true +matrix: + allow_failures: + - env: PLONE_VERSION=4.2 + - env: PLONE_VERSION=4.3 MASTER=true + fast_finish: true install: - - sed -ie "s#travis-4.x.cfg#travis-$PLONE_VERSION.x.cfg#" travis.cfg - - mkdir -p buildout-cache/downloads - - python bootstrap.py -c travis.cfg - - bin/buildout -c travis.cfg -N -q -t 3 + # Remova a linha que aponta para o versions do novo release, por padrão 4.3, + # se o job for o 4.2 ou o que tem que pegar do master. + - test "$MASTER" -o "$PLONE_VERSION" = 4.2 && sed -ie '/https:\/\/raw\.githubusercontent\.com\/plonegovbr\/portal\.buildout\/master\/buildout\.d\/versions\.cfg/d' buildout.cfg || true + - sed -ie "s#test-4.3#test-$PLONE_VERSION#" buildout.cfg + - python bootstrap.py + - bin/buildout annotate + - bin/buildout before_script: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start + - firefox -v script: + - bin/code-analysis - bin/test - - test -v QA && bin/code-analysis || true -after_success: test -v QA && bin/coverage.sh && pip install -q coveralls && coveralls || true -after_failure: - - bin/buildout annotate -c travis.cfg - - firefox -v +after_success: + # vcge, no momento, não possui testes do tipo "Robots", ao contrário dos + # demais pacotes em plonegovbr. + - bin/createcoverage -t "--layer=!Robot" + - pip install coveralls + - coveralls notifications: irc: irc.freenode.org#plonegovbr diff --git a/bootstrap.py b/bootstrap.py index 1cce2ce..a459921 100644 --- a/bootstrap.py +++ b/bootstrap.py @@ -18,75 +18,17 @@ use the -c option to specify an alternate configuration file. """ -import os, shutil, sys, tempfile, urllib, urllib2, subprocess +import os +import shutil +import sys +import tempfile + from optparse import OptionParser -if sys.platform == 'win32': - def quote(c): - if ' ' in c: - return '"%s"' % c # work around spawn lamosity on windows - else: - return c -else: - quote = str - -# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments. -stdout, stderr = subprocess.Popen( - [sys.executable, '-Sc', - 'try:\n' - ' import ConfigParser\n' - 'except ImportError:\n' - ' print 1\n' - 'else:\n' - ' print 0\n'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() -has_broken_dash_S = bool(int(stdout.strip())) - -# In order to be more robust in the face of system Pythons, we want to -# run without site-packages loaded. This is somewhat tricky, in -# particular because Python 2.6's distutils imports site, so starting -# with the -S flag is not sufficient. However, we'll start with that: -if not has_broken_dash_S and 'site' in sys.modules: - # We will restart with python -S. - args = sys.argv[:] - args[0:0] = [sys.executable, '-S'] - args = map(quote, args) - os.execv(sys.executable, args) -# Now we are running with -S. We'll get the clean sys.path, import site -# because distutils will do it later, and then reset the path and clean -# out any namespace packages from site-packages that might have been -# loaded by .pth files. -clean_path = sys.path[:] -import site # imported because of its side effects -sys.path[:] = clean_path -for k, v in sys.modules.items(): - if k in ('setuptools', 'pkg_resources') or ( - hasattr(v, '__path__') and - len(v.__path__) == 1 and - not os.path.exists(os.path.join(v.__path__[0], '__init__.py'))): - # This is a namespace package. Remove it. - sys.modules.pop(k) - -is_jython = sys.platform.startswith('java') - -setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py' -distribute_source = 'http://python-distribute.org/distribute_setup.py' - - -# parsing arguments -def normalize_to_url(option, opt_str, value, parser): - if value: - if '://' not in value: # It doesn't smell like a URL. - value = 'file://%s' % ( - urllib.pathname2url( - os.path.abspath(os.path.expanduser(value))),) - if opt_str == '--download-base' and not value.endswith('/'): - # Download base needs a trailing slash to make the world happy. - value += '/' - else: - value = None - name = opt_str[2:].replace('-', '_') - setattr(parser.values, name, value) +__version__ = '2015-07-01' +# See zc.buildout's changelog if this version is up to date. + +tmpeggs = tempfile.mkdtemp(prefix='bootstrap-') usage = '''\ [DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options] @@ -96,31 +38,14 @@ def normalize_to_url(option, opt_str, value, parser): Simply run this script in a directory containing a buildout.cfg, using the Python that you want bin/buildout to use. -Note that by using --setup-source and --download-base to point to -local resources, you can keep this script from going over the network. +Note that by using --find-links to point to local resources, you can keep +this script from going over the network. ''' parser = OptionParser(usage=usage) -parser.add_option("-v", "--version", dest="version", - help="use a specific zc.buildout version") -parser.add_option("-d", "--distribute", - action="store_true", dest="use_distribute", default=False, - help="Use Distribute rather than Setuptools.") -parser.add_option("--setup-source", action="callback", dest="setup_source", - callback=normalize_to_url, nargs=1, type="string", - help=("Specify a URL or file location for the setup file. " - "If you use Setuptools, this will default to " + - setuptools_source + "; if you use Distribute, this " - "will default to " + distribute_source + ".")) -parser.add_option("--download-base", action="callback", dest="download_base", - callback=normalize_to_url, nargs=1, type="string", - help=("Specify a URL or directory for downloading " - "zc.buildout and either Setuptools or Distribute. " - "Defaults to PyPI.")) -parser.add_option("--eggs", - help=("Specify a directory for storing eggs. Defaults to " - "a temporary directory that is deleted when the " - "bootstrap script completes.")) +parser.add_option("--version", + action="store_true", default=False, + help=("Return bootstrap.py version.")) parser.add_option("-t", "--accept-buildout-test-releases", dest='accept_buildout_test_releases', action="store_true", default=False, @@ -130,95 +55,117 @@ def normalize_to_url(option, opt_str, value, parser): "extensions for you. If you use this flag, " "bootstrap and buildout will get the newest releases " "even if they are alphas or betas.")) -parser.add_option("-c", None, action="store", dest="config_file", - help=("Specify the path to the buildout configuration " - "file to be used.")) +parser.add_option("-c", "--config-file", + help=("Specify the path to the buildout configuration " + "file to be used.")) +parser.add_option("-f", "--find-links", + help=("Specify a URL to search for buildout releases")) +parser.add_option("--allow-site-packages", + action="store_true", default=False, + help=("Let bootstrap.py use existing site packages")) +parser.add_option("--buildout-version", + help="Use a specific zc.buildout version") +parser.add_option("--setuptools-version", + help="Use a specific setuptools version") +parser.add_option("--setuptools-to-dir", + help=("Allow for re-use of existing directory of " + "setuptools versions")) options, args = parser.parse_args() +if options.version: + print("bootstrap.py version %s" % __version__) + sys.exit(0) -if options.eggs: - eggs_dir = os.path.abspath(os.path.expanduser(options.eggs)) -else: - eggs_dir = tempfile.mkdtemp() - -if options.setup_source is None: - if options.use_distribute: - options.setup_source = distribute_source - else: - options.setup_source = setuptools_source -if options.accept_buildout_test_releases: - args.insert(0, 'buildout:accept-buildout-test-releases=true') +###################################################################### +# load/install setuptools try: - import pkg_resources - import setuptools # A flag. Sometimes pkg_resources is installed alone. - if not hasattr(pkg_resources, '_distribute'): - raise ImportError + from urllib.request import urlopen except ImportError: - ez_code = urllib2.urlopen( - options.setup_source).read().replace('\r\n', '\n') - ez = {} - exec ez_code in ez - setup_args = dict(to_dir=eggs_dir, download_delay=0) - if options.download_base: - setup_args['download_base'] = options.download_base - if options.use_distribute: - setup_args['no_fake'] = True - if sys.version_info[:2] == (2, 4): - setup_args['version'] = '0.6.32' - ez['use_setuptools'](**setup_args) - if 'pkg_resources' in sys.modules: - reload(sys.modules['pkg_resources']) - import pkg_resources - # This does not (always?) update the default working set. We will - # do it. - for path in sys.path: - if path not in pkg_resources.working_set.entries: - pkg_resources.working_set.add_entry(path) - -cmd = [quote(sys.executable), - '-c', - quote('from setuptools.command.easy_install import main; main()'), - '-mqNxd', - quote(eggs_dir)] - -if not has_broken_dash_S: - cmd.insert(1, '-S') - -find_links = options.download_base -if not find_links: - find_links = os.environ.get('bootstrap-testing-find-links') -if not find_links and options.accept_buildout_test_releases: - find_links = 'http://downloads.buildout.org/' -if find_links: - cmd.extend(['-f', quote(find_links)]) + from urllib2 import urlopen -if options.use_distribute: - setup_requirement = 'distribute' +ez = {} +if os.path.exists('ez_setup.py'): + exec(open('ez_setup.py').read(), ez) else: - setup_requirement = 'setuptools' + exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez) + +if not options.allow_site_packages: + # ez_setup imports site, which adds site packages + # this will remove them from the path to ensure that incompatible versions + # of setuptools are not in the path + import site + # inside a virtualenv, there is no 'getsitepackages'. + # We can't remove these reliably + if hasattr(site, 'getsitepackages'): + for sitepackage_path in site.getsitepackages(): + # Strip all site-packages directories from sys.path that + # are not sys.prefix; this is because on Windows + # sys.prefix is a site-package directory. + if sitepackage_path != sys.prefix: + sys.path[:] = [x for x in sys.path + if sitepackage_path not in x] + +setup_args = dict(to_dir=tmpeggs, download_delay=0) + +if options.setuptools_version is not None: + setup_args['version'] = options.setuptools_version +if options.setuptools_to_dir is not None: + setup_args['to_dir'] = options.setuptools_to_dir + +ez['use_setuptools'](**setup_args) +import setuptools +import pkg_resources + +# This does not (always?) update the default working set. We will +# do it. +for path in sys.path: + if path not in pkg_resources.working_set.entries: + pkg_resources.working_set.add_entry(path) + +###################################################################### +# Install buildout + ws = pkg_resources.working_set -setup_requirement_path = ws.find( - pkg_resources.Requirement.parse(setup_requirement)).location -env = dict( - os.environ, - PYTHONPATH=setup_requirement_path) + +setuptools_path = ws.find( + pkg_resources.Requirement.parse('setuptools')).location + +# Fix sys.path here as easy_install.pth added before PYTHONPATH +cmd = [sys.executable, '-c', + 'import sys; sys.path[0:0] = [%r]; ' % setuptools_path + + 'from setuptools.command.easy_install import main; main()', + '-mZqNxd', tmpeggs] + +find_links = os.environ.get( + 'bootstrap-testing-find-links', + options.find_links or + ('http://downloads.buildout.org/' + if options.accept_buildout_test_releases else None) + ) +if find_links: + cmd.extend(['-f', find_links]) requirement = 'zc.buildout' -version = options.version +version = options.buildout_version if version is None and not options.accept_buildout_test_releases: # Figure out the most recent final version of zc.buildout. import setuptools.package_index _final_parts = '*final-', '*final' def _final_version(parsed_version): - for part in parsed_version: - if (part[:1] == '*') and (part not in _final_parts): - return False - return True + try: + return not parsed_version.is_prerelease + except AttributeError: + # Older setuptools + for part in parsed_version: + if (part[:1] == '*') and (part not in _final_parts): + return False + return True + index = setuptools.package_index.PackageIndex( - search_path=[setup_requirement_path]) + search_path=[setuptools_path]) if find_links: index.add_find_links((find_links,)) req = pkg_resources.Requirement.parse(requirement) @@ -227,8 +174,6 @@ def _final_version(parsed_version): bestv = None for dist in index[req.project_name]: distv = dist.parsed_version - if distv >= pkg_resources.parse_version('2dev'): - continue if _final_version(distv): if bestv is None or distv > bestv: best = [dist] @@ -238,40 +183,28 @@ def _final_version(parsed_version): if best: best.sort() version = best[-1].version - if version: - requirement += '=='+version -else: - requirement += '<2dev' - + requirement = '=='.join((requirement, version)) cmd.append(requirement) -if is_jython: - import subprocess - exitcode = subprocess.Popen(cmd, env=env).wait() -else: # Windows prefers this, apparently; otherwise we would prefer subprocess - exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env])) -if exitcode != 0: - sys.stdout.flush() - sys.stderr.flush() - print ("An error occurred when trying to install zc.buildout. " - "Look above this message for any errors that " - "were output by easy_install.") - sys.exit(exitcode) - -ws.add_entry(eggs_dir) +import subprocess +if subprocess.call(cmd) != 0: + raise Exception( + "Failed to execute command:\n%s" % repr(cmd)[1:-1]) + +###################################################################### +# Import and run buildout + +ws.add_entry(tmpeggs) ws.require(requirement) import zc.buildout.buildout -# If there isn't already a command in the args, add bootstrap if not [a for a in args if '=' not in a]: args.append('bootstrap') - -# if -c was provided, we push it back into args for buildout's main function +# if -c was provided, we push it back into args for buildout' main function if options.config_file is not None: args[0:0] = ['-c', options.config_file] zc.buildout.buildout.main(args) -if not options.eggs: # clean up temporary egg directory - shutil.rmtree(eggs_dir) +shutil.rmtree(tmpeggs) diff --git a/buildout.cfg b/buildout.cfg index d212f49..5017d6e 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -2,28 +2,50 @@ extends = https://raw.github.com/collective/buildout.plonetest/master/test-4.3.x.cfg https://raw.github.com/collective/buildout.plonetest/master/qa.cfg + https://raw.githubusercontent.com/plonegovbr/portal.buildout/master/buildout.d/versions.cfg package-name = brasil.gov.vcge package-extras = [test, archetypes, dexterity] -eggs += iw.debug parts += - i18ndude + createcoverage + node omelette -[instance] -zcml += iw.debug - -[i18ndude] -recipe = zc.recipe.egg -eggs = i18ndude +[code-analysis] +recipe = plone.recipe.codeanalysis[recommended] +directory = ${buildout:directory}/src/brasil/gov/vcge +clean-lines = True +csslint = True +csslint-bin = bin/csslint +debug-statements = True +deprecated-aliases = True +flake8-ignore = E501,T000 +jshint = True +jshint-bin = bin/jshint +multiprocessing = True +return-status-codes = True +pre-commit-hook = True +prefer-single-quotes = True +return-status-codes = True [omelette] recipe = collective.recipe.omelette eggs = ${test:eggs} -[code-analysis] -directory = ${buildout:directory}/src/brasil/gov/vcge -pre-commit-hook = True -flake8-ignore = E501 -debug-statements = True +[test] +# FIXME: https://github.com/collective/buildout.plonetest/issues/22 +eggs += Pillow + +[versions] +# Como no extends de versões do release do IDG, logo acima, eu pino +# esse pacote, preciso "despiná-lo" aqui para que ele não seja +# baixado de novo: o fato dele estar no src não impede o download +# dele de novo como um egg se ele estiver pinado no extends. +brasil.gov.vcge = +# XXX: 'Error: Bad constraint 0.6c11 setuptools>=18.5' no Plone 4.2 +setuptools = +# Utiliza última versão do coverage +coverage = +# XXX: 'Error: Bad constraint 1.4.4 plone.app.jquery>1.6' no Plone 4.2 +plone.app.jquery = 1.7.2.1 diff --git a/setup.cfg b/setup.cfg index 6aea515..4529551 100644 --- a/setup.cfg +++ b/setup.cfg @@ -9,3 +9,10 @@ ignore = Makefile bootstrap.py *.cfg + +[isort] +force_alphabetical_sort=True +force_single_line=True +lines_after_imports=2 +line_length=200 +not_skip=__init__.py diff --git a/setup.py b/setup.py index de7e68a..262349b 100644 --- a/setup.py +++ b/setup.py @@ -42,6 +42,7 @@ zip_safe=False, install_requires=[ 'Plone >=4.2', + 'plone.api', 'collective.z3cform.widgets', 'raptus.autocompletewidget', 'rdflib', diff --git a/src/brasil/gov/vcge/at/configure.zcml b/src/brasil/gov/vcge/at/configure.zcml index 04a3627..9ddb29f 100644 --- a/src/brasil/gov/vcge/at/configure.zcml +++ b/src/brasil/gov/vcge/at/configure.zcml @@ -4,23 +4,22 @@ xmlns:i18n="http://namespaces.zope.org/i18n" i18n_domain="brasil.gov.vcge"> - - - + + - + diff --git a/src/brasil/gov/vcge/at/extender.py b/src/brasil/gov/vcge/at/extender.py index 148e4f8..7d6b1a9 100644 --- a/src/brasil/gov/vcge/at/extender.py +++ b/src/brasil/gov/vcge/at/extender.py @@ -6,8 +6,8 @@ from Products.Archetypes import public as atapi from Products.Archetypes.interfaces import IBaseContent from raptus.autocompletewidget.widget import AutocompleteMultiSelectionWidget -from zope.component import adapts -from zope.interface import implements +from zope.component import adapter +from zope.interface import implementer AcMSW = AutocompleteMultiSelectionWidget @@ -18,25 +18,23 @@ class ExtensionLinesField(ExtensionField, atapi.LinesField): """ +# Este adaptador sera aplicado a todos os tipos baseados em Archetypes +@adapter(IBaseContent) +# We use both orderable and browser layer aware sensitive properties +@implementer(IBrowserLayerAwareExtender) class VCGEExtender(object): """ Adaptador que extende os tipos de conteudo base do Plone com o campo skos (representando o VCGE) """ - # Este adaptador sera aplicado a todos os tipos baseados em Archetypes - adapts(IBaseContent) - - # We use both orderable and browser layer aware sensitive properties - implements(IBrowserLayerAwareExtender) - layer = IVCGEInstalado fields = [ - ExtensionLinesField("skos", - schemata="categorization", + ExtensionLinesField('skos', + schemata='categorization', vocabulary_factory='brasil.gov.vcge', enforceVocabulary=True, - widget=AcMSW(label=_(u"VCGE"), + widget=AcMSW(label=_(u'VCGE'), description=_(u'vcge_desc'),)) ] diff --git a/src/brasil/gov/vcge/browser/configure.zcml b/src/brasil/gov/vcge/browser/configure.zcml index 4c0326c..ac7498a 100644 --- a/src/brasil/gov/vcge/browser/configure.zcml +++ b/src/brasil/gov/vcge/browser/configure.zcml @@ -3,12 +3,12 @@ xmlns:browser="http://namespaces.zope.org/browser" i18n_domain="brasil.gov.vcge"> - - + \ No newline at end of file + diff --git a/src/brasil/gov/vcge/browser/viewlets.py b/src/brasil/gov/vcge/browser/viewlets.py index 20c8210..bbae99a 100644 --- a/src/brasil/gov/vcge/browser/viewlets.py +++ b/src/brasil/gov/vcge/browser/viewlets.py @@ -3,6 +3,7 @@ from Acquisition import aq_base from Acquisition import aq_inner from plone.app.layout.viewlets import ViewletBase +from Products.CMFPlone.utils import safe_hasattr from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from urllib import urlencode from zope.component import queryUtility @@ -27,7 +28,7 @@ def skos(self): ''' context = aq_base(aq_inner(self.context)) uris = [] - if hasattr(context, 'skos'): + if safe_hasattr(context, 'skos'): uris = self.context.skos or [] name = 'brasil.gov.vcge' util = queryUtility(IVocabularyFactory, name) @@ -38,8 +39,10 @@ def skos(self): params = urlencode({'skos:list': uri}) skos.append({'id': uri, 'title': title, - 'url': '%s/@@search?%s' % (self.nav_root_url, - params)}) + 'url': '{0}/@@search?{1}'.format( + self.nav_root_url, + params + )}) return skos def rel(self): diff --git a/src/brasil/gov/vcge/config.py b/src/brasil/gov/vcge/config.py index e88ab93..e55570d 100644 --- a/src/brasil/gov/vcge/config.py +++ b/src/brasil/gov/vcge/config.py @@ -1,18 +1,18 @@ # -*- coding:utf-8 -*- from Products.CMFPlone import interfaces as plone_interfaces from Products.CMFQuickInstallerTool import interfaces as qi_interfaces -from zope.interface import implements +from zope.interface import implementer -PROJECTNAME = "brasil.gov.vcge" +PROJECTNAME = 'brasil.gov.vcge' DEFAULT_FILE = 'vcge.n3' DEFAULT_FORMAT = 'n3' NAMESPACE = 'http://www.w3.org/2004/02/skos/core#' +@implementer(qi_interfaces.INonInstallable) class HiddenProducts(object): """ Oculta produtos do QuickInstaller """ - implements(qi_interfaces.INonInstallable) def getNonInstallableProducts(self): return [ @@ -20,9 +20,9 @@ def getNonInstallableProducts(self): ] +@implementer(plone_interfaces.INonInstallable) class HiddenProfiles(object): """ Oculta profiles da tela inicial de criacao do site """ - implements(plone_interfaces.INonInstallable) def getNonInstallableProfiles(self): return [ diff --git a/src/brasil/gov/vcge/configure.zcml b/src/brasil/gov/vcge/configure.zcml index 807dab4..d7f2c89 100644 --- a/src/brasil/gov/vcge/configure.zcml +++ b/src/brasil/gov/vcge/configure.zcml @@ -5,7 +5,7 @@ i18n_domain="brasil.gov.vcge"> - + @@ -13,10 +13,10 @@ - + - + @@ -25,10 +25,9 @@ - + - - - - -
-
- + xmlns:tal="http://xml.zope.org/namespaces/tal" + tal:omit-tag=""> + + + +
+
+ diff --git a/src/brasil/gov/vcge/dx/widget.py b/src/brasil/gov/vcge/dx/widget.py index 2c3280d..4130fc4 100644 --- a/src/brasil/gov/vcge/dx/widget.py +++ b/src/brasil/gov/vcge/dx/widget.py @@ -17,7 +17,7 @@ class ISkosWidget(interfaces.ISequenceWidget): class SkosWidget(widget.SequenceWidget): zope.interface.implementsOnly(ISkosWidget) - klass = u"token-input-widget" + klass = u'token-input-widget' display_template = ViewPageTemplateFile('skos_display.pt') input_template = ViewPageTemplateFile('skos_input.pt') @@ -26,56 +26,72 @@ class SkosWidget(widget.SequenceWidget): maxResults = 10 mustMatch = False matchContains = True + + # Não é necessário dar "escape" em "{" e "}" aqui uma vez que essas variáveis + # são usadas de forma literal como parâmetro do format: só precisamos dar + # "escape" quando é a string que será aplicada o format (como o js_template) formatItem = 'function(row, idx, count, value) { return row[1]; }' - formatResult = 'function(row, idx, count) { return ""; }' + formatResult = 'function(row, idx, count) { return ''; }' + # + # Lembre-se de que para conseguir usar { e } de forma literal nas aberturas + # e fechamento de funções do js, você precisa usar {{ e }} respectivamente. + # https://docs.python.org/3/library/string.html#formatstrings js_template = """\ - (function($) { - $().ready(function() { - $('#formfield-form-widgets-IVCGE-skos #%(id)s').each(function() { - $('#formfield-form-widgets-IVCGE-skos').append(''); + (function($) {{ + $().ready(function() {{ + $('#formfield-form-widgets-IVCGE-skos #{id}').each(function() {{ + $('#formfield-form-widgets-IVCGE-skos').append(''); $(this).remove(); - $('#formfield-form-widgets-IVCGE-skos #%(id)s-input').autocomplete('%(url)s/@@token-search?f=%(id)s', { + $('#formfield-form-widgets-IVCGE-skos #{id}-input').autocomplete('{url}/@@token-search?f={id}', {{ autoFill: false, - minChars: %(minChars)d, - max: %(maxResults)d, - mustMatch: %(mustMatch)s, - matchContains: %(matchContains)s, - formatItem: %(formatItem)s, - formatResult: %(formatResult)s - }).result(%(js_callback)s); - }) - }); - })(jQuery); + minChars: {minChars}, + max: {maxResults}, + mustMatch: {mustMatch}, + matchContains: {matchContains}, + formatItem: {formatItem}, + formatResult: {formatResult} + }}).result({js_callback}); + }}) + }}); + }})(jQuery); """ + # Lembre-se de que para conseguir usar { e } de forma literal nas aberturas + # e fechamento de funções do js, você precisa usar {{ e }} respectivamente. + # https://docs.python.org/3/library/string.html#formatstrings js_callback_template = """\ - function(event, data, formatted) { + function(event, data, formatted) {{ var field = $('#formfield-form-widgets-IVCGE-skos input[type="checkbox"][value="' + data[0] + '"]'); if(field.length == 0) - $('#formfield-form-widgets-IVCGE-skos #%(id)s-input').before("<" + "label class='plain'><" + "input type='checkbox' name='%(name)s' checked='checked' value='" + data[0] + "' /> " + data[1] + "
"); + $('#formfield-form-widgets-IVCGE-skos #{id}-input').before("<" + "label class='plain'><" + "input type='checkbox' name='{name}' checked='checked' value='" + data[0] + "' /> " + data[1] + "
"); else - field.each(function() { this.checked = true }); + field.each(function() {{ this.checked = true }}); if(data[0]) - $('#formfield-form-widgets-IVCGE-skos #%(id)s-input').val(''); - } + $('#formfield-form-widgets-IVCGE-skos #{id}-input').val(''); + }} """ def js(self): context = self.context form_url = context.absolute_url() - js_callback = self.js_callback_template % dict(id=self.id, name=self.name) - return self.js_template % dict( - id=self.id, - name=self.name, - url=form_url, - minChars=self.minChars, - maxResults=self.maxResults, - mustMatch=str(self.mustMatch).lower(), - matchContains=str(self.matchContains).lower(), - formatItem=self.formatItem, - formatResult=self.formatResult, - js_callback=js_callback,) + js_callback = self.js_callback_template.format( + **dict(id=self.id, name=self.name) + ) + return self.js_template.format( + **dict( + id=self.id, + name=self.name, + url=form_url, + minChars=self.minChars, + maxResults=self.maxResults, + mustMatch=str(self.mustMatch).lower(), + matchContains=str(self.matchContains).lower(), + formatItem=self.formatItem, + formatResult=self.formatResult, + js_callback=js_callback, + ) + ) def vocab(self): name = 'brasil.gov.vcge' @@ -164,7 +180,7 @@ def __call__(self): if query in i.title.lower()] results = sorted(results, key=lambda pair: len(pair[1])) - return '\n'.join(["%s|%s" % (value, title) + return '\n'.join(['{0}|{1}'.format(value, title) for value, title in results]) @@ -175,5 +191,5 @@ def __call__(self): results = results.split('\n') query = self.request.get('q', '') for r in results: - if r.startswith(u'%s|' % safe_unicode(query)): + if r.startswith(u'{0}|'.format(safe_unicode(query))): return r diff --git a/src/brasil/gov/vcge/profiles.zcml b/src/brasil/gov/vcge/profiles.zcml index 6908c29..817fbd9 100644 --- a/src/brasil/gov/vcge/profiles.zcml +++ b/src/brasil/gov/vcge/profiles.zcml @@ -4,22 +4,22 @@ xmlns:i18n="http://namespaces.zope.org/i18n" i18n_domain="brasil.gov.vcge"> - + - + diff --git a/src/brasil/gov/vcge/profiles/default/metadata.xml b/src/brasil/gov/vcge/profiles/default/metadata.xml index b1688ad..e19dfdc 100644 --- a/src/brasil/gov/vcge/profiles/default/metadata.xml +++ b/src/brasil/gov/vcge/profiles/default/metadata.xml @@ -1,7 +1,7 @@ - 2000 - - profile-raptus.autocompletewidget:default - + 2000 + + profile-raptus.autocompletewidget:default + diff --git a/src/brasil/gov/vcge/profiles/default/viewlets.xml b/src/brasil/gov/vcge/profiles/default/viewlets.xml index adbed08..d9ec04f 100644 --- a/src/brasil/gov/vcge/profiles/default/viewlets.xml +++ b/src/brasil/gov/vcge/profiles/default/viewlets.xml @@ -1,6 +1,6 @@ - - - + + + diff --git a/src/brasil/gov/vcge/tests/test_behavior.py b/src/brasil/gov/vcge/tests/test_behavior.py index 19fef6d..e56f8d2 100644 --- a/src/brasil/gov/vcge/tests/test_behavior.py +++ b/src/brasil/gov/vcge/tests/test_behavior.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- +from brasil.gov.vcge.browser.viewlets import VCGEViewlet from brasil.gov.vcge.dx.behaviors import IVCGE from brasil.gov.vcge.dx.behaviors import VCGE from brasil.gov.vcge.dx.interfaces import IVCGEDx -from brasil.gov.vcge.browser.viewlets import VCGEViewlet from brasil.gov.vcge.testing import HAS_DEXTERITY from brasil.gov.vcge.testing import INTEGRATION_TESTING +from plone import api from plone.app.testing import login from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID @@ -13,12 +14,14 @@ import unittest2 as unittest +DEXTERITY_FTI_FOLDER = 'folder' + def add_folder_type(portal): from plone.dexterity.fti import DexterityFTI - fti = DexterityFTI('folder') - portal.portal_types._setObject('folder', fti) + fti = DexterityFTI(DEXTERITY_FTI_FOLDER) + portal.portal_types._setObject(DEXTERITY_FTI_FOLDER, fti) fti.klass = 'plone.dexterity.content.Container' fti.filter_content_types = False fti.behaviors = ( @@ -61,10 +64,14 @@ def setUpContent(self): token = 'http://vocab.e.gov.br/2011/03/vcge#achados-perdidos' self.token = token portal = self.portal - oId = portal.invokeFactory('folder', 'content') - o = IVCGE(portal[oId]) - o.skos = [token, ] - self.content = portal[oId] + o = api.content.create( + type=DEXTERITY_FTI_FOLDER, + container=portal, + id='content' + ) + i = IVCGE(o) + i.skos = [token, ] + self.content = o def setUp(self): if not HAS_DEXTERITY: @@ -76,7 +83,11 @@ def setUp(self): self.portal = portal self.fti = add_folder_type(self.portal) self.setUpUser() - self.portal.invokeFactory('folder', 'folder') + api.content.create( + type=DEXTERITY_FTI_FOLDER, + container=self.portal, + id='folder' + ) self.setUpContent() def test_behavior_applied(self): @@ -86,7 +97,7 @@ def test_behavior_applied(self): def test_content_information(self): content = self.content - self.assertEquals(content.skos, [self.token, ]) + self.assertEqual(content.skos, [self.token, ]) class TestViewlet(unittest.TestCase): @@ -101,8 +112,11 @@ def setUpUser(self): def setUpContent(self): token = 'http://vocab.e.gov.br/2011/03/vcge#achados-perdidos' portal = self.portal - oId = portal.invokeFactory('folder', 'content') - o = portal[oId] + o = api.content.create( + type=DEXTERITY_FTI_FOLDER, + container=portal, + id='content' + ) o.skos = [token, ] self.content = o @@ -116,7 +130,11 @@ def setUp(self): self.portal = portal self.fti = add_folder_type(self.portal) self.setUpUser() - self.portal.invokeFactory('folder', 'folder') + api.content.create( + type=DEXTERITY_FTI_FOLDER, + container=self.portal, + id='folder' + ) self.setUpContent() def test_rel(self): @@ -124,16 +142,16 @@ def test_rel(self): viewlet = VCGEViewlet(content, self.request, None, None) viewlet.update() rel = viewlet.rel() - self.assertEquals(rel, u'dc:subject foaf:primaryTopic') + self.assertEqual(rel, u'dc:subject foaf:primaryTopic') def test_skos(self): content = self.content viewlet = VCGEViewlet(content, self.request, None, None) viewlet.update() skos = viewlet.skos() - self.assertEquals(len(skos), 1) + self.assertEqual(len(skos), 1) term = skos[0] - self.assertEquals(term.get('title'), u'Achados e perdidos') + self.assertEqual(term.get('title'), u'Achados e perdidos') def test_skos_not_existent(self): ''' Testa o que acontece quando nao temos o Extender @@ -143,4 +161,4 @@ def test_skos_not_existent(self): viewlet = VCGEViewlet(portal, self.request, None, None) viewlet.update() skos = viewlet.skos() - self.assertEquals(len(skos), 0) + self.assertEqual(len(skos), 0) diff --git a/src/brasil/gov/vcge/tests/test_collection.py b/src/brasil/gov/vcge/tests/test_collection.py index f8a29b5..904ce0f 100644 --- a/src/brasil/gov/vcge/tests/test_collection.py +++ b/src/brasil/gov/vcge/tests/test_collection.py @@ -39,38 +39,38 @@ def test_querystring_field_available(self): def test_querystring_field_title(self): registry = self.registry prefix = self.prefix - self.assertEqual(registry[prefix + ".title"], "VCGE") + self.assertEqual(registry[prefix + '.title'], 'VCGE') def test_querystring_field_description(self): registry = self.registry prefix = self.prefix - self.assertEqual(registry[prefix + ".description"], + self.assertEqual(registry[prefix + '.description'], 'Vocabulario Controlado do Governo Eletronico') def test_querystring_field_is_enabled(self): registry = self.registry prefix = self.prefix - self.assertEqual(registry[prefix + ".enabled"], True) + self.assertEqual(registry[prefix + '.enabled'], True) def test_querystring_field_not_sortable(self): registry = self.registry prefix = self.prefix - self.assertEqual(registry[prefix + ".sortable"], False) + self.assertEqual(registry[prefix + '.sortable'], False) def test_querystring_field_vocabulary(self): registry = self.registry prefix = self.prefix - self.assertEqual(registry[prefix + ".vocabulary"], "brasil.gov.vcge") + self.assertEqual(registry[prefix + '.vocabulary'], 'brasil.gov.vcge') def test_querystring_field_group(self): registry = self.registry prefix = self.prefix - self.assertEqual(registry[prefix + ".group"], "Metadata") + self.assertEqual(registry[prefix + '.group'], 'Metadata') def test_querystring_field_operations(self): registry = self.registry prefix = self.prefix - self.assertEqual(registry[prefix + ".operations"], + self.assertEqual(registry[prefix + '.operations'], ['plone.app.querystring.operation.selection.is', 'plone.app.querystring.operation.string.is', ] ) diff --git a/src/brasil/gov/vcge/tests/test_contentrules_action.py b/src/brasil/gov/vcge/tests/test_contentrules_action.py index 38f9093..4ab21dd 100644 --- a/src/brasil/gov/vcge/tests/test_contentrules_action.py +++ b/src/brasil/gov/vcge/tests/test_contentrules_action.py @@ -2,6 +2,7 @@ from brasil.gov.vcge.contentrules.action import VCGEAction from brasil.gov.vcge.contentrules.action import VCGEEditForm from brasil.gov.vcge.testing import INTEGRATION_TESTING +from plone import api from plone.app.contentrules.rule import Rule from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID @@ -13,13 +14,13 @@ from zope.component import getMultiAdapter from zope.component import getUtility from zope.component.interfaces import IObjectEvent -from zope.interface import implements +from zope.interface import implementer import unittest2 as unittest +@implementer(IObjectEvent) class DummyEvent(object): - implements(IObjectEvent) def __init__(self, object): self.object = object @@ -34,14 +35,26 @@ class TestSubjectAction(unittest.TestCase): def setUp(self): self.portal = self.layer['portal'] setRoles(self.portal, TEST_USER_ID, ['Manager']) - self.portal.invokeFactory('Folder', 'folder') - self.folder = self.portal['folder'] + + self.folder = api.content.create( + type='Folder', + container=self.portal, + id='folder' + ) self.folder.skos = [self.term, ] self.folder.reindexObject() - sub_folder_id = self.folder.invokeFactory('Folder', 'sub_folder') - self.sub_folder = self.folder[sub_folder_id] - self.document = self.folder[self.folder.invokeFactory('Document', - 'a_document')] + + self.sub_folder = api.content.create( + type='Folder', + container=self.folder, + id='sub_folder' + ) + + self.document = api.content.create( + type='Document', + container=self.folder, + id='a_document' + ) self.document.setSubject(['Bar', ]) self.document.reindexObject() @@ -55,11 +68,10 @@ def setUp(self): def test_registered(self): element = getUtility(IRuleAction, name='brasil.gov.vcge.actions.VCGE') - self.assertEquals('brasil.gov.vcge.actions.VCGE', - element.addview) - self.assertEquals('edit', element.editview) - self.assertEquals(None, element.for_) - self.assertEquals(IObjectEvent, element.event) + self.assertEqual('brasil.gov.vcge.actions.VCGE', element.addview) + self.assertEqual('edit', element.editview) + self.assertEqual(None, element.for_) + self.assertEqual(IObjectEvent, element.event) def test_invoke_add_view(self): element = getUtility(IRuleAction, @@ -77,9 +89,9 @@ def test_invoke_add_view(self): 'skos': [self.term, ]}) e = rule.actions[0] - self.failUnless(isinstance(e, VCGEAction)) - self.assertEquals(False, e.same_as_parent) - self.assertEquals([self.term, ], e.skos) + self.assertTrue(isinstance(e, VCGEAction)) + self.assertEqual(False, e.same_as_parent) + self.assertEqual([self.term, ], e.skos) def test_invoke_edit_view(self): element = getUtility(IRuleAction, @@ -87,22 +99,22 @@ def test_invoke_edit_view(self): e = VCGEAction() editview = getMultiAdapter((e, self.folder.REQUEST), name=element.editview) - self.failUnless(isinstance(editview, VCGEEditForm)) + self.assertTrue(isinstance(editview, VCGEEditForm)) def test_summary_parent_vcge(self): e = VCGEAction() e.same_as_parent = True self.assertEqual( e.summary, - u"Aplica termos da pasta no conteúdo." + u'Aplica termos da pasta no conteúdo.' ) def test_summary_with_vcge(self): from plone.app.contentrules import PloneMessageFactory as _ e = VCGEAction() e.skos = [self.term, ] - msg = _(u"Aplica os termos ${skos}", - mapping=dict(skos=" or ".join(e.skos))) + msg = _(u'Aplica os termos ${skos}', + mapping=dict(skos=' or '.join(e.skos))) self.assertEqual( e.summary, msg @@ -116,10 +128,9 @@ def test_execute_with_vcge(self): ex = getMultiAdapter((self.folder, e, DummyEvent(self.sub_folder)), IExecutable) - self.assertEquals(True, ex()) + self.assertEqual(True, ex()) - self.assertEquals(list(self.sub_folder.skos), - e.skos) + self.assertEqual(list(self.sub_folder.skos), e.skos) def test_execute_same_as_parent(self): e = VCGEAction() @@ -129,9 +140,9 @@ def test_execute_same_as_parent(self): ex = getMultiAdapter((self.folder, e, DummyEvent(self.sub_folder)), IExecutable) - self.assertEquals(True, ex()) + self.assertEqual(True, ex()) - self.assertEquals(self.sub_folder.skos, self.folder.skos) + self.assertEqual(self.sub_folder.skos, self.folder.skos) def test_execute_object_without_vcge(self): e = VCGEAction() @@ -141,7 +152,7 @@ def test_execute_object_without_vcge(self): ex = getMultiAdapter((self.folder, e, DummyEvent(o)), IExecutable) - self.assertEquals(False, ex()) + self.assertEqual(False, ex()) def test_execute_parent_without_vcge(self): e = VCGEAction() @@ -152,7 +163,7 @@ def test_execute_parent_without_vcge(self): ex = getMultiAdapter((folder, e, DummyEvent(o)), IExecutable) - self.assertEquals(False, ex()) + self.assertEqual(False, ex()) def test_execute_parent_without_vcge_attribute(self): e = VCGEAction() @@ -162,4 +173,4 @@ def test_execute_parent_without_vcge_attribute(self): ex = getMultiAdapter((self.folder, e, DummyEvent(self.sub_folder)), IExecutable) - self.assertEquals(False, ex()) + self.assertEqual(False, ex()) diff --git a/src/brasil/gov/vcge/tests/test_contentrules_condition.py b/src/brasil/gov/vcge/tests/test_contentrules_condition.py index 2129648..d7daca4 100644 --- a/src/brasil/gov/vcge/tests/test_contentrules_condition.py +++ b/src/brasil/gov/vcge/tests/test_contentrules_condition.py @@ -2,6 +2,7 @@ from brasil.gov.vcge.contentrules.condition import VCGECondition from brasil.gov.vcge.contentrules.condition import VCGEEditForm from brasil.gov.vcge.testing import INTEGRATION_TESTING +from plone import api from plone.app.contentrules.rule import Rule from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID @@ -9,15 +10,16 @@ from plone.contentrules.rule.interfaces import IExecutable from plone.contentrules.rule.interfaces import IRuleCondition from Products.CMFCore.PortalContent import PortalContent -from zope.component import getUtility, getMultiAdapter +from zope.component import getMultiAdapter +from zope.component import getUtility from zope.component.interfaces import IObjectEvent -from zope.interface import implements +from zope.interface import implementer import unittest2 as unittest +@implementer(IObjectEvent) class DummyEvent(object): - implements(IObjectEvent) def __init__(self, object): self.object = object @@ -32,11 +34,19 @@ class TestVCGECondition(unittest.TestCase): def setUp(self): self.portal = self.layer['portal'] setRoles(self.portal, TEST_USER_ID, ['Manager']) - self.portal.invokeFactory('Folder', 'folder') - self.folder = self.portal['folder'] + + self.folder = api.content.create( + type='Folder', + container=self.portal, + id='folder' + ) self.folder.skos = [self.term, ] - sub_folder_id = self.folder.invokeFactory('Folder', 'sub_folder') - self.sub_folder = self.folder[sub_folder_id] + + self.sub_folder = api.content.create( + type='Folder', + container=self.folder, + id='sub_folder' + ) self.sub_folder.skos = ['http://vocab.e.gov.br/2011/03/vcge#governo', ] o = PortalContent('cmf', 'CMF Content', '', '', '') self.folder._setObject('cmf', o, suppress_events=True) @@ -44,11 +54,10 @@ def setUp(self): def test_registered(self): element = getUtility(IRuleCondition, name='brasil.gov.vcge.conditions.VCGE') - self.assertEquals('brasil.gov.vcge.conditions.VCGE', - element.addview) - self.assertEquals('edit', element.editview) - self.assertEquals(None, element.for_) - self.assertEquals(IObjectEvent, element.event) + self.assertEqual('brasil.gov.vcge.conditions.VCGE', element.addview) + self.assertEqual('edit', element.editview) + self.assertEqual(None, element.for_) + self.assertEqual(IObjectEvent, element.event) def test_invoke_add_view(self): element = getUtility(IRuleCondition, @@ -65,8 +74,8 @@ def test_invoke_add_view(self): addview.createAndAdd(data={'skos': [self.term, ]}) e = rule.conditions[0] - self.failUnless(isinstance(e, VCGECondition)) - self.assertEquals([self.term, ], e.skos) + self.assertTrue(isinstance(e, VCGECondition)) + self.assertEqual([self.term, ], e.skos) def test_invoke_edit_view(self): element = getUtility(IRuleCondition, @@ -74,18 +83,18 @@ def test_invoke_edit_view(self): e = VCGECondition() editview = getMultiAdapter((e, self.folder.REQUEST), name=element.editview) - self.failUnless(isinstance(editview, VCGEEditForm)) + self.assertTrue(isinstance(editview, VCGEEditForm)) def test_summary_empty_vcge(self): e = VCGECondition() - self.assertEqual(e.summary, u"Nenhum termo selecionado") + self.assertEqual(e.summary, u'Nenhum termo selecionado') def test_summary_with_vcge(self): from plone.app.contentrules import PloneMessageFactory as _ e = VCGECondition() e.skos = [self.term, ] - msg = _(u"VCGE contém ${skos}", - mapping=dict(skos=" or ".join(e.skos))) + msg = _(u'VCGE contém ${skos}', + mapping=dict(skos=' or '.join(e.skos))) self.assertEqual( e.summary, msg @@ -97,11 +106,11 @@ def test_execute(self): ex = getMultiAdapter((self.portal, e, DummyEvent(self.folder)), IExecutable) - self.assertEquals(True, ex()) + self.assertEqual(True, ex()) ex = getMultiAdapter((self.portal, e, DummyEvent(self.sub_folder)), IExecutable) - self.assertEquals(False, ex()) + self.assertEqual(False, ex()) def test_execute_empty(self): e = VCGECondition() @@ -109,17 +118,17 @@ def test_execute_empty(self): ex = getMultiAdapter((self.portal, e, DummyEvent(self.folder)), IExecutable) - self.assertEquals(False, ex()) + self.assertEqual(False, ex()) ex = getMultiAdapter((self.portal, e, DummyEvent(self.sub_folder)), IExecutable) - self.assertEquals(False, ex()) + self.assertEqual(False, ex()) # Empty VCGE field self.sub_folder.skos = [] ex = getMultiAdapter((self.portal, e, DummyEvent(self.sub_folder)), IExecutable) - self.assertEquals(True, ex()) + self.assertEqual(True, ex()) def test_execute_object_without_vcge(self): e = VCGECondition() @@ -128,4 +137,4 @@ def test_execute_object_without_vcge(self): ex = getMultiAdapter((self.folder, e, DummyEvent(self.folder['cmf'])), IExecutable) - self.assertEquals(False, ex()) + self.assertEqual(False, ex()) diff --git a/src/brasil/gov/vcge/tests/test_setup.py b/src/brasil/gov/vcge/tests/test_setup.py index cdaa46c..6b932f4 100644 --- a/src/brasil/gov/vcge/tests/test_setup.py +++ b/src/brasil/gov/vcge/tests/test_setup.py @@ -40,28 +40,28 @@ class TestInstall(BaseTestCase): def test_installed(self): self.assertTrue(self.qi.isProductInstalled(PROJECTNAME), - '%s not installed' % PROJECTNAME) + '{0} not installed'.format(PROJECTNAME)) def test_dependencies_installed(self): for product in ['raptus.autocompletewidget', ]: self.assertTrue(self.qi.isProductInstalled(product), - '%s not installed' % product) + '{0} not installed'.format(product)) @unittest.skipIf(not HAS_DEXTERITY, '"dexterity" extra not included') def test_dx_dependencies_installed(self): for product in ['plone.app.dexterity', ]: self.assertTrue(self.qi.isProductInstalled(product), - '%s not installed' % product) + '{0} not installed'.format(product)) def test_browserlayer(self): from brasil.gov.vcge.interfaces import IVCGEInstalado - self.assertTrue(IVCGEInstalado in registered_layers()) + self.assertIn(IVCGEInstalado, registered_layers()) def test_cssregistry(self): portal_css = self.portal.portal_css for css in STYLESHEETS: self.assertTrue(css in portal_css.getResourceIds(), - '%s not installed' % css) + '{0} not installed'.format(css)) class TestUpgrade(BaseTestCase): @@ -75,8 +75,8 @@ def test_to1000_available(self): self.profile, '0') step = [step for step in upgradeSteps - if (step[0]['dest'] == ('1000',)) - and (step[0]['source'] == ('0',))] + if (step[0]['dest'] == ('1000',)) and + (step[0]['source'] == ('0',))] self.assertEqual(len(step), 1) def test_to2000_available(self): @@ -85,8 +85,8 @@ def test_to2000_available(self): self.profile, '1000') step = [step for step in upgradeSteps - if (step[0]['dest'] == ('2000',)) - and (step[0]['source'] == ('1000',))] + if (step[0]['dest'] == ('2000',)) and + (step[0]['source'] == ('1000',))] self.assertEqual(len(step), 1) @@ -108,4 +108,4 @@ def test_cssregistry(self): portal_css = self.portal.portal_css for css in STYLESHEETS: self.assertTrue(css not in portal_css.getResourceIds(), - '%s installed' % css) + '{0} installed'.format(css)) diff --git a/src/brasil/gov/vcge/tests/test_viewlet.py b/src/brasil/gov/vcge/tests/test_viewlet.py index 17988d6..a3be222 100644 --- a/src/brasil/gov/vcge/tests/test_viewlet.py +++ b/src/brasil/gov/vcge/tests/test_viewlet.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from brasil.gov.vcge.browser.viewlets import VCGEViewlet from brasil.gov.vcge.testing import INTEGRATION_TESTING +from plone import api from plone.app.testing import login from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID @@ -22,8 +23,11 @@ def setUpUser(self): def setUpContent(self): token = 'http://vocab.e.gov.br/2011/03/vcge#achados-perdidos' portal = self.portal - oId = portal.invokeFactory('Document', 'doc') - o = portal[oId] + o = api.content.create( + type='Document', + container=portal, + id='doc' + ) o.Schema().getField('skos').set(o, [token, ]) self.content = o @@ -40,16 +44,16 @@ def test_rel(self): viewlet = VCGEViewlet(content, self.request, None, None) viewlet.update() rel = viewlet.rel() - self.assertEquals(rel, u'dc:subject foaf:primaryTopic') + self.assertEqual(rel, u'dc:subject foaf:primaryTopic') def test_skos(self): content = self.content viewlet = VCGEViewlet(content, self.request, None, None) viewlet.update() skos = viewlet.skos() - self.assertEquals(len(skos), 1) + self.assertEqual(len(skos), 1) term = skos[0] - self.assertEquals(term.get('title'), u'Achados e perdidos') + self.assertEqual(term.get('title'), u'Achados e perdidos') def test_skos_not_existent(self): ''' Testa o que acontece quando nao temos o Extender @@ -59,4 +63,4 @@ def test_skos_not_existent(self): viewlet = VCGEViewlet(portal, self.request, None, None) viewlet.update() skos = viewlet.skos() - self.assertEquals(len(skos), 0) + self.assertEqual(len(skos), 0) diff --git a/src/brasil/gov/vcge/utils.py b/src/brasil/gov/vcge/utils.py index cc0e41a..e4c75be 100644 --- a/src/brasil/gov/vcge/utils.py +++ b/src/brasil/gov/vcge/utils.py @@ -30,7 +30,7 @@ def parse_skos(data, format='xml'): oId = obj[0].toPython() title = unicode(obj[2]) lang = obj[2].language - if not oId in termos: + if oId not in termos: termos[oId] = {'title': u'', 'lang': u''} termos[oId]['title'] = title termos[oId]['lang'] = lang diff --git a/src/brasil/gov/vcge/vocabulary.py b/src/brasil/gov/vcge/vocabulary.py index 1714aa7..df9dd5a 100644 --- a/src/brasil/gov/vcge/vocabulary.py +++ b/src/brasil/gov/vcge/vocabulary.py @@ -1,12 +1,13 @@ # -*- coding:utf-8 -*- from brasil.gov.vcge.utils import load_skos -from zope.interface import implements +from zope.interface import implementer from zope.schema.interfaces import IVocabularyFactory from zope.schema.vocabulary import SimpleTerm from zope.schema.vocabulary import SimpleVocabulary +@implementer(IVocabularyFactory) class VCGEVocabulary(object): """Vocabulario Controlado do Governo Eletronico @@ -29,7 +30,6 @@ class VCGEVocabulary(object): >>> doc.title, doc.token, doc.value (u'Achados e perdidos', token, token) """ - implements(IVocabularyFactory) def __call__(self, context): items = [] diff --git a/travis.cfg b/travis.cfg deleted file mode 100644 index 705d8fa..0000000 --- a/travis.cfg +++ /dev/null @@ -1,22 +0,0 @@ -[versions] -# XXX: Plone 4.2 compatibility -collective.js.jqueryui = 1.8.16.9 - -[buildout] -extends = - https://raw.github.com/collective/buildout.plonetest/master/travis-4.x.cfg - https://raw.github.com/collective/buildout.plonetest/master/qa.cfg - -package-name = brasil.gov.vcge -package-extras = [test, archetypes, dexterity] -package-min-coverage = 86 - -parts += - createcoverage - coverage-sh - -[code-analysis] -directory = ${buildout:directory}/src/brasil/gov/vcge -pre-commit-hook = False -flake8-ignore = E501 -debug-statements = True