<?xml version="1.0" encoding="UTF-8"?>
<grammar ns="http://typo3.org/ns/2008/flow3/package"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>
    <element name="package">
      <attribute name="version">
        <data type="decimal"/>
      </attribute>
      <element name="key">
        <text/>
      </element>
      <element name="title">
        <text/>
      </element>
      <optional>
        <element name="description">
          <text/>
        </element>
      </optional>
      <element name="version">
        <text/>
      </element>
      <element name="state">
        <choice>
          <value>Development</value>
          <value>Alpha</value>
          <value>Beta</value>
          <value>ReleaseCandidate</value>
          <value>Final</value>
          <value>Obsolete</value>
        </choice>
      </element>
      <element name="categories">
        <oneOrMore>
          <element name="category">
            <text/>
          </element>
        </oneOrMore>
      </element>
      <element name="parties">
        <oneOrMore>
          <ref name="person"/>
        </oneOrMore>
        <oneOrMore>
          <ref name="company"/>
        </oneOrMore>
      </element>
      <element name="constraints">
        <element name="depends">
          <ref name="constraint"/>
        </element>
        <element name="conflicts">
          <ref name="constraint"/>
        </element>
        <element name="suggests">
          <ref name="constraint"/>
        </element>
      </element>
      <element name="repository">
        <element name="downloads">
          <element name="total">
            <data type="integer"/>
          </element>
          <element name="thisVersion">
            <data type="integer"/>
          </element>
        </element>
        <element name="uploads">
          <oneOrMore>
            <element name="upload">
              <element name="comment">
                <text/>
              </element>
              <element name="repositoryUserName">
                <text/>
              </element>
              <element name="timestamp">
                <data type="dateTime"/>
              </element>
            </element>
          </oneOrMore>
        </element>
      </element>
    </element>
  </start>

  <define name="person">
    <element name="person">
      <optional>
        <attribute name="role">
          <choice>
            <value>LeadDeveloper</value>
            <value>CoDeveloper</value>
            <value>Maintainer</value>
          </choice>
        </attribute>
      </optional>
      <element name="name">
        <text/>
      </element>
      <element name="email">
        <text/>
      </element>
      <optional>
        <element name="website">
          <text/>
        </element>
      </optional>
      <optional>
        <element name="company">
          <text/>
        </element>
      </optional>
      <optional>
        <element name="repositoryUserName">
          <text/>
        </element>
      </optional>
    </element>
  </define>

  <define name="company">
    <element name="company">
      <optional>
        <attribute name="role">
          <choice>
            <value>Sponsor</value>
          </choice>
        </attribute>
      </optional>
      <element name="name">
        <text/>
      </element>
      <element name="email">
        <text/>
      </element>
      <optional>
        <element name="website">
          <text/>
        </element>
      </optional>
    </element>
  </define>

  <define name="constraint">
    <zeroOrMore>
      <element name="package">
        <ref name="minMaxVersion"/>
        <text/>
      </element>
    </zeroOrMore>
    <zeroOrMore>
      <element name="component">
        <ref name="minMaxVersion"/>
        <text/>
      </element>
    </zeroOrMore>
    <zeroOrMore>
      <element name="system">
        <attribute name="type">
          <choice>
            <!-- Checked with phpversion()  -->
            <value>PHP</value>
            <!-- Checked with get_loaded_extensions() -->
            <value>PHPExtension</value>
            <!-- Checked with php_uname()  -->
            <value>OperatingSystem</value>
            <!-- Checked with memory_get_usage()  -->
            <value>Memory</value>
          </choice>
        </attribute>
        <ref name="minMaxVersion"/>
        <text/>
      </element>
    </zeroOrMore>
  </define>

  <define name="minMaxVersion">
    <optional>
      <!-- Checked with version_compare() -->
      <attribute name="minVersion">
        <text/>
      </attribute>
    </optional>
    <optional>
      <!-- Checked with version_compare() -->
      <attribute name="maxVersion">
        <text/>
      </attribute>
    </optional>
  </define>

</grammar>
