lib/manifest.rb in inqlude-0.7.0 vs lib/manifest.rb in inqlude-0.7.1
- old
+ new
@@ -1,43 +1,180 @@
-class Manifest
+class Manifest < JsonObject
- def self.generic_schema_id
+ def self.descendants
+ ObjectSpace.each_object(::Class).select { |klass| klass < self }
+ end
+
+ def self.for_schema_id schema_id
+ descendants.each do |manifest_class|
+ if schema_id == manifest_class.schema_id
+ return manifest_class.new
+ end
+ end
+ raise VerificationError.new("Unknown schema id '#{schema_id}'")
+ end
+
+ def self.parse_file path
+ json = JSON File.read path
+ manifest = Manifest.for_schema_id(json["$schema"])
+ manifest.filename = File.basename path
+ manifest.filename =~ /^(.*?)\./
+ manifest.libraryname = $1
+
+ manifest.from_hash(json)
+ end
+
+ def self.parse_schema_version schema_id
+ schema_id =~ /^http:\/\/inqlude\.org\/schema\/(.*)-manifest-v(.*)\#$/
+ type = $1
+ version = $2.to_i
+ if !type || !version
+ raise InqludeError.new("Unable to parse schema id '{schema_id}'")
+ end
+ version
+ end
+
+ attribute :name
+ attribute :display_name
+ attribute :release_date
+ attribute :version
+ attribute :summary
+ attribute :urls do
+ attribute :homepage
+ attribute :api_docs
+ attribute :download
+ attribute :tutorial
+ attribute :vcs
+ attribute :description_source
+ attribute :announcement
+ attribute :mailing_list
+ attribute :contact
+ attribute :custom
+ end
+ attribute :licenses
+ attribute :description
+ attribute :authors
+ attribute :maturity
+ attribute :platforms
+ attribute :packages do
+ attribute :source
+ attribute :openSUSE
+ attribute :windows
+ attribute :ubuntu
+ end
+ attribute :group
+
+ attr_reader :schema_version
+
+ attr_accessor :filename, :libraryname
+
+ def initialize(schema_id)
+ @schema_id = schema_id
+ @schema_version = Manifest.parse_schema_version(schema_id)
+ super()
+ end
+
+ def schema_name
+ regexp = /Manifest([A-Z][a-z]*)([A-Z][a-z]*)?/
+ match = regexp.match(self.class.to_s)
+ if !match
+ raise "Class '#{self.class} is not a Manifest sub class"
+ end
+ schema_type = match[1].downcase
+ if match[2]
+ schema_type += "-" + match[2].downcase
+ end
+ "#{schema_type}-manifest-v#{schema_version}"
+ end
+
+ def path
+ File.join( name, expected_filename )
+ end
+end
+
+class ManifestGeneric < Manifest
+ def self.schema_id
"http://inqlude.org/schema/generic-manifest-v1#"
end
- def self.release_schema_id
+ def initialize
+ super(ManifestGeneric.schema_id)
+ end
+
+ def expected_filename
+ "#{name}.manifest"
+ end
+
+ def is_released?
+ # Purely commercial libraries often don't have release information publicly
+ # available, so we treat them as released, even, if the manifest only has
+ # generic data.
+ if licenses == ["Commercial"]
+ return true
+ else
+ return false
+ end
+ end
+
+ def has_version?
+ false
+ end
+
+ def create_release_manifest(release_date, version)
+ m = ManifestRelease.new
+ ManifestGeneric.all_keys.each do |key, type|
+ value = send("#{key}")
+ if value
+ m.send("#{key}=", value)
+ end
+ end
+
+ m.release_date = release_date
+ m.version = version
+ m
+ end
+end
+
+class ManifestRelease < Manifest
+ def self.schema_id
"http://inqlude.org/schema/release-manifest-v1#"
end
- def self.proprietary_release_schema_id
+ def initialize
+ super(ManifestRelease.schema_id)
+ end
+
+ def expected_filename
+ "#{name}.#{release_date}.manifest"
+ end
+
+ def is_released?
+ return true
+ end
+
+ def has_version?
+ true
+ end
+end
+
+class ManifestProprietaryRelease < Manifest
+ def self.schema_id
"http://inqlude.org/schema/proprietary-release-manifest-v1#"
end
- def self.parse_file path
- manifest = JSON File.read path
- filename = File.basename path
- manifest["filename"] = filename
- filename =~ /^(.*?)\./
- manifest["libraryname"] = $1
- manifest["schema_type"],manifest["schema_version"] =
- Manifest.parse_schema_id manifest["$schema"]
- manifest
+ def initialize
+ super(ManifestProprietaryRelease.schema_id)
end
-
- def self.to_json manifest
- m = manifest.clone
- m.delete "filename"
- m.delete "libraryname"
- m.delete "schema_type"
- m.delete "schema_version"
- JSON.pretty_generate m
+
+ def expected_filename
+ "#{name}.#{release_date}.manifest"
end
-
- def self.parse_schema_id schema_id
- schema_id =~ /^http:\/\/inqlude\.org\/schema\/(.*)-manifest-v(.*)\#$/
- type = $1
- version = $2.to_i
- raise "Unable to parse schema id '{schema_id}'" if !type || !version
- return type, version
+
+ def is_released?
+ return true
end
+ def has_version?
+ true
+ end
end
+