forked from openlp/openlp
Remove openlyrics tests for easier merging. They will be merged later.
This commit is contained in:
parent
655245051a
commit
fb664bed0c
@ -228,29 +228,26 @@ def main(args=None):
|
||||
help='Set the Qt4 style (passed directly to Qt4).')
|
||||
parser.add_option('--testing', dest='testing',
|
||||
action='store_true', help='Run by testing framework')
|
||||
# Set up logging
|
||||
log_path = AppLocation.get_directory(AppLocation.CacheDir)
|
||||
check_directory_exists(log_path)
|
||||
filename = os.path.join(log_path, u'openlp.log')
|
||||
logfile = logging.FileHandler(filename, u'w')
|
||||
logfile.setFormatter(logging.Formatter(
|
||||
u'%(asctime)s %(name)-55s %(levelname)-8s %(message)s'))
|
||||
log.addHandler(logfile)
|
||||
logging.addLevelName(15, u'Timer')
|
||||
# Parse command line options and deal with them.
|
||||
# Use args supplied programatically if possible.
|
||||
(options, args) = parser.parse_args(args) if args else parser.parse_args()
|
||||
# Set up logging
|
||||
# In test mode it is skipped
|
||||
if not options.testing:
|
||||
log_path = AppLocation.get_directory(AppLocation.CacheDir)
|
||||
check_directory_exists(log_path)
|
||||
filename = os.path.join(log_path, u'openlp.log')
|
||||
logfile = logging.FileHandler(filename, u'w')
|
||||
logfile.setFormatter(logging.Formatter(
|
||||
u'%(asctime)s %(name)-55s %(levelname)-8s %(message)s'))
|
||||
log.addHandler(logfile)
|
||||
logging.addLevelName(15, u'Timer')
|
||||
if options.loglevel.lower() in ['d', 'debug']:
|
||||
log.setLevel(logging.DEBUG)
|
||||
print 'Logging to:', filename
|
||||
elif options.loglevel.lower() in ['w', 'warning']:
|
||||
log.setLevel(logging.WARNING)
|
||||
else:
|
||||
log.setLevel(logging.INFO)
|
||||
# Deal with other command line options.
|
||||
qt_args = []
|
||||
if options.loglevel.lower() in ['d', 'debug']:
|
||||
log.setLevel(logging.DEBUG)
|
||||
print 'Logging to:', filename
|
||||
elif options.loglevel.lower() in ['w', 'warning']:
|
||||
log.setLevel(logging.WARNING)
|
||||
else:
|
||||
log.setLevel(logging.INFO)
|
||||
if options.style:
|
||||
qt_args.extend(['-style', options.style])
|
||||
# Throw the rest of the arguments at Qt, just in case.
|
||||
|
@ -127,9 +127,6 @@ class AppLocation(object):
|
||||
CacheDir = 6
|
||||
LanguageDir = 7
|
||||
|
||||
# Base path where data/config/cache dir is located
|
||||
BaseDir = None
|
||||
|
||||
@staticmethod
|
||||
def get_directory(dir_type=1):
|
||||
"""
|
||||
@ -155,8 +152,6 @@ class AppLocation(object):
|
||||
os.path.abspath(os.path.split(sys.argv[0])[0]),
|
||||
_get_os_dir_path(dir_type))
|
||||
return os.path.join(app_path, u'i18n')
|
||||
elif dir_type == AppLocation.DataDir and AppLocation.BaseDir:
|
||||
return os.path.join(AppLocation.BaseDir, 'data')
|
||||
else:
|
||||
return _get_os_dir_path(dir_type)
|
||||
|
||||
|
@ -30,137 +30,16 @@
|
||||
Configuration file for pytest framework.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import logging
|
||||
|
||||
import py.path
|
||||
from PyQt4 import QtCore
|
||||
from sqlalchemy.orm import clear_mappers
|
||||
|
||||
from openlp.core import main as openlp_main
|
||||
from openlp.core.utils import AppLocation
|
||||
from openlp.core.lib.db import Manager
|
||||
from openlp.plugins.songs.lib.db import init_schema
|
||||
|
||||
TESTS_PATH = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
RESOURCES_PATH = os.path.join(TESTS_PATH, 'resources')
|
||||
SONGS_PATH = os.path.join(RESOURCES_PATH, 'songs')
|
||||
|
||||
|
||||
# class to setup and teardown settings for running openlp tests
|
||||
class OpenLPRunner(object):
|
||||
def __init__(self, tmpdir):
|
||||
self.tmpdir = tmpdir
|
||||
self._setup_qapp()
|
||||
self._setup_logging()
|
||||
self._cleanup_qsettings()
|
||||
# override data dir of OpenLP - it points to tmpdir of a test case
|
||||
AppLocation.BaseDir = tmpdir.strpath
|
||||
|
||||
def _setup_qapp(self):
|
||||
QtCore.QCoreApplication.setOrganizationName(u'OpenLP')
|
||||
QtCore.QCoreApplication.setOrganizationDomain(u'openlp.org')
|
||||
QtCore.QCoreApplication.setApplicationName(u'TestOpenLP')
|
||||
|
||||
def _setup_logging(self):
|
||||
# set up logging to stderr/stdout (console)
|
||||
_handler = logging.StreamHandler(stream=None)
|
||||
_handler.setFormatter(logging.Formatter(
|
||||
u'%(asctime)s %(name)-55s %(levelname)-8s %(message)s'))
|
||||
logging.addLevelName(15, u'Timer')
|
||||
log = logging.getLogger()
|
||||
log.addHandler(_handler)
|
||||
log.setLevel(logging.DEBUG)
|
||||
|
||||
def _cleanup_qsettings(self):
|
||||
# Clean up QSettings for all plugins
|
||||
# The issue with QSettings is that is global for a running process
|
||||
# and thus it is necessary to clean it before another test case.
|
||||
# If it would not be cleaned up it could be saved in the system.
|
||||
s = QtCore.QSettings()
|
||||
keys = s.allKeys()
|
||||
for k in keys:
|
||||
s.setValue(k, None)
|
||||
|
||||
## Public interface
|
||||
|
||||
def get_songs_db(self, empty=False):
|
||||
# return initialized db Manager with empty db or db containing
|
||||
# some example songs
|
||||
|
||||
if not empty:
|
||||
# copy test data to tmpdir
|
||||
datadir = self.tmpdir.mkdir(u'data').mkdir(u'songs')
|
||||
orig_db = py.path.local(SONGS_PATH).join('songs.sqlite')
|
||||
orig_db.copy(datadir)
|
||||
|
||||
manager = Manager('songs', init_schema)
|
||||
return manager
|
||||
|
||||
def get_app(self):
|
||||
# return QGui.QApplication of OpenLP - this object allows
|
||||
# running different gui tests and allows access to gui objects
|
||||
# (e.g MainWindow etc.)
|
||||
# To allow creating multiple instances of OpenLP in one process
|
||||
# it would be necessary use diffrent configuration and data files.
|
||||
# Created instance will use your OpenLP settings.
|
||||
# Test function argument to make openlp gui instance persistent for all tests.
|
||||
# All test cases have to access the same instance. To allow create multiple
|
||||
# instances it would be necessary use diffrent configuraion and data files.
|
||||
# Created instance will use your OpenLP settings.
|
||||
def pytest_funcarg__openlpapp(request):
|
||||
def setup():
|
||||
return openlp_main(['--testing'])
|
||||
|
||||
def teardown(self):
|
||||
# clean up code to run after running the test case
|
||||
self._cleanup_qsettings()
|
||||
# sqlalchemy allows to map classess to only one database at a time
|
||||
clear_mappers()
|
||||
# set data dir to original value
|
||||
AppLocation.BaseDir = None
|
||||
|
||||
|
||||
# Paths with resources for tests
|
||||
def pytest_funcarg__pth(request):
|
||||
def setup():
|
||||
class Pth(object):
|
||||
def __init__(self):
|
||||
self.tests = py.path.local(TESTS_PATH)
|
||||
self.resources = py.path.local(RESOURCES_PATH)
|
||||
self.songs = py.path.local(SONGS_PATH)
|
||||
return Pth()
|
||||
return request.cached_setup(setup=setup, scope='session')
|
||||
|
||||
|
||||
# Test function argument giving access to OpenLP runner
|
||||
def pytest_funcarg__openlp_runner(request):
|
||||
def setup():
|
||||
return OpenLPRunner(request.getfuncargvalue('tmpdir'))
|
||||
def teardown(openlp_runner):
|
||||
openlp_runner.teardown()
|
||||
return request.cached_setup(setup=setup, teardown=teardown, scope='function')
|
||||
|
||||
|
||||
class OpenLyricsValidator(object):
|
||||
"""Validate xml if it conformns to OpenLyrics xml schema."""
|
||||
def __init__(self, script, schema):
|
||||
self.cmd = [sys.executable, script, schema]
|
||||
|
||||
def validate(self, file_path):
|
||||
self.cmd.append(file_path)
|
||||
print self.cmd
|
||||
retcode = subprocess.call(self.cmd)
|
||||
if retcode == 0:
|
||||
# xml conforms to schema
|
||||
return True
|
||||
else:
|
||||
# xml has invalid syntax
|
||||
return False
|
||||
|
||||
|
||||
# Test function argument giving access to song database.
|
||||
def pytest_funcarg__openlyrics_validator(request):
|
||||
def setup():
|
||||
script = os.path.join(RESOURCES_PATH, 'openlyrics', 'validate.py')
|
||||
schema = os.path.join(RESOURCES_PATH, 'openlyrics',
|
||||
'openlyrics_schema.rng')
|
||||
return OpenLyricsValidator(script, schema)
|
||||
return request.cached_setup(setup=setup, scope='session')
|
||||
def teardown(app):
|
||||
pass
|
||||
return request.cached_setup(setup=setup, teardown=teardown, scope='session')
|
||||
|
@ -1,472 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
|
||||
ns="http://openlyrics.info/namespace/2009/song">
|
||||
|
||||
<!-- TOP LEVEL -->
|
||||
|
||||
<start>
|
||||
<element name="song">
|
||||
<ref name="songAttributes"/>
|
||||
<ref name="properties"/>
|
||||
<optional>
|
||||
<ref name="format"/>
|
||||
</optional>
|
||||
<ref name="lyrics"/>
|
||||
</element>
|
||||
</start>
|
||||
|
||||
<define name="properties">
|
||||
<element name="properties">
|
||||
<interleave> <!-- allow occur in any order -->
|
||||
<!-- at least one title is always required -->
|
||||
<ref name="titles"/>
|
||||
<!-- other properties items are optional -->
|
||||
<optional>
|
||||
<ref name="authors"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="copyright"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="ccliNo"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="releaseDate"/>
|
||||
</optional>
|
||||
<!-- Music Info -->
|
||||
<optional>
|
||||
<ref name="transposition"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="tempo"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="key"/>
|
||||
</optional>
|
||||
<!-- Other Info -->
|
||||
<optional>
|
||||
<ref name="variant"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="publisher"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="customVersion"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="keywords"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="verseOrder"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="songbooks"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="themes"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="comments"/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="format">
|
||||
<element name="format">
|
||||
<ref name="formatTags"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
|
||||
<define name="lyrics">
|
||||
<element name="lyrics">
|
||||
<!-- at least one verse is required -->
|
||||
<oneOrMore>
|
||||
<ref name="verse"/>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<!-- PROPERTIES -->
|
||||
|
||||
<define name="titles">
|
||||
<element name="titles">
|
||||
<oneOrMore>
|
||||
<element name="title">
|
||||
<ref name="nonEmptyContent"/>
|
||||
<optional>
|
||||
<ref name="langAttribute"/>
|
||||
<optional>
|
||||
<ref name="translitAttribute"/>
|
||||
</optional>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="original">
|
||||
<data type="boolean"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<!-- AUTHOR info -->
|
||||
|
||||
<define name="authors">
|
||||
<element name="authors">
|
||||
<oneOrMore>
|
||||
<element name="author">
|
||||
<ref name="nonEmptyContent"/>
|
||||
<optional>
|
||||
<choice>
|
||||
<attribute name="type">
|
||||
<choice>
|
||||
<value>words</value>
|
||||
<value>music</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<!-- when attrib 'type' value is 'translation' require attribute 'lang'.
|
||||
'xml:lang' can't be used. xml:lang means in what language is the
|
||||
content of an element and this is not the case. -->
|
||||
<group>
|
||||
<attribute name="type">
|
||||
<value>translation</value>
|
||||
</attribute>
|
||||
<ref name="langAttribute"/>
|
||||
</group>
|
||||
</choice>
|
||||
</optional>
|
||||
</element>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="copyright">
|
||||
<element name="copyright">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="ccliNo">
|
||||
<element name="ccliNo">
|
||||
<data type="positiveInteger"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="releaseDate">
|
||||
<element name="releaseDate">
|
||||
<!-- allowed values
|
||||
1779
|
||||
1779-12
|
||||
1779-12-31
|
||||
1779-12-31T13:15:30+01:00 -->
|
||||
<choice>
|
||||
<data type="gYear"/>
|
||||
<data type="gYearMonth"/>
|
||||
<data type="date"/>
|
||||
<data type="dateTime"/>
|
||||
</choice>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<!-- MUSIC INFO -->
|
||||
|
||||
<define name="transposition">
|
||||
<element name="transposition">
|
||||
<data type="integer">
|
||||
<param name="minInclusive">-99</param>
|
||||
<param name="maxInclusive">99</param>
|
||||
</data>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="tempo">
|
||||
<element name="tempo">
|
||||
<choice>
|
||||
<!-- attrib 'type' value 'bpm' - beatss per minute required -->
|
||||
<group>
|
||||
<data type="positiveInteger">
|
||||
<param name="minInclusive">30</param>
|
||||
<param name="maxInclusive">250</param>
|
||||
</data>
|
||||
<attribute name="type">
|
||||
<value>bpm</value>
|
||||
</attribute>
|
||||
</group>
|
||||
<!-- attrib 'type' value 'text' - any text -->
|
||||
<group>
|
||||
<ref name="nonEmptyContent"/>
|
||||
<attribute name="type">
|
||||
<value>text</value>
|
||||
</attribute>
|
||||
</group>
|
||||
</choice>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
|
||||
<define name="key">
|
||||
<element name="key">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<!-- OTHER INFO -->
|
||||
|
||||
<define name="variant">
|
||||
<element name="variant">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="publisher">
|
||||
<element name="publisher">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="customVersion">
|
||||
<element name="customVersion">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="keywords">
|
||||
<element name="keywords">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="verseOrder">
|
||||
<element name="verseOrder">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<ref name="verseNameType"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="songbooks">
|
||||
<element name="songbooks">
|
||||
<oneOrMore>
|
||||
<element name="songbook">
|
||||
<attribute name="name">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</attribute>
|
||||
<optional>
|
||||
<!-- 'entry' is like song number but song number must not
|
||||
always be integer and it can contain letters.
|
||||
examples: '153c' or '023', etc. -->
|
||||
<attribute name="entry">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="themes">
|
||||
<element name="themes">
|
||||
<oneOrMore>
|
||||
<element name="theme">
|
||||
<ref name="nonEmptyContent"/>
|
||||
<optional>
|
||||
<!-- id: line in a ccli theme list from
|
||||
http://www.ccli.com.au/owners/themes.cfm -->
|
||||
<attribute name="id">
|
||||
<data type="positiveInteger">
|
||||
<param name="minInclusive">1</param>
|
||||
<param name="maxInclusive">999</param>
|
||||
</data>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="langAttribute"/>
|
||||
<optional>
|
||||
<ref name="translitAttribute"/>
|
||||
</optional>
|
||||
</optional>
|
||||
</element>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="comments">
|
||||
<element name="comments">
|
||||
<oneOrMore>
|
||||
<element name="comment">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<!-- FORMAT -->
|
||||
|
||||
<define name="formatTags">
|
||||
<!-- Allow only one set of formatting tags for lyrics -->
|
||||
<element name="tags">
|
||||
<attribute name="application">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</attribute>
|
||||
<oneOrMore>
|
||||
<ref name="formatTagsTag"/>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="formatTagsTag">
|
||||
<element name="tag">
|
||||
<attribute name="name">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</attribute>
|
||||
<element name="open">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
<element name="close">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<!-- LYRICS -->
|
||||
|
||||
<define name="verse">
|
||||
<element name="verse">
|
||||
<ref name="verseAttributes"/>
|
||||
<optional>
|
||||
<ref name="langAttribute"/>
|
||||
<optional>
|
||||
<ref name="translitAttribute"/>
|
||||
</optional>
|
||||
</optional>
|
||||
<oneOrMore>
|
||||
<ref name="lines"/>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="lines">
|
||||
<element name="lines">
|
||||
<optional>
|
||||
<attribute name="part">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="break">
|
||||
<value>optional</value>
|
||||
</attribute>
|
||||
</optional>
|
||||
<oneOrMore>
|
||||
<optional>
|
||||
<element name="comment">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</element>
|
||||
</optional>
|
||||
<element name="line">
|
||||
<!-- allow tag chord inside regular text - mixed content -->
|
||||
<zeroOrMore>
|
||||
<optional>
|
||||
<ref name="chord"/>
|
||||
</optional>
|
||||
<!-- allow tag 'tag' inside regular text - mixed content -->
|
||||
<optional>
|
||||
<ref name="tag"/>
|
||||
</optional>
|
||||
<text/>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="chord">
|
||||
<element name="chord">
|
||||
<attribute name="name">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</attribute>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="tag">
|
||||
<element name="tag">
|
||||
<attribute name="name">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</attribute>
|
||||
<!-- allow using more formatting tags for text -->
|
||||
<!-- e.g. <tag name="bold"><tag name="red">my text</tag></tag> -->
|
||||
<choice>
|
||||
<ref name="nonEmptyContent"/>
|
||||
<ref name="tag"/>
|
||||
</choice>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="verseAttributes">
|
||||
<attribute name="name">
|
||||
<ref name="verseNameType"/>
|
||||
</attribute>
|
||||
</define>
|
||||
|
||||
<define name="songAttributes">
|
||||
<!-- by default: value of type string is required in attr -->
|
||||
<attribute name="version">
|
||||
<data type="NMTOKEN"> <!-- one word value -->
|
||||
<!-- allow only values like: '0.1' '11.2' '13.14.15' -->
|
||||
<param name="pattern">[0-9]+\.[0-9]+(\.[0-9]+)?</param>
|
||||
</data>
|
||||
</attribute>
|
||||
<attribute name="createdIn">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</attribute>
|
||||
<attribute name="modifiedIn">
|
||||
<ref name="nonEmptyContent"/>
|
||||
</attribute>
|
||||
<attribute name="modifiedDate">
|
||||
<!-- date format: ISO 8601 -->
|
||||
<data type="dateTime"/>
|
||||
</attribute>
|
||||
</define>
|
||||
|
||||
<define name="verseNameType">
|
||||
<choice>
|
||||
<data type="NMTOKEN">
|
||||
<param name="minLength">1</param>
|
||||
<!-- verse - v1, v2, v1a, ... 3 letters: [verse][verse_number][verse_part]
|
||||
chorus c, c1, c2, c1a, ca, ...
|
||||
pre-chorus - p, p1, p2, p1a, pa, ...
|
||||
bridge - b, b1, b2, b1a, ba, ...
|
||||
ending - e, e1, e2, e1a, ea, ... -->
|
||||
<param name="pattern">(v[1-9]\d?[a-z]?)|([cpb][a-z]?)|([cpbe][1-9]\d?[a-z]?)</param>
|
||||
</data>
|
||||
<!-- custom values of verse name - one word name -->
|
||||
<data type="NMTOKEN"/>
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
<define name="langAttribute">
|
||||
<attribute name="lang">
|
||||
<data type="language"/>
|
||||
</attribute>
|
||||
</define>
|
||||
|
||||
<!-- transliteration -->
|
||||
<define name="translitAttribute">
|
||||
<attribute name="translit">
|
||||
<data type="language"/>
|
||||
</attribute>
|
||||
</define>
|
||||
|
||||
<define name="nonEmptyContent">
|
||||
<data type="string">
|
||||
<param name="minLength">1</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
</grammar>
|
@ -1,26 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
|
||||
try:
|
||||
from lxml import etree
|
||||
except ImportError:
|
||||
print('Python module "lxml" is required')
|
||||
exit(1)
|
||||
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print('Usage: python %s openlyrics_schema.rng xmlfile.xml' % __file__)
|
||||
exit(1)
|
||||
|
||||
|
||||
relaxng_file = sys.argv[1]
|
||||
xml_file = sys.argv[2]
|
||||
|
||||
relaxng_doc = etree.parse(relaxng_file)
|
||||
xml_doc = etree.parse(xml_file)
|
||||
|
||||
relaxng = etree.RelaxNG(relaxng_doc)
|
||||
|
||||
relaxng.assertValid(xml_doc)
|
||||
|
@ -1,102 +0,0 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<song xmlns="http://openlyrics.info/namespace/2009/song" version="0.8" createdIn="OpenLP 1.9.5" modifiedIn="OpenLP 1.9.5" modifiedDate="2011-09-06T20:49:59">
|
||||
<properties>
|
||||
<titles>
|
||||
<title>Jezu Kriste, štědrý kněže</title>
|
||||
</titles>
|
||||
<authors>
|
||||
<author>M. Jan Hus</author>
|
||||
</authors>
|
||||
<songbooks>
|
||||
<songbook name="Jistebnický kancionál"/>
|
||||
</songbooks>
|
||||
</properties>
|
||||
<format>
|
||||
<tags application="OpenLP">
|
||||
<tag name="r">
|
||||
<open><span style="-webkit-text-fill-color:red"></open>
|
||||
<close></span></close>
|
||||
</tag>
|
||||
<tag name="bl">
|
||||
<open><span style="-webkit-text-fill-color:blue"></open>
|
||||
<close></span></close>
|
||||
</tag>
|
||||
<tag name="y">
|
||||
<open><span style="-webkit-text-fill-color:yellow"></open>
|
||||
<close></span></close>
|
||||
</tag>
|
||||
<tag name="o">
|
||||
<open><span style="-webkit-text-fill-color:#FFA500"></open>
|
||||
<close></span></close>
|
||||
</tag>
|
||||
<tag name="st">
|
||||
<open><strong></open>
|
||||
<close></strong></close>
|
||||
</tag>
|
||||
<tag name="it">
|
||||
<open><em></open>
|
||||
<close></em></close>
|
||||
</tag>
|
||||
<tag name="g">
|
||||
<open><span style="-webkit-text-fill-color:green"></open>
|
||||
<close></span></close>
|
||||
</tag>
|
||||
</tags>
|
||||
</format>
|
||||
<lyrics>
|
||||
<verse name="v1">
|
||||
<lines>
|
||||
<line><tag name="r">Jezu Kriste</tag>, štědrý kněže,</line>
|
||||
<line>s <tag name="bl">Otcem, Duchem</tag> jeden <tag name="y">Bože</tag>,</line>
|
||||
<line>štědrost Tvá je naše zboží,</line>
|
||||
<line>z <tag name="o"><tag name="st">Tvé</tag></tag> <tag name="it">milosti</tag>.</line>
|
||||
</lines>
|
||||
</verse>
|
||||
<verse name="v2">
|
||||
<lines>
|
||||
<line><tag name="bl">Ty</tag> jsi v světě, bydlil s námi,</line>
|
||||
<line>Tvé tělo trpělo rány</line>
|
||||
<line>za nás za hříšné křesťany,</line>
|
||||
<line>z <tag name="bl">Tvé</tag> milosti.</line>
|
||||
</lines>
|
||||
</verse>
|
||||
<verse name="v3">
|
||||
<lines>
|
||||
<line>Ó, <tag name="g">Tvá dobroto</tag> důstojná</line>
|
||||
<line>a k nám milosti přehojná!</line>
|
||||
<line>Dáváš nám bohatství mnohá</line>
|
||||
<line>
|
||||
<tag name="st">
|
||||
<tag name="y">z Tvé milosti.</tag>
|
||||
</tag>
|
||||
</line>
|
||||
</lines>
|
||||
</verse>
|
||||
<verse name="v4">
|
||||
<lines>
|
||||
<line>Ráčils nás sám zastoupiti,</line>
|
||||
<line>
|
||||
<tag name="it">život za nás položiti,</tag>
|
||||
</line>
|
||||
<line>tak smrt věčnou zahladiti,</line>
|
||||
<line>z Tvé milosti.</line>
|
||||
</lines>
|
||||
</verse>
|
||||
<verse name="v5">
|
||||
<lines>
|
||||
<line>Ó, křesťané, z bludů vstaňme,</line>
|
||||
<line>dané dobro nám poznejme,</line>
|
||||
<line>k Synu Božímu chvátejme,</line>
|
||||
<line>k té milosti!</line>
|
||||
</lines>
|
||||
</verse>
|
||||
<verse name="v6">
|
||||
<lines>
|
||||
<line>Chvála budiž Bohu Otci,</line>
|
||||
<line>Synu jeho téže moci,</line>
|
||||
<line>Duchu jeho rovné moci,</line>
|
||||
<line>z též milosti!</line>
|
||||
</lines>
|
||||
</verse>
|
||||
</lyrics>
|
||||
</song>
|
Binary file not shown.
@ -26,18 +26,11 @@
|
||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||
###############################################################################
|
||||
|
||||
"""
|
||||
GUI tests
|
||||
"""
|
||||
|
||||
from openlp.core import OpenLP
|
||||
from openlp.core.ui.mainwindow import MainWindow
|
||||
|
||||
|
||||
# TODO Uncommend when using custom OpenLP configuration is implemented.
|
||||
# Otherwise it would mess up user's OpenLP settings
|
||||
#def test_start_app(openlp_runner):
|
||||
#app = openlp_runner.get_app()
|
||||
#assert type(app) == OpenLP
|
||||
#assert type(app.mainWindow) == MainWindow
|
||||
#assert unicode(app.mainWindow.windowTitle()) == u'OpenLP 2.0'
|
||||
def test_start_app(openlpapp):
|
||||
assert type(openlpapp) == OpenLP
|
||||
assert type(openlpapp.mainWindow) == MainWindow
|
||||
assert unicode(openlpapp.mainWindow.windowTitle()) == u'OpenLP 2.0'
|
||||
|
@ -1,57 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
||||
|
||||
###############################################################################
|
||||
# OpenLP - Open Source Lyrics Projection #
|
||||
# --------------------------------------------------------------------------- #
|
||||
# Copyright (c) 2008-2011 Raoul Snyman #
|
||||
# Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan #
|
||||
# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
|
||||
# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias #
|
||||
# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
|
||||
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund #
|
||||
# --------------------------------------------------------------------------- #
|
||||
# This program is free software; you can redistribute it and/or modify it #
|
||||
# under the terms of the GNU General Public License as published by the Free #
|
||||
# Software Foundation; version 2 of the License. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
||||
# more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License along #
|
||||
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||
###############################################################################
|
||||
|
||||
"""
|
||||
OpenLyrics import/export tests
|
||||
"""
|
||||
|
||||
from lxml import etree
|
||||
|
||||
from openlp.plugins.songs.lib.db import Song
|
||||
from openlp.plugins.songs.lib import OpenLyrics
|
||||
|
||||
|
||||
def test_openlyrics_export(openlp_runner, openlyrics_validator, pth, tmpdir):
|
||||
# export song to file
|
||||
f = tmpdir.join('out.xml')
|
||||
db = openlp_runner.get_songs_db()
|
||||
s = db.get_all_objects(Song)[0]
|
||||
o = OpenLyrics(db)
|
||||
xml = o.song_to_xml(s)
|
||||
tree = etree.ElementTree(etree.fromstring(xml))
|
||||
tree.write(open(f.strpath, u'w'), encoding=u'utf-8', xml_declaration=True,
|
||||
pretty_print=True)
|
||||
# validate file
|
||||
assert openlyrics_validator.validate(f.strpath) == True
|
||||
# string comparison with original file line by line
|
||||
f_orig = pth.songs.join('openlyrics_test_1.xml')
|
||||
for l, l_orig in zip(f.readlines(), f_orig.readlines()):
|
||||
# skip line with item modifiedDate - it is unique everytime
|
||||
if l.startswith('<song xmlns='):
|
||||
continue
|
||||
assert l == l_orig
|
@ -1,76 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
||||
|
||||
###############################################################################
|
||||
# OpenLP - Open Source Lyrics Projection #
|
||||
# --------------------------------------------------------------------------- #
|
||||
# Copyright (c) 2008-2011 Raoul Snyman #
|
||||
# Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan #
|
||||
# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
|
||||
# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias #
|
||||
# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
|
||||
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund #
|
||||
# --------------------------------------------------------------------------- #
|
||||
# This program is free software; you can redistribute it and/or modify it #
|
||||
# under the terms of the GNU General Public License as published by the Free #
|
||||
# Software Foundation; version 2 of the License. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
||||
# more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License along #
|
||||
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||
###############################################################################
|
||||
|
||||
"""
|
||||
Songs database tests
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from sqlalchemy.exc import InvalidRequestError
|
||||
from sqlalchemy.orm.exc import UnmappedInstanceError
|
||||
|
||||
from openlp.plugins.songs.lib.db import Author, Book, MediaFile, Song, Topic
|
||||
|
||||
|
||||
def test_empty_songdb(openlp_runner):
|
||||
db = openlp_runner.get_songs_db(empty=True)
|
||||
g = db.get_all_objects
|
||||
assert g(Author) == []
|
||||
assert g(Book) == []
|
||||
assert g(MediaFile) == []
|
||||
assert g(Song) == []
|
||||
assert g(Topic) == []
|
||||
c = db.get_object_count
|
||||
assert c(Author) == 0
|
||||
assert c(Book) == 0
|
||||
assert c(MediaFile) == 0
|
||||
assert c(Song) == 0
|
||||
assert c(Topic) == 0
|
||||
|
||||
|
||||
def test_unmapped_class(openlp_runner):
|
||||
# test class not mapped to any sqlalchemy table
|
||||
class A(object):
|
||||
pass
|
||||
db = openlp_runner.get_songs_db(empty=True)
|
||||
assert db.save_object(A()) == False
|
||||
assert db.save_objects([A(), A()]) == False
|
||||
# no key - new object instance is created from supplied class
|
||||
assert type(db.get_object(A, key=None)) == A
|
||||
|
||||
with pytest.raises(InvalidRequestError):
|
||||
db.get_object(A, key=1)
|
||||
with pytest.raises(InvalidRequestError):
|
||||
db.get_object_filtered(A, filter_clause=None)
|
||||
with pytest.raises(InvalidRequestError):
|
||||
db.get_all_objects(A)
|
||||
with pytest.raises(InvalidRequestError):
|
||||
db.get_object_count(A)
|
||||
|
||||
assert db.delete_object(A, key=None) == False
|
||||
assert db.delete_all_objects(A) == False
|
Loading…
Reference in New Issue
Block a user