From 98d9506db4e98e8c32b09150cf23b0c568f1ca18 Mon Sep 17 00:00:00 2001 From: David Maus <maus@hab.de> Date: Mon, 14 Jan 2013 10:29:04 +0100 Subject: [PATCH] Adjust directory structure and coding style --- .gitignore | 18 +- .hgignore | 11 - build.local.xml | 6 - build.properties | 9 - build.xml | 500 ------------------ composer.json | 27 + package.xml | 82 --- phpunit.xml | 21 + phpunit.xml.dist | 28 - .../HAB/Pica/Parser/PicaPlainParser.php | 27 +- src/HAB/Pica/Reader/PicaPlainReader.php | 80 +++ src/HAB/Pica/Reader/PicaXmlReader.php | 173 ++++++ src/HAB/Pica/Reader/Reader.php | 184 +++++++ src/README.txt | 68 --- src/bin/.empty | 0 src/data/.empty | 0 src/docs/.empty | 0 src/php/.empty | 0 src/php/HAB/Pica/Reader/PicaPlainReader.php | 97 ---- src/php/HAB/Pica/Reader/PicaXmlReader.php | 173 ------ src/php/HAB/Pica/Reader/Reader.php | 176 ------ src/tests/.empty | 0 src/tests/functional-tests/.empty | 0 src/tests/integration-tests/.empty | 0 src/tests/unit-tests/.empty | 0 src/tests/unit-tests/bin/.empty | 0 src/tests/unit-tests/bootstrap.php | 39 -- src/tests/unit-tests/php/.empty | 0 .../HAB/Pica/Reader/PicaPlainReaderTest.php | 121 ----- .../php/HAB/Pica/Reader/PicaXmlReaderTest.php | 52 -- src/tests/unit-tests/www/.empty | 0 src/www/.empty | 0 tests/bootstrap.php | 30 ++ .../tests => tests}/fixtures/single_record.pp | 0 .../fixtures/single_record.xml | 0 .../HAB/Pica/Reader/PicaPlainReaderTest.php | 133 +++++ .../src/HAB/Pica/Reader/PicaXmlReaderTest.php | 57 ++ 37 files changed, 727 insertions(+), 1385 deletions(-) delete mode 100644 .hgignore delete mode 100644 build.local.xml delete mode 100644 build.properties delete mode 100644 build.xml create mode 100644 composer.json delete mode 100644 package.xml create mode 100644 phpunit.xml delete mode 100644 phpunit.xml.dist rename src/{php => }/HAB/Pica/Parser/PicaPlainParser.php (80%) create mode 100644 src/HAB/Pica/Reader/PicaPlainReader.php create mode 100644 src/HAB/Pica/Reader/PicaXmlReader.php create mode 100644 src/HAB/Pica/Reader/Reader.php delete mode 100644 src/README.txt delete mode 100644 src/bin/.empty delete mode 100644 src/data/.empty delete mode 100644 src/docs/.empty delete mode 100644 src/php/.empty delete mode 100644 src/php/HAB/Pica/Reader/PicaPlainReader.php delete mode 100644 src/php/HAB/Pica/Reader/PicaXmlReader.php delete mode 100644 src/php/HAB/Pica/Reader/Reader.php delete mode 100644 src/tests/.empty delete mode 100644 src/tests/functional-tests/.empty delete mode 100644 src/tests/integration-tests/.empty delete mode 100644 src/tests/unit-tests/.empty delete mode 100644 src/tests/unit-tests/bin/.empty delete mode 100644 src/tests/unit-tests/bootstrap.php delete mode 100644 src/tests/unit-tests/php/.empty delete mode 100644 src/tests/unit-tests/php/HAB/Pica/Reader/PicaPlainReaderTest.php delete mode 100644 src/tests/unit-tests/php/HAB/Pica/Reader/PicaXmlReaderTest.php delete mode 100644 src/tests/unit-tests/www/.empty delete mode 100644 src/www/.empty create mode 100644 tests/bootstrap.php rename {src/tests => tests}/fixtures/single_record.pp (100%) rename {src/tests => tests}/fixtures/single_record.xml (100%) create mode 100644 tests/src/HAB/Pica/Reader/PicaPlainReaderTest.php create mode 100644 tests/src/HAB/Pica/Reader/PicaXmlReaderTest.php diff --git a/.gitignore b/.gitignore index d490c49..1042105 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,11 @@ -.build -dist -.tmp -nbproject -review +*~ +\#* +.\#* +TAGS +ChangeLog vendor -\#*# -.#*# -TAGS \ No newline at end of file +review +build +composer.phar +composer.lock +test.php diff --git a/.hgignore b/.hgignore deleted file mode 100644 index 7c31106..0000000 --- a/.hgignore +++ /dev/null @@ -1,11 +0,0 @@ -syntax: glob - -.build -.dist -nbproject -review -tmp -vendor -\#*# -.#*# -TAGS \ No newline at end of file diff --git a/build.local.xml b/build.local.xml deleted file mode 100644 index 90aa3bc..0000000 --- a/build.local.xml +++ /dev/null @@ -1,6 +0,0 @@ -<project name="local" default="help"> - <target name="help"> - <echo message="This component has no local build targets." /> - </target> -</project> -<!-- vim: set tabstop=2 shiftwidth=2 expandtab: --> diff --git a/build.properties b/build.properties deleted file mode 100644 index bc00f56..0000000 --- a/build.properties +++ /dev/null @@ -1,9 +0,0 @@ -project.name=PicaReader -project.channel=hab20.hab.de/service/pear -project.majorVersion=0 -project.minorVersion=1 -project.patchLevel=0 -project.snapshot=true - -component.type=php-library -component.version=11 diff --git a/build.xml b/build.xml deleted file mode 100644 index 058dd58..0000000 --- a/build.xml +++ /dev/null @@ -1,500 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- build file for phing --> -<project default="help" basedir="."> - <!-- Human-readable info about our component --> - <property file="build.properties" /> - <taskdef name="now" classname="Phix_Project.ComponentManager.Phing.NowTask" /> - <now name="date.now"/> - <if> - <and> - <isset property="project.snapshot"/> - <istrue value="${project.snapshot}"/> - </and> - <then> - <property name="project.version" value="${project.majorVersion}.${project.minorVersion}.${project.patchLevel}snapshot${date.now}" /> - <property name="project.stability" value="snapshot" /> - </then> - <else> - <property name="project.version" value="${project.majorVersion}.${project.minorVersion}.${project.patchLevel}" /> - <property name="project.stability" value="stable" /> - </else> - </if> - <property name="project.apiversion" value="${project.majorVersion}.${project.minorVersion}" /> - - <!-- Paths to the directories that we work with --> - <property name="project.srcdir" value="${project.basedir}/src" override="true" /> - <property name="project.src.phpdir" value="${project.srcdir}/php" override="true" /> - <property name="project.src.bindir" value="${project.srcdir}/bin" override="true" /> - <property name="project.src.datadir" value="${project.srcdir}/data" override="true" /> - <property name="project.src.docdir" value="${project.srcdir}/docs" override="true" /> - <property name="project.src.testdir" value="${project.srcdir}/tests" override="true" /> - <property name="project.src.wwwdir" value="${project.srcdir}/www" override="true" /> - <property name="project.src.testunitdir" value="${project.src.testdir}/unit-tests" override="true" /> - <property name="project.src.testintdir" value="${project.src.testdir}/integration-tests" override="true" /> - <property name="project.src.testfuncdir" value="${project.src.testdir}/functional-tests" override="true" /> - - <property name="project.reviewdir" value="${project.basedir}/review" override="true" /> - <property name="project.review.logsdir" value="${project.basedir}/review/logs" override="true" /> - <property name="project.review.docsdir" value="${project.reviewdir}/docs" override="true" /> - <property name="project.review.codebrowserdir" value="${project.reviewdir}/code-browser" override="true" /> - <property name="project.review.codecoveragedir" value="${project.reviewdir}/code-coverage" override="true" /> - - <property name="project.builddir" value="${project.basedir}/.build" override="true" /> - <property name="project.pkgdir" value="${project.builddir}/${project.name}-${project.version}" override="true" /> - <property name="project.tmpdir" value="${project.basedir}/.tmp" override="true" /> - - <property name="project.vendordir" value="${project.basedir}/vendor" override="true" /> - <property name="project.vendor.bindir" value="${project.vendordir}/bin" override="true" /> - <property name="project.vendor.datadir" value="${project.vendordir}/data" override="true" /> - <property name="project.vendor.phpdir" value="${project.vendordir}/php" override="true" /> - <property name="project.vendor.testdir" value="${project.vendordir}/tests" override="true" /> - <property name="project.vendor.docdir" value="${project.vendordir}/docs" override="true" /> - <property name="project.vendor.wwwdir" value="${project.vendordir}/www" override="true" /> - - <property name="project.distdir" value="${project.basedir}/dist" /> - <property name="project.distdir.lastBuilt" value="${project.basedir}/dist/lastBuilt" /> - <property name="project.tarfilename" value="${project.name}-${project.version}.tgz" /> - <property name="project.tarfile" value="${project.distdir}/${project.tarfilename}" /> - - <!-- what was the last PEAR package we created, if any? --> - <if> - <available file="${project.distdir.lastBuilt}"/> - <then> - <property file="${project.distdir.lastBuilt}"/> - </then> - <else> - <property name="project.lastBuiltTarfile" value="false"/> - </else> - </if> - - <!-- override this if you want to run additional PEAR commands --> - <property name="pear.cmd" value="" override="true" /> - - <!-- lists of the files that make up our package --> - <fileset dir="${project.src.bindir}" id="binfiles"> - <include name="**/**"/> - <exclude name="**/.DS_Store"/> - <exclude name="**/.empty"/> - <exclude name="**/.svn"/> - </fileset> - <fileset dir="${project.src.datadir}" id="datafiles"> - <include name="**/**"/> - <exclude name="**/.DS_Store"/> - <exclude name="**/.empty"/> - <exclude name="**/.svn"/> - </fileset> - <fileset dir="${project.src.phpdir}" id="phpfiles"> - <include name="**/**"/> - <exclude name="**/.DS_Store"/> - <exclude name="**/.empty"/> - <exclude name="**/.svn"/> - </fileset> - <fileset dir="${project.src.testunitdir}/php" id="testfiles"> - <include name="**/**"/> - <exclude name="**/.DS_Store"/> - <exclude name="**/.empty"/> - <exclude name="**/.svn"/> - </fileset> - <fileset dir="${project.src.wwwdir}" id="wwwfiles"> - <include name="**/**" /> - <exclude name="**/.DS_Store"/> - <exclude name="**/.empty"/> - <exclude name="**/.svn"/> - </fileset> - <fileset dir="${project.src.docdir}" id="docfiles"> - <include name="**/**" /> - <exclude name="**/.DS_Store"/> - <exclude name="**/.empty"/> - <exclude name="**/.svn"/> - </fileset> - <fileset dir="${project.basedir}" id="topleveldocfiles"> - <include name="*.txt" /> - <include name="*.md" /> - </fileset> - - <taskdef name="phingcallifexists" classname="Phix_Project.ComponentManager.Phing.PhingCallIfExistsTask" /> - <import file="build.local.xml"/> - - <!-- Tell the user what this build file supports --> - <target name="help"> - <echo message="${project.name} ${project.version}: build.xml targets:" /> - <echo message="" /> - <echo message="Setup your dev environment:" /> - <echo message="" /> - <echo message=" build-vendor" /> - <echo message=" Populate vendor/ with this package's dependencies" /> - <echo message=" vendor-pear" /> - <echo message=" Run additional PEAR commands inside the vendor folder" /> - <echo message="" /> - <echo message="Develop your code:" /> - <echo message="" /> - <echo message=" lint" /> - <echo message=" Check the PHP files for syntax errors" /> - <echo message=" test" /> - <echo message=" Run the component's PHPUnit tests" /> - <echo message=" code-review" /> - <echo message=" Run all of the code quality targets:" /> - <echo message="" /> - <echo message=" code-browser" /> - <echo message=" Run code quality tests for PHP_CodeBrowser" /> - <echo message=" phpcpd" /> - <echo message=" Check for cut and paste problems" /> - <echo message=" phploc" /> - <echo message=" Calculate the size of your PHP project" /> - <echo message=" phpdoc" /> - <echo message=" Create the PHP docs from source code" /> - <echo message="" /> - <echo message="Publish your component:" /> - <echo message="" /> - <echo message=" pear-package" /> - <echo message=" Create a PEAR-compatible package" /> - <echo message=" publish-local" /> - <echo message=" Publish your PEAR-compatible package into a local copy" /> - <echo message=" of your PEAR channel" /> - <echo message=" install-vendor" /> - <echo message=" Install this component from source into vendor/" /> - <echo message=" install-system" /> - <echo message=" Install this component from source for all local users" /> - <echo message=" You must be root to run this target on Linux!!" /> - <echo message=""/> - <echo message="Maintain your component:"/> - <echo message=""/> - <echo message=" upgrade-skeleton"/> - <echo message=" Upgrade the skeleton files for this component"/> - <echo message=""/> - <echo message="Additional targets:" /> - <echo message=""/> - <echo message=" clean" /> - <echo message=" Remove all temporary folders created by this build file" /> - <echo message=" version" /> - <echo message=" Show this component's version from build.properties" /> - <echo message="" /> - <phingcallifexists target="local.help" /> - </target> - - <!-- Show the current version, as set in build.properties --> - <!-- This is just to be a time-saver --> - <target name="version"> - <echo message="${project.version}" /> - </target> - - <!-- Run PHP lint on all of the source code --> - <target name="lint"> - <phplint> - <fileset dir="${project.src.phpdir}"> - <include name="**/*.php" /> - </fileset> - </phplint> - <phingcallifexists target="local.lint" /> - </target> - - <!-- Run the unit tests for this module --> - <target name="run-unittests" depends="lint"> - <!-- Make sure vendor/ folder exists --> - <if> - <not> - <available file="${project.vendordir}" type="dir"/> - </not> - <then> - <phingcall target="build-vendor"/> - </then> - </if> - - <!-- do we have any tests? --> - <!-- currently cannot think of a reliable way to test this in phing --> - - <!-- run the tests --> - <delete dir="${project.review.codecoveragedir}" /> - <mkdir dir="${project.review.codecoveragedir}" /> - <mkdir dir="${project.review.logsdir}" /> - <exec command="phpunit" checkreturn="true" logoutput="true"/> - <echo/> - <echo>The code coverage report is in file://${project.review.codecoveragedir}</echo> - <echo/> - </target> - - <!-- Run all the tests for this module --> - <target name="test" depends="run-unittests"> - <phingcallifexists target="local.test"/> - </target> - - <!-- Run the code review quality tests --> - <target name="code-review" depends="run-unittests, code-browser, phpcpd, pdepend, phploc"> - <phingcallifexists target="local.code-review"/> - </target> - - <!-- Run all of the targets for setting up the code browser --> - <target name="code-browser" depends="phpmd, phpcs, phpcb"> - <phingcallifexists target="local.code-browser"/> - </target> - - <target name="pdepend"> - <mkdir dir="${project.review.logsdir}" /> - <exec command="pdepend --phpunit-xml=${project.review.logsdir}/pdepend.xml --jdepend-xml=${project.review.logsdir}/jdepend.xml --jdepend-chart=${project.review.logsdir}/dependencies.svg --overview-pyramid=${project.review.logsdir}/overview-pyramid.svg ${project.src.phpdir}" logoutput="true"/> - </target> - - <!-- Generate package docs --> - <target name="phpdoc"> - <mkdir dir="${project.review.logsdir}" /> - <exec command="phpdoc -d ${project.src.phpdir} -t ${project.review.docsdir}" logoutput="true"/> - <echo message="You will find the PHPDoc for your project at: ${project.review.docsdir}/index.html"/> - <phingcallifexists target="local.phpdoc"/> - </target> - - <!-- Check code for code smells --> - <target name="phpmd"> - <mkdir dir="${project.review.logsdir}" /> - <exec command="phpmd ${project.src.phpdir} xml codesize,design,naming,unusedcode --reportfile ${project.review.logsdir}/phpmd.xml" logoutput="true" /> - </target> - - <target name="phpcpd"> - <mkdir dir="${project.review.logsdir}"/> - <exec command="phpcpd --log-pmd ${project.review.logsdir}/pmd-cpd.xml ${project.src.phpdir}" logoutput="true" /> - </target> - - <!-- Check the code for style violations --> - <target name="phpcs"> - <mkdir dir="${project.review.logsdir}" /> - <exec command="phpcs --report=xml --report-file=${project.review.logsdir}/checkstyle.xml --standard=${checkstyle.standard} --extensions=php ${project.src.phpdir}" logoutput="true"/> - </target> - - <!-- Build the code-browser files --> - <target name="phpcb" depends="phpmd"> - <delete dir="${project.review.codebrowserdir}" /> - <mkdir dir="${project.review.codebrowserdir}" /> - <exec command="phpcb --log ${project.review.logsdir} --source ${project.src.phpdir} --output ${project.review.codebrowserdir}" logoutput="true" /> - </target> - - <!-- Work out the size of the project --> - <target name="phploc"> - <mkdir dir="${project.review.logsdir}" /> - <exec command="phploc --log-xml ${project.review.logsdir}/phploc.xml --log-csv ${project.review.logsdir}/phploc.csv ${project.src.phpdir}" logoutput="true" /> - </target> - - <!-- Populate vendor with the dependencies for this component --> - <target name="build-vendor" depends="pear-package,setup-vendor"> - <echo>Populating vendor/ with dependencies</echo> - <exec command="phix pear:register-channels" checkreturn="true" logoutput="true" /> - <exec command="pear -c ${project.tmpdir}/pear-config install --alldeps ${project.tarfile}" logoutput="true" checkreturn="true"/> - <echo/> - <echo>Your vendor/ folder has been built.</echo> - <echo>You only need to run 'phing build-vendor' again if you change the</echo> - <echo>dependencies listed in your package.xml file.</echo> - <echo/> - <phingcallifexists target="local.buildvendor"/> - </target> - - <!-- Setup the vendor folder --> - <target name="setup-vendor"> - <echo>Creating vendor/ as a sandboxed PEAR install folder</echo> - <delete dir="${project.vendordir}" /> - <mkdir dir="${project.vendordir}" /> - <delete dir="${project.tmpdir}" /> - <mkdir dir="${project.tmpdir}" /> - <exec command="pear config-create ${project.tmpdir} ${project.tmpdir}/pear-config" checkreturn="true" logoutput="true" /> - <exec command="pear -c ${project.tmpdir}/pear-config config-set preferred_state alpha" checkreturn="true" logoutput="true" /> - <exec command="pear -c ${project.tmpdir}/pear-config config-set php_dir ${project.vendor.phpdir}" checkreturn="true" logoutput="true" /> - <exec command="pear -c ${project.tmpdir}/pear-config config-set bin_dir ${project.vendor.bindir}" checkreturn="true" logoutput="true" /> - <exec command="pear -c ${project.tmpdir}/pear-config config-set data_dir ${project.vendor.datadir}" checkreturn="true" logoutput="true" /> - <exec command="pear -c ${project.tmpdir}/pear-config config-set doc_dir ${project.vendor.docdir}" checkreturn="true" logoutput="true" /> - <exec command="pear -c ${project.tmpdir}/pear-config config-set test_dir ${project.vendor.testdir}" checkreturn="true" logoutput="true" /> - <exec command="pear -c ${project.tmpdir}/pear-config config-set www_dir ${project.vendor.wwwdir}" checkreturn="true" logoutput="true" /> - </target> - - <!-- Create the PEAR package, ready for release --> - <target name="pear-package"> - <echo>Building release directory</echo> - <delete dir="${project.builddir}" /> - <mkdir dir="${project.pkgdir}" /> - <if> - <available file="${project.src.bindir}"/> - <then> - <copy todir="${project.pkgdir}"> - <fileset refid="binfiles"/> - </copy> - </then> - </if> - <if> - <available file="${project.src.datadir}"/> - <then> - <copy todir="${project.pkgdir}"> - <fileset refid="datafiles"/> - </copy> - </then> - </if> - <if> - <available file="${project.src.docdir}"/> - <then> - <copy todir="${project.pkgdir}"> - <fileset refid="docfiles"/> - </copy> - </then> - </if> - <if> - <available file="${project.src.phpdir}"/> - <then> - <copy todir="${project.pkgdir}"> - <fileset refid="phpfiles"/> - </copy> - </then> - </if> - <if> - <available file="${project.src.testunitdir}"/> - <then> - <copy todir="${project.pkgdir}"> - <fileset refid="testfiles"/> - </copy> - </then> - </if> - <if> - <available file="${project.src.wwwdir}"/> - <then> - <copy todir="${project.pkgdir}"> - <fileset refid="wwwfiles"/> - </copy> - </then> - </if> - <copy todir="${project.pkgdir}"> - <fileset refid="topleveldocfiles"/> - </copy> - <copy todir="${project.builddir}"> - <fileset dir="."> - <include name="package.xml" /> - </fileset> - </copy> - - <exec command="phix pear:expand-package-xml" checkreturn="yes" logoutput="yes"/> - - <echo>Creating ${project.tarfile} PEAR package</echo> - - <mkdir dir="${project.distdir}" /> - <delete file="${project.tarfile}" /> - <tar destfile="${project.tarfile}" compression="gzip"> - <fileset dir="${project.builddir}"> - <include name="**/**" /> - </fileset> - </tar> - - <!-- remember the tarball we have just build --> - <property name="project.lastBuiltTarfile" value="${project.tarfile}" override="true"/> - <echo file="${project.distdir.lastBuilt}" append="false">project.lastBuiltTarfile=${project.tarfile}</echo> - - <!-- write a message to say which file we built last --> - <echo>Your PEAR package is in ${project.tarfile}</echo> - <phingcallifexists target="local.pear-package"/> - </target> - - <!-- Install the code --> - <target name="install-vendor"> - <if> - <not> - <contains string="${project.lastBuiltTarfile}" substring="${project.name}"/> - </not> - <then> - <fail message="Please run 'phing pear-package' first, then try again."/> - </then> - </if> - - <if> - <not> - <available file="${project.vendordir"/> - </not> - <then> - <phingcall target="build-vendor" /> - </then> - </if> - - <if> - <available file="${project.lastBuiltTarfile}"/> - <then> - <exec command="pear -c ${project.tmpdir}/pear-config install --alldeps -f ${project.lastBuiltTarfile}" logoutput="true" checkreturn="true"/> - <phingcallifexists target="local.install-vendor"/> - </then> - <else> - <echo>Cannot find PEAR package file ${project.lastBuiltTarfile}</echo> - <fail message="Run 'phing pear-package' to create a new PEAR package, then try again."/> - </else> - </if> - </target> - - <!-- install a package system-wide --> - <target name="install-system"> - <if> - <not> - <contains string="${project.lastBuiltTarfile}" substring="${project.name}"/> - </not> - <then> - <echo>Please run 'phing pear-package' first, then try again.</echo> - </then> - <elseif> - <available file="${project.lastBuiltTarfile}"/> - <then> - <exec command="pear install -f -a ${project.lastBuiltTarfile}" checkreturn="true" logoutput="true" /> - <phingcallifexists target="local.install-system"/> - </then> - </elseif> - <else> - <echo>Cannot find PEAR package file ${project.lastBuiltTarfile}</echo> - <echo>Run 'phing pear-package' to create a new PEAR package, then try again</echo> - </else> - </if> - </target> - - <!-- Publish to local copy of PEAR channel --> - <target name="publish-local" depends="pear-package"> - <if> - <not> - <contains string="${project.lastBuiltTarfile}" substring="${project.name}"/> - </not> - <then> - <echo>Please run 'phing pear-package' first, then try again.</echo> - </then> - <elseif> - <available file="${project.lastBuiltTarfile}"/> - <then> - <!-- get rid of any existing snapshots we may have published --> - <foreach param="packagefile" absparam="abspackagefile" target="pirum-remove-package"> - <fileset dir="${pear.local}/get"> - <include name="${project.name}*snapshot*.tgz" /> - </fileset> - </foreach> - - <!-- publish the new PEAR package --> - <exec command="pirum add ${pear.local} ${project.lastBuiltTarfile}" checkreturn="true" logoutput="true" /> - <phingcallifexists target="local.publish-local"/> - </then> - </elseif> - <else> - <echo>Cannot find PEAR package file ${project.lastBuiltTarfile}</echo> - <echo>Run 'phing pear-package' to create a new PEAR package, then try again</echo> - </else> - </if> - </target> - - <target name="pirum-remove-package"> - <exec command="pirum remove ${pear.local} ${packagefile}" logoutput="true" checkreturn="true" /> - </target> - - <!-- Run additional PEAR commands in the vendor folder --> - <target name="vendor-pear"> - <exec command="pear -c ${project.tmpdir}/pear-config ${pear.cmd}" logoutput="true" checkreturn="true" /> - </target> - - <!-- Upgrade the skeleton files here and now --> - <target name="upgrade-skeleton"> - <exec command="phix ${component.type}:upgrade ." logoutput="true" checkreturn="true" /> - <phingcallifexists target="local.upgrade-skeleton"/> - </target> - - <!-- Clean up the mess --> - <target name="clean"> - <delete dir="${project.builddir}" /> - <delete dir="${project.distdir}" /> - <delete dir="${project.reviewdir}" /> - <delete dir="${project.pkgdir}" /> - <delete dir="${project.distdir}" /> - <delete dir="${project.tmpdir}" /> - <phingcallifexists target="local.clean"/> - </target> -</project> -<!-- vim: set tabstop=2 shiftwidth=2 expandtab: --> diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..84dced5 --- /dev/null +++ b/composer.json @@ -0,0 +1,27 @@ +{ + "name": "hab/picareader", + "description": "Classes for reading Pica+ records encoded in Pica, PicaXML and PicaPlain", + "type": "library", + "license": "GPL-3.0+", + "authors": [ + { + "name": "David Maus", + "email": "maus@hab.de", + "role": "Developer" + } + ], + "support": { + "email": "maus@hab.de" + }, + "repositories": [ + { "type": "vcs", "url": "http://github.com/dmj/PicaRecord"} + ], + "require": { + "hab/picarecord": "dev-next" + }, + "autoload": { + "psr-0": { + "HAB\\Pica": "src/" + } + } +} diff --git a/package.xml b/package.xml deleted file mode 100644 index 2f2ab8d..0000000 --- a/package.xml +++ /dev/null @@ -1,82 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<package packagerversion="1.9.1" version="2.0" - xmlns="http://pear.php.net/dtd/package-2.0" - xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 - http://pear.php.net/dtd/tasks-1.0.xsd - http://pear.php.net/dtd/package-2.0 - http://pear.php.net/dtd/package-2.0.xsd"> - <name>${project.name}</name> - <channel>${project.channel}</channel> - <summary>Classes for reading Pica+ records</summary> - <description> - This package provides classes for reading Pica+ records encoded in - PicaXML or PicaPlain. - </description> - <lead> - <name>David Maus</name> - <user>dmaus</user> - <email>maus@hab.de</email> - <active>yes</active> - </lead> - <date>${build.date}</date> - <time>${build.time}</time> - <version> - <release>${project.version}</release> - <api>${project.majorVersion}.${project.minorVersion}</api> - </version> - <stability> - <release>${project.stability}</release> - <api>stable</api> - </stability> - <license>GNU General Public License v3</license> - <notes> - No notes. - </notes> - <contents> - <dir baseinstalldir="/" name="/"> - ${contents} - </dir> - </contents> - <dependencies> - <required> - <php> - <min>5.3.0</min> - </php> - <pearinstaller> - <min>1.9.4</min> - </pearinstaller> - <package> - <name>Autoloader</name> - <channel>pear.phix-project.org</channel> - <min>3.0.0</min> - <max>3.999.9999</max> - </package> - <package> - <name>PicaRecord</name> - <channel>hab20.hab.de/service/pear</channel> - <min>0.1.0</min> - <max>0.999.9999</max> - </package> - </required> - </dependencies> - <phprelease /> - <changelog> - <release> - <version> - <release>0.1.0</release> - <api>0.1</api> - </version> - <stability> - <release>stable</release> - <api>stable</api> - </stability> - <date>2012-02-15</date> - <license>GNU General Public License v3</license> - <notes> - </notes> - </release> - </changelog> -</package> -<!-- vim: set tabstop=2 shiftwidth=2 expandtab: --> diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..16d058a --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<phpunit bootstrap="tests/bootstrap.php" strict="true"> + <testsuites> + <testsuite name="Unit Tests"> + <directory suffix="Test.php">tests</directory> + </testsuite> + </testsuites> + <filter> + <blacklist> + <directory suffix=".php">vendor</directory> + <directory suffix=".php">tests</directory> + </blacklist> + <whitelist addUncoveredFilesFromWhitelist="true"> + <directory suffix=".php">bin</directory> + <directory suffix=".php">src</directory> + </whitelist> + </filter> + <logging> + <log type="coverage-html" target="review/code-coverage"/> + </logging> +</phpunit> diff --git a/phpunit.xml.dist b/phpunit.xml.dist deleted file mode 100644 index 864f7f7..0000000 --- a/phpunit.xml.dist +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0"?> -<phpunit bootstrap="src/tests/unit-tests/bootstrap.php"> - <testsuites> - <testsuite name="Unit Tests"> - <directory suffix="Test.php">src/tests/unit-tests</directory> - </testsuite> - </testsuites> - <filter> - <blacklist> - <directory suffix=".php">vendor</directory> - <directory suffix=".php">src/tests</directory> - </blacklist> - <whitelist addUncoveredFilesFromWhitelist="true"> - <directory suffix=".php">src/bin</directory> - <directory suffix=".php">src/php</directory> - </whitelist> - </filter> - <logging> - <log type="coverage-html" target="review/code-coverage"/> - <log type="coverage-clover" target="review/logs/phpunit.xml"/> - <log type="json" target="review/logs/phpunit.json"/> - <log type="tap" target="review/logs/phpunit.tap"/> - <log type="junit" target="review/logs/phpunit-junit.xml"/> - <log type="testdox-html" target="review/testdox.html"/> - <log type="testdox-text" target="review/testdox.txt"/> - </logging> -</phpunit> -<!-- vim: set tabstop=4 shiftwidth=4 expandtab: --> diff --git a/src/php/HAB/Pica/Parser/PicaPlainParser.php b/src/HAB/Pica/Parser/PicaPlainParser.php similarity index 80% rename from src/php/HAB/Pica/Parser/PicaPlainParser.php rename to src/HAB/Pica/Parser/PicaPlainParser.php index 4cfbe3c..c35ce27 100644 --- a/src/php/HAB/Pica/Parser/PicaPlainParser.php +++ b/src/HAB/Pica/Parser/PicaPlainParser.php @@ -20,31 +20,27 @@ * * @package PicaReader * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel + * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 */ namespace HAB\Pica\Parser; -/** - * Parser for Pica+ records encoded in PicaPlain. - * - * @package PicaReader - * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel - * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 - */ +use RuntimeException; + class PicaPlainParser { /** * Return array representation of the field encoded in a line. * - * @throws \RuntimeException Invalid characters in line + * @throws RuntimeException Invalid characters in line + * * @param string $line PicaPlain record line - * @return array Array representation of the encoded field + * @return array */ - public static function parseField ($line) { + public static function parseField ($line) + { $field = array('subfields' => array()); $match = array(); if (preg_match('#^([012][0-9]{2}[A-Z@])(/([0-9]{2}))? (\$.*)$#Du', $line, $match)) { @@ -52,7 +48,7 @@ class PicaPlainParser 'occurrence' => $match[3] ?: null, 'subfields' => self::parseSubfields($match[4]));; } else { - throw new \RuntimeException("Invalid characters in PicaPlain record at line: {$line}"); + throw new RuntimeException("Invalid characters in PicaPlain record at line: {$line}"); } return $field; } @@ -61,9 +57,10 @@ class PicaPlainParser * Return array of array representations of the subfields encode in argument. * * @param string $str Encoded subfields - * @return array Array representions of the encoded subfields + * @return array */ - public static function parseSubfields ($str) { + public static function parseSubfields ($str) + { $subfields = array(); $subfield = null; $pos = 0; diff --git a/src/HAB/Pica/Reader/PicaPlainReader.php b/src/HAB/Pica/Reader/PicaPlainReader.php new file mode 100644 index 0000000..0d5c0c0 --- /dev/null +++ b/src/HAB/Pica/Reader/PicaPlainReader.php @@ -0,0 +1,80 @@ +<?php + +/** + * The PicaPlainReader class file. + * + * This file is part of PicaReader. + * + * PicaReader 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, either version 3 of the License, or + * (at your option) any later version. + * + * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. + * + * @package PicaReader + * @author David Maus <maus@hab.de> + * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 + */ + +namespace HAB\Pica\Reader; + +use HAB\Pica\Parser\PicaPlainParser; + +class PicaPlainReader extends Reader +{ + + /** + * Current input data. + * + * @var string + */ + protected $_data; + + /** + * Open the reader with input data. + * + * @param string $data Input data + * @return void + */ + public function open ($data) + { + parent::open($data); + $this->_data = preg_split("/(?:\n\r|[\n\r])/", $data); + } + + /** + * {@inheritDoc} + */ + protected function next () + { + $record = false; + if (current($this->_data) !== false) { + $record = array('fields' => array()); + do { + $line = current($this->_data); + $record['fields'] []= PicaPlainParser::parseField($line); + } while (next($this->_data)); + next($this->_data); + } + return $record; + } + + /** + * Close the reader. + * + * @return void + */ + public function close () + { + parent::close(); + $this->_data = null; + } +} diff --git a/src/HAB/Pica/Reader/PicaXmlReader.php b/src/HAB/Pica/Reader/PicaXmlReader.php new file mode 100644 index 0000000..7baa0cf --- /dev/null +++ b/src/HAB/Pica/Reader/PicaXmlReader.php @@ -0,0 +1,173 @@ +<?php + +/** + * The PicaXmlReader class file. + * + * This file is part of PicaReader. + * + * PicaReader 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, either version 3 of the License, or + * (at your option) any later version. + * + * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. + * + * @package PicaReader + * @author David Maus <maus@hab.de> + * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 + */ + +namespace HAB\Pica\Reader; + +use XMLReader; + +class PicaXmlReader extends Reader +{ + + /** + * @var string XML namespace URI of PicaXML + */ + const PICAXML_NAMESPACE_URI = 'info:srw/schema/5/picaXML-v1.0'; + + /** + * @var XMLReader XML Reader instance + */ + private $_xmlReader; + + /** + * Constructor. + * + * @return void + */ + public function __construct () + { + parent::__construct(); + $this->_xmlReader = new XMLReader(); + } + + /** + * Prepare the reader for reading data. + * + * @param string|resource $input + * @return void + */ + public function open ($input) + { + if (is_resource($input)) { + $input = stream_get_contents($input); + } + $this->_xmlReader->XML($input); + parent::open($input); + } + + /** + * Close current input data. + * + * @return void + */ + public function close () + { + $this->_xmlReader->close(); + parent::close(); + } + + /** + * {@inheritDoc} + */ + protected function next () + { + if ($this->forwardTo('record', self::PICAXML_NAMESPACE_URI)) { + $record = array('fields' => array()); + while (!$this->atElementEnd('record', self::PICAXML_NAMESPACE_URI) && $this->_xmlReader->read()) { + if ($this->atElement('datafield', self::PICAXML_NAMESPACE_URI)) { + $record['fields'] []= $this->readField(); + } + } + } else { + $record = false; + } + return $record; + } + + /** + * Return array representation of datafield at cursor. + * + * The cursor is expected to be positioned on the opening field element. + * + * @return array + */ + protected function readField () + { + $field = array('tag' => $this->_xmlReader->getAttribute('tag'), + 'occurrence' => $this->_xmlReader->getAttribute('occurrence'), + 'subfields' => array()); + while (!$this->atElementEnd('datafield', self::PICAXML_NAMESPACE_URI) && $this->_xmlReader->read()) { + if ($this->atElement('subfield', self::PICAXML_NAMESPACE_URI)) { + $subfield = array('code' => $this->_xmlReader->getAttribute('code'), 'value' => ''); + while (!$this->atElementEnd('subfield', self::PICAXML_NAMESPACE_URI) && $this->_xmlReader->read()) { + switch ($this->_xmlReader->nodeType) { + case XMLReader::TEXT: + case XMLReader::SIGNIFICANT_WHITESPACE: + case XMLReader::CDATA: + $subfield['value'] .= $this->_xmlReader->value; + break; + } + } + $field['subfields'] []= $subfield; + } + } + return $field; + } + + /** + * Move cursor forward to named element. + * + * The cursor is not moved if it is already positioned at the named + * element. Returns true if cursor is at specified element and false if + * cursor reached the end of the document + * + * @param string $name Element local name + * @param string $uri Namespace URI + * @return boolean + */ + protected function forwardTo ($name, $uri) + { + while (!$this->atElement($name, $uri) && $this->_xmlReader->read()) { } + return ($this->_xmlReader->nodeType === XMLReader::ELEMENT); + } + + /** + * Return true if the cursor is positioned at the named element. + * + * @param string $name Element local name + * @param string $uri Namespace URI + * @return boolean + */ + protected function atElement ($name, $uri) + { + return ($this->_xmlReader->nodeType === XMLReader::ELEMENT && + $this->_xmlReader->localName === $name && + $this->_xmlReader->namespaceURI === $uri); + } + + /** + * Return TRUE if the cursor is positioned at the end of the named element. + * + * @param string $name Element local name + * @param string $uri Namespace URI + * @return boolean + */ + protected function atElementEnd ($name, $uri) + { + return ($this->_xmlReader->nodeType === XMLReader::END_ELEMENT && + $this->_xmlReader->localName === $name && + $this->_xmlReader->namespaceURI === $uri); + } +} diff --git a/src/HAB/Pica/Reader/Reader.php b/src/HAB/Pica/Reader/Reader.php new file mode 100644 index 0000000..3484eca --- /dev/null +++ b/src/HAB/Pica/Reader/Reader.php @@ -0,0 +1,184 @@ +<?php + +/** + * The Reader class file. + * + * This file is part of PicaReader. + * + * PicaReader 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, either version 3 of the License, or + * (at your option) any later version. + * + * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. + * + * @package PicaReader + * @author David Maus <maus@hab.de> + * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 + */ + +namespace HAB\Pica\Reader; + +use Exception; +use RuntimeException; + +use HAB\Pica\Record\Record; + +abstract class Reader +{ + + /** + * TRUE if the reader was opened with input data. + * + * @var boolean + */ + protected $_isOpen = false; + + /** + * Filter function or NULL if none set. + * + * @see Reader::setFilter() + * + * @var callback|null + */ + protected $_filter = null; + + /** + * Constructor. + * + * @return void + */ + public function __construct () + {} + + /** + * Open the reader with input data. + * + * @return void + */ + public function open ($data) + { + if ($this->isOpen()) { + $this->close(); + } + $this->_isOpen = true; + } + + /** + * Return next record in input data or FALSE if no more records. + * + * This function uses the Record::factory() method to create a record and + * applies a possible filter function to the input data. + * + * @see Reader::setFilter() + * @see Record::factory() + * + * @throws RuntimeException Error creating a record instance via factory function + * @return Record|false + */ + public function read () + { + $record = $this->next(); + if (is_array($record)) { + $record = $this->applyFilter($record); + if (is_array($record)) { + try { + return Record::factory($record); + } catch (Exception $e) { + throw new RuntimeException("Error creating record instance in Record::factory()", -1, $e); + } + } + } + return false; + } + + /** + * Set a filter function. + * + * A filter function is every valid callback function that takes the array + * representation of a record as only argument and returns a possibly + * modifed array or false to skip the record. + * + * @param callback $filter Filter function + * @return array|false + */ + public function setFilter ($filter) + { + $this->_filter = $filter; + } + + /** + * Return current filter function. + * + * @return callback|null + */ + public function getFilter () + { + return $this->_filter; + } + + /** + * Unset the filter function. + * + * @return void + */ + public function unsetFilter () + { + $this->_filter = null; + } + + /** + * Close the reader. + * + * @return void + */ + public function close () + { + $this->_isOpen = false; + } + + /** + * Return true if the reader is open. + * + * @return boolean + */ + public function isOpen () + { + return $this->_isOpen; + } + + + /** + * Read the next record in input data. + * + * Returns array representation of the record or false if no more records. + * + * @return array|false + */ + abstract protected function next (); + + /** + * Return filtered record. + * + * Applies the filter function to the array representation of a record. + * + * @param array $record Array representation of record + * @return array|false + */ + protected function applyFilter (array $record) + { + $filter = $this->getFilter(); + if ($filter) { + return call_user_func($filter, $record); + } else { + return $record; + } + } +} \ No newline at end of file diff --git a/src/README.txt b/src/README.txt deleted file mode 100644 index 4074f38..0000000 --- a/src/README.txt +++ /dev/null @@ -1,68 +0,0 @@ -Your src/ folder -================ - -This src/ folder is where you put all of your code for release. There's -a folder for each type of file that the PEAR Installer supports. You can -find out more about these file types online at: - -http://blog.stuartherbert.com/php/2011/04/04/explaining-file-roles/ - - * bin/ - - If you're creating any command-line tools, this is where you'd put - them. Files in here get installed into /usr/bin on Linux et al. - - There is more information available here: http://blog.stuartherbert.com/php/2011/04/06/php-components-shipping-a-command-line-program/ - - You can find an example here: https://github.com/stuartherbert/phix/tree/master/src/bin - - * data/ - - If you have any data files (any files that aren't PHP code, and which - don't belong in the www/ folder), this is the folder to put them in. - - There is more information available here: http://blog.stuartherbert.com/php/2011/04/11/php-components-shipping-data-files-with-your-components/ - - You can find an example here: https://github.com/stuartherbert/ComponentManagerPhpLibrary/tree/master/src/data - - * php/ - - This is where your component's PHP code belongs. Everything that goes - into this folder must be PSR0-compliant, so that it works with the - supplied autoloader. - - There is more information available here: http://blog.stuartherbert.com/php/2011/04/05/php-components-shipping-reusable-php-code/ - - You can find an example here: https://github.com/stuartherbert/ContractLib/tree/master/src/php - - * tests/functional-tests/ - - Right now, this folder is just a placeholder for future functionality. - You're welcome to make use of it yourself. - - * tests/integration-tests/ - - Right now, this folder is just a placeholder for future functionality. - You're welcome to make use of it yourself. - - * tests/unit-tests/ - - This is where all of your PHPUnit tests go. - - It needs to contain _exactly_ the same folder structure as the src/php/ - folder. For each of your PHP classes in src/php/, there should be a - corresponding test file in test/unit-tests. - - There is more information available here: http://blog.stuartherbert.com/php/2011/08/15/php-components-shipping-unit-tests-with-your-component/ - - You can find an example here: https://github.com/stuartherbert/ContractLib/tree/master/test/unit-tests - - * www/ - - This folder is for any files that should be published in a web server's - DocRoot folder. - - It's quite unusual for components to put anything in this folder, but - it is there just in case. - - There is more information available here: http://blog.stuartherbert.com/php/2011/08/16/php-components-shipping-web-pages-with-your-components/ diff --git a/src/bin/.empty b/src/bin/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/data/.empty b/src/data/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/docs/.empty b/src/docs/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/php/.empty b/src/php/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/php/HAB/Pica/Reader/PicaPlainReader.php b/src/php/HAB/Pica/Reader/PicaPlainReader.php deleted file mode 100644 index 5b1c76b..0000000 --- a/src/php/HAB/Pica/Reader/PicaPlainReader.php +++ /dev/null @@ -1,97 +0,0 @@ -<?php - -/** - * The PicaPlainReader class file. - * - * This file is part of PicaReader. - * - * PicaReader 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, either version 3 of the License, or - * (at your option) any later version. - * - * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. - * - * @package PicaReader - * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel - * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 - */ - -namespace HAB\Pica\Reader; - -use HAB\Pica\Parser\PicaPlainParser; - -/** - * Reader for Pica+ records encoded in PicaPlain. - * - * @package PicaReader - * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel - * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 - */ -class PicaPlainReader extends Reader { - - /** - * Current input data. - * - * @var string - */ - protected $_data; - - /** - * Open the reader with input data. - * - * @param string $data Input data - * @return void - */ - public function open ($data) { - parent::open($data); - $this->_data = preg_split("/(?:\n\r|[\n\r])/", $data); - } - - /** - * Read the next record in input data. - * - * @see \HAB\Pica\Reader\Reader::next() - * - * @return array|false Array representation of the record or FALSE if no more records - */ - protected function next () { - $record = false; - if (current($this->_data) !== false) { - $record = array('fields' => array()); - do { - $line = current($this->_data); - $record['fields'] []= PicaPlainParser::parseField($line); - } while (next($this->_data)); - next($this->_data); - } - return $record; - } - - /** - * Close the reader. - * - * @return void - */ - public function close () { - parent::close(); - $this->_data = null; - } - - /** - * Return the number of the line currently parsed. - * - * @return integer Number of currently parsed line - */ - protected function getCurrentLineNumber () { - return key($this->_data); - } -} diff --git a/src/php/HAB/Pica/Reader/PicaXmlReader.php b/src/php/HAB/Pica/Reader/PicaXmlReader.php deleted file mode 100644 index 6fda04c..0000000 --- a/src/php/HAB/Pica/Reader/PicaXmlReader.php +++ /dev/null @@ -1,173 +0,0 @@ -<?php - -/** - * The PicaXmlReader class file. - * - * This file is part of PicaReader. - * - * PicaReader 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, either version 3 of the License, or - * (at your option) any later version. - * - * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. - * - * @package PicaReader - * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel - * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 - */ - -namespace HAB\Pica\Reader; - -use \XMLReader; - -/** - * Reader for Pica+ records encoded in PicaXML. - * - * @package PicaReader - * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel - * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 - */ -class PicaXmlReader extends Reader { - - /** - * @var string XML namespace URI of PicaXML - */ - const PICAXML_NAMESPACE_URI = 'info:srw/schema/5/picaXML-v1.0'; - - /** - * @var \XMLReader XML Reader instance - */ - private $_xmlReader; - - /** - * Constructor. - * - * @return void - */ - public function __construct () { - parent::__construct(); - $this->_xmlReader = new XMLReader(); - } - - /** - * Prepare the reader for reading data. - * - * @param string $input Data to read - * @return void - */ - public function open ($input) { - $this->_xmlReader->XML($input); - parent::open($input); - } - - /** - * Close current input data. - * - * @return void - */ - public function close () { - $this->_xmlReader->close(); - parent::close(); - } - - /** - * Return the array representation of the next record in current input data. - * - * @see ReaderAbstract::next() - * - * @return array|false Record or false if there are no more records - */ - protected function next () { - if ($this->forwardTo('record', self::PICAXML_NAMESPACE_URI)) { - $record = array('fields' => array()); - while (!$this->atElementEnd('record', self::PICAXML_NAMESPACE_URI) && $this->_xmlReader->read()) { - if ($this->atElement('datafield', self::PICAXML_NAMESPACE_URI)) { - $record['fields'] []= $this->readField(); - } - } - } else { - $record = false; - } - return $record; - } - - /** - * Return array representation of datafield at cursor. - * - * The cursor is expected to be positioned on the opening field element. - * - * @return array Field - */ - protected function readField () { - $field = array('tag' => $this->_xmlReader->getAttribute('tag'), - 'occurrence' => $this->_xmlReader->getAttribute('occurrence'), - 'subfields' => array()); - while (!$this->atElementEnd('datafield', self::PICAXML_NAMESPACE_URI) && $this->_xmlReader->read()) { - if ($this->atElement('subfield', self::PICAXML_NAMESPACE_URI)) { - $subfield = array('code' => $this->_xmlReader->getAttribute('code'), 'value' => ''); - while (!$this->atElementEnd('subfield', self::PICAXML_NAMESPACE_URI) && $this->_xmlReader->read()) { - switch ($this->_xmlReader->nodeType) { - case XMLReader::TEXT: - case XMLReader::SIGNIFICANT_WHITESPACE: - case XMLReader::CDATA: - $subfield['value'] .= $this->_xmlReader->value; - break; - } - } - $field['subfields'] []= $subfield; - } - } - return $field; - } - - /** - * Move cursor forward to named element. - * - * The cursor is not moved if it is already positioned at the named element. - * - * @param string $name Element local name - * @param string $uri Namespace URI - * @return boolean TRUE if cursor is at specified element or FALSE if cursor - * reached the end of the document - */ - protected function forwardTo ($name, $uri) { - while (!$this->atElement($name, $uri) && $this->_xmlReader->read()) { } - return ($this->_xmlReader->nodeType === XMLReader::ELEMENT); - } - - /** - * Return TRUE if the cursor is positioned at the named element. - * - * @param string $name Element local name - * @param string $uri Namespace URI - * @return boolean TRUE if the cursor is positioned at the element - */ - protected function atElement ($name, $uri) { - return ($this->_xmlReader->nodeType === XMLReader::ELEMENT && - $this->_xmlReader->localName === $name && - $this->_xmlReader->namespaceURI === $uri); - } - - /** - * Return TRUE if the cursor is positioned at the end of the named element. - * - * @param string $name Element local name - * @param string $uri Namespace URI - * @return boolean TRUE if the cursor is positioned at the end of the named - * element - */ - protected function atElementEnd ($name, $uri) { - return ($this->_xmlReader->nodeType === XMLReader::END_ELEMENT && - $this->_xmlReader->localName === $name && - $this->_xmlReader->namespaceURI === $uri); - } -} diff --git a/src/php/HAB/Pica/Reader/Reader.php b/src/php/HAB/Pica/Reader/Reader.php deleted file mode 100644 index 0d2aa06..0000000 --- a/src/php/HAB/Pica/Reader/Reader.php +++ /dev/null @@ -1,176 +0,0 @@ -<?php - -/** - * The Reader class file. - * - * This file is part of PicaReader. - * - * PicaReader 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, either version 3 of the License, or - * (at your option) any later version. - * - * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. - * - * @package PicaReader - * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel - * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 - */ - -namespace HAB\Pica\Reader; - -/** - * Abstract base class of Pica+ readers. - * - * @package PicaReader - * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel - * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 - */ -abstract class Reader { - - /** - * TRUE if the reader was opened with input data. - * - * @var boolean - */ - protected $_isOpen = false; - - /** - * Filter function or NULL if none set. - * - * @see Reader::setFilter() - * - * @var callback|null - */ - protected $_filter = null; - - /** - * Constructor. - * - * @return void - */ - public function __construct () { - } - - /** - * Open the reader with input data. - * - * @param string $data Input data - * @return void - */ - public function open ($data) { - if ($this->isOpen()) { - $this->close(); - } - $this->_isOpen = true; - } - - /** - * Return next record in input data or FALSE if no more records. - * - * This function uses the \HAB\Pica\Record\Record::factory() method to create a record and - * applies a possible filter function to the input data. - * - * @see \HAB\Pica\Reader\Reader::setFilter() - * @see \HAB\Pica\Record\Record::factory() - * - * @throws \RuntimeException Error creating a record instance via factory function - * @return \HAB\Pica\Record\Record|FALSE Next record in input data - */ - public function read () { - $record = $this->next(); - if (is_array($record)) { - $record = $this->applyFilter($record); - if (is_array($record)) { - try { - return \HAB\Pica\Record\Record::factory($record); - } catch (\Exception $e) { - throw new \RuntimeException("Error creating record instance in Record::factory()", -1, $e); - } - } - } - return false; - } - - /** - * Read the next record in input data. - * - * @return array|FALSE Array representation of the record or FALSE if no more records - */ - abstract protected function next (); - - /** - * Return filtered record. - * - * Applies the filter function to the array representation of a record. - * - * @param array $record Array representation of record - * @return array|false Filtered record or FALSE to skip the record - */ - protected function applyFilter (array $record) { - $filter = $this->getFilter(); - if ($filter) { - return call_user_func($filter, $record); - } else { - return $record; - } - } - - /** - * Set a filter function. - * - * A filter function is every valid callback function that takes the array - * representation of a record as only argument and returns a possibly - * modifed array or FALSE to skip the record. - * - * @param callback $filter Filter function - * @return array|FALSE Filtered record or FALSE if the record should be skipped - */ - public function setFilter ($filter) { - $this->_filter = $filter; - } - - /** - * Return current filter function. - * - * @return callback|NULL Current filter function or NULL if not set - */ - public function getFilter () { - return $this->_filter; - } - - /** - * Unset the filter filter function. - * - * @return void - */ - public function unsetFilter () { - $this->_filter = null; - } - - /** - * Close the reader. - * - * @return void - */ - public function close () { - $this->_isOpen = false; - } - - /** - * Return TRUE if the reader is open. - * - * @return boolean TRUE if the reader is open - */ - public function isOpen () { - return $this->_isOpen; - } -} \ No newline at end of file diff --git a/src/tests/.empty b/src/tests/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/tests/functional-tests/.empty b/src/tests/functional-tests/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/tests/integration-tests/.empty b/src/tests/integration-tests/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/tests/unit-tests/.empty b/src/tests/unit-tests/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/tests/unit-tests/bin/.empty b/src/tests/unit-tests/bin/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/tests/unit-tests/bootstrap.php b/src/tests/unit-tests/bootstrap.php deleted file mode 100644 index 97c36d2..0000000 --- a/src/tests/unit-tests/bootstrap.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -// ========================================================================= -// -// tests/bootstrap.php -// A helping hand for running our unit tests -// -// Author Stuart Herbert -// (stuart@stuartherbert.com) -// -// Copyright (c) 2011 Stuart Herbert -// Released under the New BSD license -// -// ========================================================================= - -// step 1: create the APP_TOPDIR constant that all components require -define('APP_TOPDIR', realpath(__DIR__ . '/../../php')); -define('APP_LIBDIR', realpath(__DIR__ . '/../../../vendor/php')); -define('APP_TESTDIR', realpath(__DIR__ . '/php')); - -// step 2: find the autoloader, and install it -require_once(APP_LIBDIR . '/psr0.autoloader.php'); - -// step 3: add the additional paths to the include path -psr0_autoloader_searchFirst(APP_LIBDIR); -psr0_autoloader_searchFirst(APP_TESTDIR); -psr0_autoloader_searchFirst(APP_TOPDIR); - -// step 4: enable ContractLib if it is available -if (class_exists('Phix_Project\ContractLib\Contract')) -{ - \Phix_Project\ContractLib\Contract::EnforceWrappedContracts(); -} - -// step 5: define a constant with the fixture directory -define('APP_FIXTUREDIR', realpath(__DIR__ . '/../fixtures')); - -// step 6: Set error level to include E_STRICT -\error_reporting(\E_ALL | \E_STRICT); \ No newline at end of file diff --git a/src/tests/unit-tests/php/.empty b/src/tests/unit-tests/php/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/tests/unit-tests/php/HAB/Pica/Reader/PicaPlainReaderTest.php b/src/tests/unit-tests/php/HAB/Pica/Reader/PicaPlainReaderTest.php deleted file mode 100644 index 652aa37..0000000 --- a/src/tests/unit-tests/php/HAB/Pica/Reader/PicaPlainReaderTest.php +++ /dev/null @@ -1,121 +0,0 @@ -<?php - -/** - * Unit test for the PicaPlainReader class. - * - * This file is part of PicaReader. - * - * PicaReader 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, either version 3 of the License, or - * (at your option) any later version. - * - * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. - * - * @package PicaReader - * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel - * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 - */ - -namespace HAB\Pica\Reader; - -class PicaPlainReaderTest extends \PHPUnit_FrameWork_TestCase { - - protected $_reader; - - public function SetUp () { - $this->_reader = new PicaPlainReader(); - } - - public function testRead () { - $this->_reader->open($this->getFixture('single_record')); - $record = $this->_reader->read(); - $this->assertInstanceOf('\HAB\Pica\Record\TitleRecord', $record); - $this->assertFalse($this->_reader->read()); - $this->assertEquals(377, count($record->getFields())); - $this->assertEquals(21, count($record->getLocalRecords())); - $this->assertEquals('024836885', $record->getPPN()); - $this->assertEquals(3, count($record->getLocalRecordByILN(31)->getCopyRecords())); - } - - public function testReadDoubleEncodedDollarSign () { - $this->_reader->open('002@/00 $0T$adouble$$dollar'); - $record = $this->_reader->read(); - $field = $record->getFirstMatchingField('002@/00'); - $subfield = $field->getNthSubfield('a', 0); - $this->assertEquals('double$dollar', $subfield->getValue()); - } - - public function testReadDoubleEncodedDoubleDollarSign2x () { - $this->_reader->open('002@/00 $0T$adouble$$$$dollar'); - $record = $this->_reader->read(); - $field = $record->getFirstMatchingField('002@/00'); - $subfield = $field->getNthSubfield('a', 0); - $this->assertEquals('double$$dollar', $subfield->getValue()); - } - - public function testReadDoubleEncodedDoubleDollarSignAtEnd () { - $this->_reader->open('002@/00 $0T$adoubledollar$$'); - $record = $this->_reader->read(); - $field = $record->getFirstMatchingField('002@/00'); - $subfield = $field->getNthSubfield('a', 0); - $this->assertEquals('doubledollar$', $subfield->getValue()); - } - - public function testReadDoubleEncodedDoubleDollarSignOnly () { - $this->_reader->open('002@/00 $0T$a$$'); - $record = $this->_reader->read(); - $field = $record->getFirstMatchingField('002@/00'); - $subfield = $field->getNthSubfield('a', 0); - $this->assertEquals('$', $subfield->getValue()); - } - - public function testReadFilterInvalidSubfieldCode () { - $filter = function (array $record) { - return array('fields' => array_map(function (array $field) { - return array('tag' => $field['tag'], - 'occurrence' => $field['occurrence'], - 'subfields' => array_filter($field['subfields'], - function (array $subfield) { - return \HAB\Pica\Record\Subfield::isValidSubfieldCode($subfield['code']); - })); - }, $record['fields'])); - }; - $this->_reader->open("002@/00 \$0T\n000A/00 \$@FOOBAR"); - $this->_reader->setFilter($filter); - $this->assertSame($filter, $this->_reader->getFilter()); - $this->_reader->read(); - $this->_reader->unsetFilter(); - } - - /// - - /** - * @expectedException \RuntimeException - */ - public function testReadMalformedSingleDollarAtEnd () { - $this->_reader->open('002@/00 $0T$aFOOBAR$'); - $record = $this->_reader->read(); - } - /** - * @expectedException \RuntimeException - */ - public function testReadMalformedLine () { - $this->_reader->open(''); - $this->_reader->read(); - } - - /// - - protected function getFixture ($fixture) { - return file_get_contents(\APP_FIXTUREDIR . DIRECTORY_SEPARATOR . "{$fixture}.pp"); - } - -} diff --git a/src/tests/unit-tests/php/HAB/Pica/Reader/PicaXmlReaderTest.php b/src/tests/unit-tests/php/HAB/Pica/Reader/PicaXmlReaderTest.php deleted file mode 100644 index 71e7dc2..0000000 --- a/src/tests/unit-tests/php/HAB/Pica/Reader/PicaXmlReaderTest.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php - -/** - * Unit test for the PicaPlainReader class. - * - * This file is part of PicaReader. - * - * PicaReader 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, either version 3 of the License, or - * (at your option) any later version. - * - * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. - * - * @package PicaReader - * @author David Maus <maus@hab.de> - * @copyright Copyright (c) 2012 by Herzog August Bibliothek Wolfenbüttel - * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 - */ - -namespace HAB\Pica\Reader; - -class PicaXmlReaderTest extends \PHPUnit_FrameWork_TestCase { - - protected $_reader; - - public function SetUp () { - $this->_reader = new PicaXmlReader(); - } - - public function testRead () { - $this->_reader->open($this->getFixture('single_record')); - $record = $this->_reader->read(); - $this->assertInstanceOf('\HAB\Pica\Record\TitleRecord', $record); - $this->assertFalse($this->_reader->read()); - $this->assertEquals(377, count($record->getFields())); - $this->assertEquals(21, count($record->getLocalRecords())); - $this->assertEquals('024836885', $record->getPPN()); - $this->assertEquals(3, count($record->getLocalRecordByILN(31)->getCopyRecords())); - } - - protected function getFixture ($fixture) { - return file_get_contents(\APP_FIXTUREDIR . DIRECTORY_SEPARATOR . "{$fixture}.xml"); - } - -} \ No newline at end of file diff --git a/src/tests/unit-tests/www/.empty b/src/tests/unit-tests/www/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/src/www/.empty b/src/www/.empty deleted file mode 100644 index e69de29..0000000 diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..cf31ad8 --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,30 @@ +<?php + +/** + * This file is part of PicaReader. + * + * PicaReader 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, either version 3 of the License, or + * (at your option) any later version. + * + * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. + * + * @author David Maus <maus@hab.de> + * @copyright Copyright (c) 2013 by Herzog August Bibliothek Wolfenbüttel + * @license http://www.gnu.org/licenses/gpl.txt GNU General Public License v3 + */ + +require_once realpath(__DIR__ . '/../vendor/autoload.php'); + +define('PHPUNIT_FIXTURES', realpath(__DIR__ . '/fixtures')); + +$loader = new Composer\Autoload\ClassLoader(); +$loader->add('HAB', realpath(__DIR__ . '/src')); +$loader->register(); diff --git a/src/tests/fixtures/single_record.pp b/tests/fixtures/single_record.pp similarity index 100% rename from src/tests/fixtures/single_record.pp rename to tests/fixtures/single_record.pp diff --git a/src/tests/fixtures/single_record.xml b/tests/fixtures/single_record.xml similarity index 100% rename from src/tests/fixtures/single_record.xml rename to tests/fixtures/single_record.xml diff --git a/tests/src/HAB/Pica/Reader/PicaPlainReaderTest.php b/tests/src/HAB/Pica/Reader/PicaPlainReaderTest.php new file mode 100644 index 0000000..0dd65f2 --- /dev/null +++ b/tests/src/HAB/Pica/Reader/PicaPlainReaderTest.php @@ -0,0 +1,133 @@ +<?php + +/** + * Unit test for the PicaPlainReader class. + * + * This file is part of PicaReader. + * + * PicaReader 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, either version 3 of the License, or + * (at your option) any later version. + * + * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. + * + * @package PicaReader + * @author David Maus <maus@hab.de> + * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 + */ + +namespace HAB\Pica\Reader; + +use PHPUnit_FrameWork_TestCase ; + +class PicaPlainReaderTest extends PHPUnit_FrameWork_TestCase +{ + + protected $_reader; + + public function setup () + { + $this->_reader = new PicaPlainReader(); + } + + public function testRead () + { + $this->_reader->open($this->getFixture('single_record')); + $record = $this->_reader->read(); + $this->assertInstanceOf('\HAB\Pica\Record\TitleRecord', $record); + $this->assertFalse($this->_reader->read()); + $this->assertEquals(377, count($record->getFields())); + $this->assertEquals(21, count($record->getLocalRecords())); + $this->assertEquals('024836885', $record->getPPN()); + $this->assertEquals(3, count($record->getLocalRecordByILN(31)->getCopyRecords())); + } + + public function testReadDoubleEncodedDollarSign () + { + $this->_reader->open('002@/00 $0T$adouble$$dollar'); + $record = $this->_reader->read(); + $field = $record->getFirstMatchingField('002@/00'); + $subfield = $field->getNthSubfield('a', 0); + $this->assertEquals('double$dollar', $subfield->getValue()); + } + + public function testReadDoubleEncodedDoubleDollarSign2x () + { + $this->_reader->open('002@/00 $0T$adouble$$$$dollar'); + $record = $this->_reader->read(); + $field = $record->getFirstMatchingField('002@/00'); + $subfield = $field->getNthSubfield('a', 0); + $this->assertEquals('double$$dollar', $subfield->getValue()); + } + + public function testReadDoubleEncodedDoubleDollarSignAtEnd () + { + $this->_reader->open('002@/00 $0T$adoubledollar$$'); + $record = $this->_reader->read(); + $field = $record->getFirstMatchingField('002@/00'); + $subfield = $field->getNthSubfield('a', 0); + $this->assertEquals('doubledollar$', $subfield->getValue()); + } + + public function testReadDoubleEncodedDoubleDollarSignOnly () + { + $this->_reader->open('002@/00 $0T$a$$'); + $record = $this->_reader->read(); + $field = $record->getFirstMatchingField('002@/00'); + $subfield = $field->getNthSubfield('a', 0); + $this->assertEquals('$', $subfield->getValue()); + } + + public function testReadFilterInvalidSubfieldCode () + { + $filter = function (array $record) { + return array('fields' => array_map(function (array $field) { + return array('tag' => $field['tag'], + 'occurrence' => $field['occurrence'], + 'subfields' => array_filter($field['subfields'], + function (array $subfield) { + return \HAB\Pica\Record\Subfield::isValidSubfieldCode($subfield['code']); + })); + }, $record['fields'])); + }; + $this->_reader->open("002@/00 \$0T\n000A/00 \$@FOOBAR"); + $this->_reader->setFilter($filter); + $this->assertSame($filter, $this->_reader->getFilter()); + $this->_reader->read(); + $this->_reader->unsetFilter(); + } + + /// + + /** + * @expectedException RuntimeException + */ + public function testReadMalformedSingleDollarAtEnd () + { + $this->_reader->open('002@/00 $0T$aFOOBAR$'); + $record = $this->_reader->read(); + } + /** + * @expectedException RuntimeException + */ + public function testReadMalformedLine () + { + $this->_reader->open(''); + $this->_reader->read(); + } + + /// + + protected function getFixture ($fixture) + { + return file_get_contents(\PHPUNIT_FIXTURES . DIRECTORY_SEPARATOR . "{$fixture}.pp"); + } +} diff --git a/tests/src/HAB/Pica/Reader/PicaXmlReaderTest.php b/tests/src/HAB/Pica/Reader/PicaXmlReaderTest.php new file mode 100644 index 0000000..576eabf --- /dev/null +++ b/tests/src/HAB/Pica/Reader/PicaXmlReaderTest.php @@ -0,0 +1,57 @@ +<?php + +/** + * Unit test for the PicaPlainReader class. + * + * This file is part of PicaReader. + * + * PicaReader 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, either version 3 of the License, or + * (at your option) any later version. + * + * PicaReader 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 PicaReader. If not, see <http://www.gnu.org/licenses/>. + * + * @package PicaReader + * @author David Maus <maus@hab.de> + * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License v3 + */ + +namespace HAB\Pica\Reader; + +use PHPUnit_FrameWork_TestCase; + +class PicaXmlReaderTest extends PHPUnit_FrameWork_TestCase +{ + + protected $_reader; + + public function setup () + { + $this->_reader = new PicaXmlReader(); + } + + public function testRead () + { + $this->_reader->open($this->getFixture('single_record')); + $record = $this->_reader->read(); + $this->assertInstanceOf('\HAB\Pica\Record\TitleRecord', $record); + $this->assertFalse($this->_reader->read()); + $this->assertEquals(377, count($record->getFields())); + $this->assertEquals(21, count($record->getLocalRecords())); + $this->assertEquals('024836885', $record->getPPN()); + $this->assertEquals(3, count($record->getLocalRecordByILN(31)->getCopyRecords())); + } + + protected function getFixture ($fixture) + { + return file_get_contents(\PHPUNIT_FIXTURES . DIRECTORY_SEPARATOR . "{$fixture}.xml"); + } +} \ No newline at end of file -- GitLab