jdt 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. data/.gitignore +6 -0
  2. data/.rspec +2 -0
  3. data/CHANGELOG.md +1 -0
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +64 -0
  6. data/LICENSE +7 -0
  7. data/README.md +101 -0
  8. data/Rakefile +2 -0
  9. data/bin/jdt +16 -0
  10. data/features/build.feature +0 -0
  11. data/features/manifest.feature +25 -0
  12. data/features/new.feature +97 -0
  13. data/features/release.feature +47 -0
  14. data/features/status.feature +22 -0
  15. data/features/step_definitions/my_steps.rb +37 -0
  16. data/features/support/env.rb +7 -0
  17. data/features/support/setup.rb +2 -0
  18. data/features/validate.feature +0 -0
  19. data/features/version.feature +9 -0
  20. data/jdt.gemspec +25 -0
  21. data/lib/jdt/cli.rb +34 -0
  22. data/lib/jdt/commands/build.rb +28 -0
  23. data/lib/jdt/commands/bump.rb +37 -0
  24. data/lib/jdt/commands/install.rb +20 -0
  25. data/lib/jdt/commands/new.rb +31 -0
  26. data/lib/jdt/commands/pretty_print.rb +16 -0
  27. data/lib/jdt/commands/secure.rb +19 -0
  28. data/lib/jdt/commands/status.rb +21 -0
  29. data/lib/jdt/commands/validate.rb +35 -0
  30. data/lib/jdt/commands/version.rb +18 -0
  31. data/lib/jdt/generator/generator.rb +262 -0
  32. data/lib/jdt/generator/templates/access.xml.erb +10 -0
  33. data/lib/jdt/generator/templates/component/admin/access.xml.erb +0 -0
  34. data/lib/jdt/generator/templates/component/admin/com_name.erb +0 -0
  35. data/lib/jdt/generator/templates/component/admin/config.xml.erb +0 -0
  36. data/lib/jdt/generator/templates/component/admin/controller.erb +0 -0
  37. data/lib/jdt/generator/templates/component/admin/views/view_name/tmpl/default.erb +0 -0
  38. data/lib/jdt/generator/templates/component/admin/views/view_name/view.html.erb +0 -0
  39. data/lib/jdt/generator/templates/component/index.html.erb +1 -0
  40. data/lib/jdt/generator/templates/component/manifest.xml.erb +46 -0
  41. data/lib/jdt/generator/templates/component/script.php.erb +66 -0
  42. data/lib/jdt/generator/templates/component/site/com_name.php.erb +15 -0
  43. data/lib/jdt/generator/templates/component/site/controller.php.erb +14 -0
  44. data/lib/jdt/generator/templates/component/site/models/com_model_name.erb +0 -0
  45. data/lib/jdt/generator/templates/component/site/views/view_name/tmpl/default.php.erb +0 -0
  46. data/lib/jdt/generator/templates/component/site/views/view_name/tmpl/default.xml.erb +0 -0
  47. data/lib/jdt/generator/templates/component/site/views/view_name/view.html.erb +0 -0
  48. data/lib/jdt/generator/templates/config.xml.erb +6 -0
  49. data/lib/jdt/generator/templates/controller.php.erb +13 -0
  50. data/lib/jdt/generator/templates/dummy_html.erb +1 -0
  51. data/lib/jdt/generator/templates/entry.erb +15 -0
  52. data/lib/jdt/generator/templates/manifest.xml.erb +59 -0
  53. data/lib/jdt/generator/templates/module/helper.php.erb +14 -0
  54. data/lib/jdt/generator/templates/module/manifest.xml.erb +16 -0
  55. data/lib/jdt/generator/templates/module/mod_name.php.erb +10 -0
  56. data/lib/jdt/generator/templates/module/tmpl/default.php.erb +3 -0
  57. data/lib/jdt/generator/templates/plugin/main.php.erb +0 -0
  58. data/lib/jdt/generator/templates/plugin/manifest.xml.erb +16 -0
  59. data/lib/jdt/generator/templates/script.php.erb +66 -0
  60. data/lib/jdt/generator.rb +1 -0
  61. data/lib/jdt/manifest/attributes.rb +77 -0
  62. data/lib/jdt/manifest/build.rb +106 -0
  63. data/lib/jdt/manifest/bump.rb +40 -0
  64. data/lib/jdt/manifest/find.rb +58 -0
  65. data/lib/jdt/manifest/library_manifest.rb +19 -0
  66. data/lib/jdt/manifest/manifest.rb +29 -0
  67. data/lib/jdt/manifest/referenced.rb +96 -0
  68. data/lib/jdt/manifest/schemas/library.xsd +80 -0
  69. data/lib/jdt/manifest/schemas/manifest.xsd +32 -0
  70. data/lib/jdt/manifest/secure.rb +39 -0
  71. data/lib/jdt/manifest/validation.rb +121 -0
  72. data/lib/jdt/manifest/xslts/pretty_print.xsl +46 -0
  73. data/lib/jdt/manifest.rb +9 -0
  74. data/lib/jdt/version.rb +3 -0
  75. data/lib/jdt.rb +0 -0
  76. data/lib/not_yet_added/deploy.rb +54 -0
  77. data/lib/not_yet_added/xampp.rb +82 -0
  78. data/spec/jdt/generator/generator_spec.rb +55 -0
  79. data/spec/jdt/manifest/data/example_library/.gitignore +1 -0
  80. data/spec/jdt/manifest/data/example_library/ActiveRecord.php +3 -0
  81. data/spec/jdt/manifest/data/example_library/JoomlaActiveRecord.php +56 -0
  82. data/spec/jdt/manifest/data/example_library/JoomlaConfig.php +42 -0
  83. data/spec/jdt/manifest/data/example_library/README.md +51 -0
  84. data/spec/jdt/manifest/data/example_library/dist/asdf.txt +0 -0
  85. data/spec/jdt/manifest/data/example_library/manifest.xml +22 -0
  86. data/spec/jdt/manifest/data/library.xml +33 -0
  87. data/spec/jdt/manifest/data/library_error.xml +23 -0
  88. data/spec/jdt/manifest/data/library_minimum.xml +11 -0
  89. data/spec/jdt/manifest/data/manifest.xml +4 -0
  90. data/spec/jdt/manifest/example_library_spec.rb +27 -0
  91. data/spec/jdt/manifest/finder_spec.rb +58 -0
  92. data/spec/jdt/manifest/library_manifest_spec.rb +17 -0
  93. data/spec/jdt/manifest/manifest_spec.rb +68 -0
  94. data/spec/jdt/manifest/referenced_spec.rb +28 -0
  95. data/spec/jdt/manifest/secure_spec.rb +42 -0
  96. data/spec/jdt/manifest/validation_spec.rb +45 -0
  97. data/spec/jdt/version_spec.rb +9 -0
  98. metadata +211 -0
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <extension type="module" version="1.6.0" method="upgrade">
3
+ <name><%= @name %></name>
4
+ <author><%= @author %></author>
5
+ <version><%= @version %></version>
6
+ <description><%= @description %></description>
7
+ <creationDate><%= @creation_date %></creationDate>
8
+ <files>
9
+ <filename>mod_<%= @name %>.xml</filename>
10
+ <filename module="mod_<%= @name %>">mod_<%= @name %>.php</filename>
11
+ <filename>helper.php</filename>
12
+ <filename>tmpl/default.php</filename>
13
+ </files>
14
+ <params>
15
+ </params>
16
+ </extension>
@@ -0,0 +1,10 @@
1
+ <?php
2
+
3
+ // no direct access
4
+ defined( '_JEXEC' ) or die( 'Restricted access' );
5
+
6
+ // Include the syndicate functions only once
7
+ require_once( dirname(__FILE__).DS.'helper.php' );
8
+
9
+ $hello = mod<%= @name.capitalize %>Helper::getHello( $params );
10
+ require( JModuleHelper::getLayoutPath( 'mod_<%= @name %>' ) );
@@ -0,0 +1,3 @@
1
+ <?php // no direct access
2
+ defined( '_JEXEC' ) or die( 'Restricted access' ); ?>
3
+ <?php echo $hello; ?>
File without changes
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <extension type="plugin" version="1.6.0" method="upgrade">
3
+ <name><%= @name %></name>
4
+ <author><%= @author %></author>
5
+ <version><%= @version %></version>
6
+ <description><%= @description %></description>
7
+ <creationDate><%= @creation_date %></creationDate>
8
+ <files>
9
+ <filename>mod_<%= @name %>.xml</filename>
10
+ <filename module="mod_<%= @name %>">mod_<%= @name %>.php</filename>
11
+ <filename>helper.php</filename>
12
+ <filename>tmpl/default.php</filename>
13
+ </files>
14
+ <params>
15
+ </params>
16
+ </extension>
@@ -0,0 +1,66 @@
1
+ <?php
2
+ // No direct access to this file
3
+ defined('_JEXEC') or die('Restricted access');
4
+
5
+ /**
6
+ * Script file of HelloWorld component
7
+ */
8
+ class com_helloWorldInstallerScript
9
+ {
10
+ /**
11
+ * method to install the component
12
+ *
13
+ * @return void
14
+ */
15
+ function install($parent)
16
+ {
17
+ // $parent is the class calling this method
18
+ $parent->getParent()->setRedirectURL('index.php?option=com_helloworld');
19
+ }
20
+
21
+ /**
22
+ * method to uninstall the component
23
+ *
24
+ * @return void
25
+ */
26
+ function uninstall($parent)
27
+ {
28
+ // $parent is the class calling this method
29
+ echo '<p>' . JText::_('COM_HELLOWORLD_UNINSTALL_TEXT') . '</p>';
30
+ }
31
+
32
+ /**
33
+ * method to update the component
34
+ *
35
+ * @return void
36
+ */
37
+ function update($parent)
38
+ {
39
+ // $parent is the class calling this method
40
+ echo '<p>' . JText::_('COM_HELLOWORLD_UPDATE_TEXT') . '</p>';
41
+ }
42
+
43
+ /**
44
+ * method to run before an install/update/uninstall method
45
+ *
46
+ * @return void
47
+ */
48
+ function preflight($type, $parent)
49
+ {
50
+ // $parent is the class calling this method
51
+ // $type is the type of change (install, update or discover_install)
52
+ echo '<p>' . JText::_('COM_HELLOWORLD_PREFLIGHT_' . $type . '_TEXT') . '</p>';
53
+ }
54
+
55
+ /**
56
+ * method to run after an install/update/uninstall method
57
+ *
58
+ * @return void
59
+ */
60
+ function postflight($type, $parent)
61
+ {
62
+ // $parent is the class calling this method
63
+ // $type is the type of change (install, update or discover_install)
64
+ echo '<p>' . JText::_('COM_HELLOWORLD_POSTFLIGHT_' . $type . '_TEXT') . '</p>';
65
+ }
66
+ }
@@ -0,0 +1 @@
1
+ require "jdt/generator/generator"
@@ -0,0 +1,77 @@
1
+ require "nokogiri"
2
+
3
+ module Jdt
4
+
5
+ class ElementNotFoundError < RuntimeError
6
+
7
+ end
8
+
9
+ class Manifest
10
+
11
+ def required_joomla_version
12
+ @doc.xpath("//extension").first['version']
13
+ end
14
+
15
+ def ext_method
16
+ @doc.xpath("//extension").first['method']
17
+ end
18
+
19
+ def author
20
+ @doc.xpath("//extension/author").text
21
+ end
22
+
23
+ def author_email
24
+ @doc.xpath("//extension/authorEmail").text
25
+ end
26
+
27
+ def author_url
28
+ @doc.xpath("//extension/authorUrl").text
29
+ end
30
+
31
+ def creation_date
32
+ @doc.xpath("//extension/creationDate").text
33
+ end
34
+
35
+ def name
36
+ @doc.xpath("//extension/name").text
37
+ end
38
+
39
+ def prefixed_name
40
+ "#{ext_type_short}_#{name}"
41
+ end
42
+
43
+ def prefixed_name_with_version
44
+ "#{prefixed_name}-v#{version}"
45
+ end
46
+
47
+ def description
48
+ @doc.xpath("//extension/description").text
49
+ end
50
+
51
+ def version
52
+ @doc.xpath("//extension/version").text
53
+ end
54
+
55
+ def homepage
56
+ @doc.xpath("//extension/homepage").text
57
+ end
58
+
59
+ def copyright
60
+ @doc.xpath("//extension/copyright").text
61
+ end
62
+
63
+ def license
64
+ @doc.xpath("//extension/license").text
65
+ end
66
+
67
+ def ext_type_short
68
+ raise NoMethodError
69
+ end
70
+
71
+ def ext_type
72
+ @doc.xpath("//extension").first['type']
73
+ end
74
+
75
+ end
76
+
77
+ end
@@ -0,0 +1,106 @@
1
+ require 'zip/zip'
2
+
3
+ module Jdt
4
+
5
+ class Manifest
6
+
7
+ def build
8
+ ExtensionZipper.new(self).zip(:build)
9
+ end
10
+
11
+ def release
12
+ ExtensionZipper.new(self).zip(:release)
13
+ end
14
+
15
+ end
16
+
17
+ class ExtensionZipper
18
+
19
+ def initialize(manifest)
20
+ @manifest = manifest
21
+ end
22
+
23
+ def zip(type)
24
+
25
+ if (type == :release)
26
+ zip_file_name = zip_file
27
+ elsif (type == :build)
28
+ zip_file_name = zip_file_with_timestamp
29
+ else
30
+ raise ArgumentError("Type is not either :release or :build, but #{type}")
31
+ end
32
+
33
+ # ensure that the file does not exist
34
+ if (File.exists?(zip_file_name))
35
+ File.delete(zip_file_name)
36
+ end
37
+
38
+ # ensure that directory exists
39
+ dir = File.dirname(zip_file_name)
40
+ if(not File.directory?(dir))
41
+ Dir.mkdir(dir)
42
+ end
43
+
44
+ # create zip file
45
+ Zip::ZipFile.open(zip_file_name, Zip::ZipFile::CREATE) do |zos|
46
+ add_files_to_zip(zos)
47
+ end
48
+
49
+ # return zip file
50
+ zip_file_name
51
+ end
52
+
53
+ private
54
+
55
+ def zip_folder
56
+ "#{@manifest.folder}/zip"
57
+ end
58
+
59
+ def zip_file
60
+ "#{zip_folder}/#{@manifest.prefixed_name_with_version}.zip"
61
+ end
62
+
63
+ def zip_file_with_timestamp
64
+ "#{zip_folder}/#{@manifest.prefixed_name_with_version}_#{timestamp}.zip"
65
+ end
66
+
67
+ def timestamp
68
+ Time.now.strftime("%Y%m%d%H%M%S%L")
69
+ end
70
+
71
+ def add_files_to_zip(zip)
72
+
73
+ # add manifest
74
+ add_manifest(zip)
75
+
76
+ # add all referenced files and folders from manifest
77
+ add_referenced(zip)
78
+
79
+ end
80
+
81
+ def add_manifest(zip)
82
+ zip.add(File.basename(@manifest.file), @manifest.file)
83
+ end
84
+
85
+ def add_referenced(zip)
86
+ @manifest.referenced.each do |ref|
87
+
88
+ if (ref.file?)
89
+ zip.add(ref.path_in_extension, ref.path_in_filesystem)
90
+ elsif (ref.folder?)
91
+ Dir["#{ref.path_in_filesystem}/**/*"].each do |f|
92
+ if (File.file?(f))
93
+ absolute_file = File.expand_path(f)
94
+ relative_file = absolute_file[(@manifest.folder.length + 1) .. -1]
95
+ zip.add(relative_file, absolute_file)
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+
103
+
104
+ end
105
+
106
+ end
@@ -0,0 +1,40 @@
1
+ require "nokogiri"
2
+
3
+ module Jdt
4
+
5
+ class Manifest
6
+
7
+ def bump!(type)
8
+ new_version = bump_version(type, version)
9
+ @doc.at_css("extension > version").content = new_version
10
+ update_file_with_doc
11
+ end
12
+
13
+ private
14
+
15
+ def update_file_with_doc
16
+ File.open(file,"w") do |f|
17
+ f.write(@doc.to_xml)
18
+ end
19
+ end
20
+
21
+ def bump_version(type, version)
22
+ new_version = version.split(".").map { |item| item.to_i }
23
+ if (type == :patch)
24
+ new_version[2] = new_version[2] + 1
25
+ elsif (type == :minor)
26
+ new_version[1] = new_version[1] + 1
27
+ new_version[2] = 0
28
+ elsif (type == :major)
29
+ new_version[0] = new_version[0] + 1
30
+ new_version[1] = 0
31
+ new_version[2] = 0
32
+ else
33
+ raise RuntimeError("given type (#{type})not found")
34
+ end
35
+ new_version.join(".")
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,58 @@
1
+ module Jdt
2
+
3
+ class Manifest
4
+
5
+ def self.find(path = ".")
6
+ Manifest.new(ManifestFinder.new(path).find).to_specific
7
+ end
8
+
9
+ def to_specific
10
+ if(ext_type == "library")
11
+ LibraryManifest.new(file)
12
+ else
13
+ raise RuntimeError("the current type #{ext_type} is not supported")
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ class NoManifestException < RuntimeError
20
+
21
+ end
22
+
23
+ class ManifestFinder
24
+
25
+ attr_accessor :path
26
+
27
+ def initialize(search_path = ".")
28
+ @path = search_path
29
+ end
30
+
31
+ def find
32
+ retrieve_manifest_path
33
+ end
34
+
35
+ private
36
+
37
+ def retrieve_manifest_path
38
+
39
+ # create list of possible files for the manifest
40
+ manifest_named_after_directory = File.basename(File.expand_path(path))
41
+ manifest_files = ["#{File.expand_path(path)}/manifest.xml", manifest_named_after_directory]
42
+
43
+ # evaluate each possible manifest file
44
+ manifest_files.each do |file|
45
+
46
+ if (File.exists?(file))
47
+ return file
48
+ end
49
+
50
+ end
51
+
52
+ # if no manifest is found, raise error
53
+ raise NoManifestException, "Manifest not found in current directory"
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,19 @@
1
+ require "nokogiri"
2
+
3
+ module Jdt
4
+ class LibraryManifest < Manifest
5
+
6
+ def type
7
+ "library"
8
+ end
9
+
10
+ def ext_type_short
11
+ "lib"
12
+ end
13
+
14
+ def library_name
15
+ @doc.xpath("//extension/libraryname").text
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ require "nokogiri"
2
+
3
+ module Jdt
4
+
5
+ class Manifest
6
+
7
+ attr_accessor :file, :doc
8
+
9
+ def initialize(path)
10
+ @file = path
11
+ @doc = Nokogiri::XML(File.read(file))
12
+ end
13
+
14
+ def to_xml
15
+ xsl = Nokogiri::XSLT(File.read("#{File.dirname(File.expand_path(__FILE__))}/xslts/pretty_print.xsl"))
16
+ xsl.transform(@doc).to_s
17
+ end
18
+
19
+ def folder
20
+ File.dirname(file)
21
+ end
22
+
23
+ def exists?
24
+ File.exists?(file)
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,96 @@
1
+ module Jdt
2
+
3
+ class Manifest
4
+
5
+ def referenced
6
+
7
+ list = []
8
+
9
+ # add files and media
10
+ @doc.css("files","media").each do |files|
11
+
12
+ parent_folder = files['folder']
13
+
14
+ files.css("filename").each do |file|
15
+ list << create_file_ref(file.text,parent_folder)
16
+ end
17
+
18
+ files.css("folder").each do |file|
19
+ list << create_folder_ref(file.text,parent_folder)
20
+ end
21
+
22
+ end
23
+
24
+ # scriptfile
25
+ @doc.css("scriptfile").each do |file|
26
+ list << create_file_ref(file.text)
27
+ end
28
+
29
+ return list
30
+ end
31
+
32
+ private
33
+
34
+ def create_file_ref(path, parent_folder = nil)
35
+ ref = Referenced.new
36
+ ref.path = path
37
+ ref.parent_folder = parent_folder
38
+ ref.type = :file
39
+ ref.extension_path = folder
40
+
41
+ return ref
42
+ end
43
+
44
+ def create_folder_ref(path, parent_folder = nil)
45
+ ref = Referenced.new
46
+ ref.path = path
47
+ ref.parent_folder = parent_folder
48
+ ref.type = :folder
49
+ ref.extension_path = folder
50
+
51
+ return ref
52
+ end
53
+
54
+ end
55
+
56
+ class Referenced
57
+
58
+ attr_accessor :parent_folder, :path, :type, :extension_path
59
+
60
+ def path_in_filesystem
61
+ "#{extension_path}/#{path_in_extension}"
62
+ end
63
+
64
+ def path_in_extension
65
+ if (parent_folder and parent_folder != "")
66
+ "#{parent_folder}/#{path}"
67
+ else
68
+ "#{path}"
69
+ end
70
+ end
71
+
72
+ def file?
73
+ type == :file
74
+ end
75
+
76
+ def folder?
77
+ type == :folder
78
+ end
79
+
80
+ def exists?
81
+ if (file?)
82
+ File.exists?(path_in_filesystem)
83
+ elsif (folder?)
84
+ Dir.exists?(path_in_filesystem)
85
+ else
86
+ raise RuntimeError("Neither file nor folder.")
87
+ end
88
+ end
89
+
90
+ def to_s
91
+ "Reference to #{type} #{path_in_extension}"
92
+ end
93
+
94
+ end
95
+
96
+ end
@@ -0,0 +1,80 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
3
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
4
+ <xs:element name="extension">
5
+ <xs:complexType>
6
+
7
+ <xs:choice maxOccurs="unbounded">
8
+ <xs:element type="xs:string" name="name"/>
9
+ <xs:element type="xs:string" name="libraryname"/>
10
+
11
+ <xs:element type="xs:string" name="version" minOccurs="0"/>
12
+
13
+ <xs:element type="xs:string" name="creationDate" minOccurs="0"/>
14
+ <xs:element type="xs:string" name="homepage" minOccurs="0"/>
15
+
16
+ <xs:element type="xs:string" name="author" minOccurs="0"/>
17
+ <xs:element type="xs:string" name="authorEmail" minOccurs="0"/>
18
+ <xs:element type="xs:string" name="authorUrl" minOccurs="0"/>
19
+
20
+ <xs:element type="xs:string" name="copyright" minOccurs="0"/>
21
+ <xs:element type="xs:string" name="license" minOccurs="0"/>
22
+ <xs:element type="xs:string" name="description" minOccurs="0"/>
23
+
24
+ <xs:element type="filesType" name="files"/>
25
+
26
+ <xs:element type="xs:string" name="scriptfile" minOccurs="0"/>
27
+
28
+ <xs:element name="updateservers">
29
+ <xs:complexType>
30
+ <xs:sequence>
31
+ <xs:element name="server" maxOccurs="unbounded" minOccurs="0">
32
+ <xs:complexType>
33
+ <xs:simpleContent>
34
+ <xs:extension base="xs:string">
35
+ <xs:attribute type="xs:string" name="type" use="optional"/>
36
+ <xs:attribute type="xs:string" name="priority" use="optional"/>
37
+ <xs:attribute type="xs:string" name="name" use="optional"/>
38
+ </xs:extension>
39
+ </xs:simpleContent>
40
+ </xs:complexType>
41
+ </xs:element>
42
+ </xs:sequence>
43
+ </xs:complexType>
44
+ </xs:element>
45
+
46
+ </xs:choice>
47
+
48
+ <xs:attribute name="type">
49
+ <xs:simpleType>
50
+ <xs:restriction base="xs:string">
51
+ <xs:enumeration value="library"/>
52
+ </xs:restriction>
53
+ </xs:simpleType>
54
+ </xs:attribute>
55
+
56
+ <xs:attribute type="xs:string" name="version"/>
57
+
58
+ <xs:attribute name="method">
59
+ <xs:simpleType>
60
+ <xs:restriction base="xs:string">
61
+ <xs:enumeration value="upgrade"/>
62
+ <xs:enumeration value="install"/>
63
+ </xs:restriction>
64
+ </xs:simpleType>
65
+ </xs:attribute>
66
+ </xs:complexType>
67
+ </xs:element>
68
+
69
+
70
+ <xs:complexType name="filesType">
71
+ <xs:choice maxOccurs="unbounded">
72
+ <xs:element type="xs:string" name="filename" minOccurs="0"/>
73
+ <xs:element type="xs:string" name="folder" minOccurs="0"/>
74
+ </xs:choice>
75
+
76
+ <xs:attribute type="xs:string" name="folder"/>
77
+ </xs:complexType>
78
+
79
+
80
+ </xs:schema>
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
3
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
4
+ <xs:element name="extension" type="extensionType"/>
5
+ <xs:complexType name="extensionType">
6
+ <xs:sequence maxOccurs="unbounded">
7
+ <xs:any processContents="lax"/>
8
+ </xs:sequence>
9
+ <xs:attribute name="type">
10
+ <xs:simpleType>
11
+ <xs:restriction base="xs:string">
12
+ <xs:enumeration value="component"/>
13
+ <xs:enumeration value="module"/>
14
+ <xs:enumeration value="plugin"/>
15
+ <xs:enumeration value="library"/>
16
+ <xs:enumeration value="template"/>
17
+ <xs:enumeration value="language"/>
18
+ <xs:enumeration value="package"/>
19
+ </xs:restriction>
20
+ </xs:simpleType>
21
+ </xs:attribute>
22
+ <xs:attribute type="xs:string" name="version"/>
23
+ <xs:attribute name="method">
24
+ <xs:simpleType>
25
+ <xs:restriction base="xs:string">
26
+ <xs:enumeration value="upgrade"/>
27
+ <xs:enumeration value="install"/>
28
+ </xs:restriction>
29
+ </xs:simpleType>
30
+ </xs:attribute>
31
+ </xs:complexType>
32
+ </xs:schema>