jdt 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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>