inqlude 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +23 -0
  3. data/{README → README.md} +0 -0
  4. data/TODO +24 -9
  5. data/accessing-inqlude-data.md +55 -0
  6. data/inqlude.gemspec +2 -1
  7. data/lib/cli.rb +36 -4
  8. data/lib/creator.rb +17 -32
  9. data/lib/distros/suse.rb +2 -2
  10. data/lib/downloader.rb +37 -0
  11. data/lib/exceptions.rb +2 -0
  12. data/lib/inqlude.rb +21 -15
  13. data/lib/json_object.rb +104 -0
  14. data/lib/kde_frameworks_creator.rb +14 -10
  15. data/lib/kde_frameworks_release.rb +14 -13
  16. data/lib/library.rb +4 -4
  17. data/lib/manifest.rb +165 -28
  18. data/lib/manifest_handler.rb +14 -16
  19. data/lib/verifier.rb +23 -48
  20. data/lib/version.rb +1 -1
  21. data/lib/view.rb +29 -26
  22. data/manifest-format.md +15 -0
  23. data/spec/data/inqlude-all-karchive.json +31 -0
  24. data/spec/data/inqlude-all.json +120 -0
  25. data/spec/data/invalid-schema.manifest +4 -0
  26. data/spec/data/karchive-release-5.4.manifest +29 -0
  27. data/spec/data/karchive-release.manifest +7 -7
  28. data/spec/data/karchive.readme +0 -6
  29. data/spec/data/newlib/newlib.manifest +11 -4
  30. data/spec/data/rendertest-generic.manifest +4 -1
  31. data/spec/integration/cli_create_spec.rb +24 -0
  32. data/spec/integration/cli_general_spec.rb +19 -0
  33. data/spec/integration/cli_get_involved_spec.rb +14 -0
  34. data/spec/integration/cli_help_spec.rb +21 -0
  35. data/spec/integration/cli_list_spec.rb +23 -0
  36. data/spec/integration/cli_verify_spec.rb +37 -0
  37. data/spec/integration/cli_view_spec.rb +28 -0
  38. data/spec/integration/spec_helper.rb +2 -0
  39. data/spec/{creator_spec.rb → unit/creator_spec.rb} +8 -41
  40. data/spec/unit/downloader_spec.rb +32 -0
  41. data/spec/unit/json_object_spec.rb +273 -0
  42. data/spec/{kde_frameworks_creator_spec.rb → unit/kde_frameworks_creator_spec.rb} +13 -14
  43. data/spec/{kde_frameworks_release_spec.rb → unit/kde_frameworks_release_spec.rb} +14 -10
  44. data/spec/{library_spec.rb → unit/library_spec.rb} +7 -7
  45. data/spec/{manifest_handler_spec.rb → unit/manifest_handler_spec.rb} +21 -17
  46. data/spec/unit/manifest_spec.rb +301 -0
  47. data/spec/{rpm_manifestizer_spec.rb → unit/rpm_manifestizer_spec.rb} +0 -0
  48. data/spec/{settings_spec.rb → unit/settings_spec.rb} +0 -0
  49. data/spec/{spec_helper.rb → unit/spec_helper.rb} +10 -12
  50. data/spec/{verifier_spec.rb → unit/verifier_spec.rb} +24 -15
  51. data/spec/{view_spec.rb → unit/view_spec.rb} +38 -7
  52. data/view/all.html.haml +4 -4
  53. data/view/commercial.html.haml +1 -1
  54. data/view/development.html.haml +3 -3
  55. data/view/get.html.haml +11 -2
  56. data/view/group.html.haml +4 -4
  57. data/view/index.html.haml +1 -1
  58. data/view/library.html.haml +8 -9
  59. data/view/unreleased.html.haml +1 -1
  60. data/yes_ship_it.conf +3 -0
  61. metadata +67 -51
  62. data/spec/manifest_spec.rb +0 -63
@@ -0,0 +1,104 @@
1
+ class JsonObject
2
+
3
+ def self.attribute(name, &block)
4
+ define_method("#{name}=") do |value|
5
+ @values[name] = value
6
+ @valid[name] = true
7
+ end
8
+
9
+ @keys ||= Hash.new
10
+
11
+ if block_given?
12
+ define_method("#{name}") do
13
+ return @values[name]
14
+ end
15
+
16
+ nested_class = self.const_set(name.to_s.capitalize, Class.new(JsonObject))
17
+ nested_class.class_exec(&block)
18
+ type = nested_class
19
+ else
20
+ define_method("#{name}") do
21
+ if @valid[name]
22
+ return @values[name]
23
+ else
24
+ return nil
25
+ end
26
+ end
27
+
28
+ type = nil
29
+ end
30
+ @keys[name] = type
31
+ end
32
+
33
+ def self.keys
34
+ @keys
35
+ end
36
+
37
+ def self.all_keys
38
+ keys = Hash.new
39
+ klass = self
40
+ while(klass != JsonObject) do
41
+ if klass.keys
42
+ keys.merge!(klass.keys)
43
+ end
44
+ klass = klass.superclass
45
+ end
46
+ keys
47
+ end
48
+
49
+ attr_accessor :schema_id
50
+
51
+ def initialize
52
+ @values = Hash.new
53
+ self.class.all_keys.each do |key,value|
54
+ if value
55
+ @values[key] = value.new
56
+ end
57
+ end
58
+ @valid = Hash.new
59
+ end
60
+
61
+ def valid?
62
+ !@valid.empty?
63
+ end
64
+
65
+ def from_hash(hash)
66
+ hash.each do |key, value|
67
+ next if key == "$schema"
68
+ type = self.class.all_keys[key.to_sym]
69
+ value = hash[key]
70
+ if type
71
+ nested_object = send("#{key}")
72
+ nested_object.from_hash(value)
73
+ else
74
+ send("#{key}=", value)
75
+ end
76
+ end
77
+ self
78
+ end
79
+
80
+ def from_json(json_string)
81
+ from_hash(JSON(json_string))
82
+ end
83
+
84
+ def to_hash
85
+ hash = Hash.new
86
+ if schema_id
87
+ hash["$schema"] = schema_id
88
+ end
89
+ self.class.all_keys.each do |attribute,type|
90
+ value = @values[attribute]
91
+ if type && value.valid?
92
+ hash[attribute] = value.to_hash
93
+ elsif @valid[attribute]
94
+ hash[attribute] = value
95
+ end
96
+ end
97
+ hash
98
+ end
99
+
100
+ def to_json
101
+ JSON.pretty_generate(to_hash)
102
+ end
103
+
104
+ end
@@ -42,7 +42,7 @@ class KdeFrameworksCreator
42
42
 
43
43
  def framework name
44
44
  f = @frameworks[name]
45
- raise "Unable to read '#{name}'" if !f
45
+ raise InqludeError.new("Unable to read '#{name}'") if !f
46
46
  f
47
47
  end
48
48
 
@@ -52,6 +52,10 @@ class KdeFrameworksCreator
52
52
  name = extract_name( path )
53
53
  framework = @frameworks[name] || {}
54
54
 
55
+ framework["link_home_page"] = "https://projects.kde.org/projects/frameworks/#{name}"
56
+ framework["link_mailing_list"] = "https://mail.kde.org/mailman/listinfo/kde-frameworks-devel"
57
+ framework["link_git_repository"] = "https://projects.kde.org/projects/frameworks/#{name}/repository"
58
+
55
59
  state = nil
56
60
  File.open(File.join(path,"README.md")).each_line do |line|
57
61
  if line =~ /^# (.*)/
@@ -160,14 +164,14 @@ class KdeFrameworksCreator
160
164
  end
161
165
 
162
166
  def fill_in_data framework, manifest
163
- manifest["display_name"] = framework["title"]
164
- manifest["summary"] = framework["summary"]
165
- manifest["description"] = framework["introduction"]
166
- manifest["urls"]["vcs"] = framework["link_git_repository"]
167
- manifest["urls"]["homepage"] = framework["link_home_page"]
168
- manifest["urls"]["mailing_list"] = framework["link_mailing_list"]
169
- manifest["licenses"] = [ "LGPLv2.1+" ]
170
- manifest["authors"] = [ "The KDE Community" ]
171
- manifest["group"] = "kde-frameworks"
167
+ manifest.display_name = framework["title"]
168
+ manifest.summary = framework["summary"]
169
+ manifest.description = framework["introduction"]
170
+ manifest.urls.vcs = framework["link_git_repository"]
171
+ manifest.urls.homepage = framework["link_home_page"]
172
+ manifest.urls.mailing_list = framework["link_mailing_list"]
173
+ manifest.licenses = [ "LGPLv2.1+" ]
174
+ manifest.authors = [ "The KDE Community" ]
175
+ manifest.group = "kde-frameworks"
172
176
  end
173
177
  end
@@ -22,19 +22,20 @@ class KdeFrameworksRelease
22
22
  @handler = handler
23
23
  end
24
24
 
25
+ def self.strip_patch_release(version)
26
+ version =~ /^(\d+\.\d+)\./
27
+ $1
28
+ end
29
+
25
30
  def self.create_release_manifest generic_manifest, release_date, version
26
- m = generic_manifest
27
- name = m["name"]
28
- download_url = "http://download.kde.org/stable/frameworks/#{version}/"
29
- m["$schema"] = Manifest.release_schema_id
30
- m["schema_type"] = "release"
31
- m["urls"]["download"] = download_url
32
- m["maturity"] = "stable"
33
- m["release_date"] = release_date
34
- m["version"] = version
35
- m["packages"] = {
36
- "source" => "#{download_url}#{name}-#{version}.tar.xz"
37
- }
31
+ m = generic_manifest.create_release_manifest(release_date, version)
32
+
33
+ version_dir = strip_patch_release(version)
34
+
35
+ download_url = "http://download.kde.org/stable/frameworks/#{version_dir}/"
36
+ m.urls.download = download_url
37
+ m.maturity = "stable"
38
+ m.packages.source = "#{download_url}#{m.name}-#{version}.tar.xz"
38
39
  m
39
40
  end
40
41
 
@@ -53,7 +54,7 @@ class KdeFrameworksRelease
53
54
  generic_manifest, release_date, version )
54
55
  path = @handler.manifest_path( release_manifest )
55
56
  File.open( path, "w" ) do |file|
56
- file.write Manifest.to_json( release_manifest )
57
+ file.write release_manifest.to_json
57
58
  end
58
59
  end
59
60
  end
@@ -4,12 +4,12 @@ class Library
4
4
  attr_accessor :manifests
5
5
 
6
6
  def versions
7
- versions = release_manifests.map { |m| m["version"] }
7
+ versions = release_manifests.map { |m| m.version }
8
8
  end
9
9
 
10
10
  def generic_manifest
11
11
  @manifests.each do |m|
12
- if m["schema_type"] == "generic"
12
+ if m.is_a?(ManifestGeneric)
13
13
  return m
14
14
  end
15
15
  end
@@ -17,9 +17,9 @@ class Library
17
17
  end
18
18
 
19
19
  def release_manifests
20
- result = @manifests.reject { |m| m["schema_type"] == "generic" }
20
+ result = @manifests.reject { |m| m.is_a?(ManifestGeneric) }
21
21
  result.sort! do |m1,m2|
22
- m1["release_date"] <=> m2["release_date"]
22
+ m1.release_date <=> m2.release_date
23
23
  end
24
24
  result
25
25
  end
@@ -1,43 +1,180 @@
1
- class Manifest
1
+ class Manifest < JsonObject
2
2
 
3
- def self.generic_schema_id
3
+ def self.descendants
4
+ ObjectSpace.each_object(::Class).select { |klass| klass < self }
5
+ end
6
+
7
+ def self.for_schema_id schema_id
8
+ descendants.each do |manifest_class|
9
+ if schema_id == manifest_class.schema_id
10
+ return manifest_class.new
11
+ end
12
+ end
13
+ raise VerificationError.new("Unknown schema id '#{schema_id}'")
14
+ end
15
+
16
+ def self.parse_file path
17
+ json = JSON File.read path
18
+ manifest = Manifest.for_schema_id(json["$schema"])
19
+ manifest.filename = File.basename path
20
+ manifest.filename =~ /^(.*?)\./
21
+ manifest.libraryname = $1
22
+
23
+ manifest.from_hash(json)
24
+ end
25
+
26
+ def self.parse_schema_version schema_id
27
+ schema_id =~ /^http:\/\/inqlude\.org\/schema\/(.*)-manifest-v(.*)\#$/
28
+ type = $1
29
+ version = $2.to_i
30
+ if !type || !version
31
+ raise InqludeError.new("Unable to parse schema id '{schema_id}'")
32
+ end
33
+ version
34
+ end
35
+
36
+ attribute :name
37
+ attribute :display_name
38
+ attribute :release_date
39
+ attribute :version
40
+ attribute :summary
41
+ attribute :urls do
42
+ attribute :homepage
43
+ attribute :api_docs
44
+ attribute :download
45
+ attribute :tutorial
46
+ attribute :vcs
47
+ attribute :description_source
48
+ attribute :announcement
49
+ attribute :mailing_list
50
+ attribute :contact
51
+ attribute :custom
52
+ end
53
+ attribute :licenses
54
+ attribute :description
55
+ attribute :authors
56
+ attribute :maturity
57
+ attribute :platforms
58
+ attribute :packages do
59
+ attribute :source
60
+ attribute :openSUSE
61
+ attribute :windows
62
+ attribute :ubuntu
63
+ end
64
+ attribute :group
65
+
66
+ attr_reader :schema_version
67
+
68
+ attr_accessor :filename, :libraryname
69
+
70
+ def initialize(schema_id)
71
+ @schema_id = schema_id
72
+ @schema_version = Manifest.parse_schema_version(schema_id)
73
+ super()
74
+ end
75
+
76
+ def schema_name
77
+ regexp = /Manifest([A-Z][a-z]*)([A-Z][a-z]*)?/
78
+ match = regexp.match(self.class.to_s)
79
+ if !match
80
+ raise "Class '#{self.class} is not a Manifest sub class"
81
+ end
82
+ schema_type = match[1].downcase
83
+ if match[2]
84
+ schema_type += "-" + match[2].downcase
85
+ end
86
+ "#{schema_type}-manifest-v#{schema_version}"
87
+ end
88
+
89
+ def path
90
+ File.join( name, expected_filename )
91
+ end
92
+ end
93
+
94
+ class ManifestGeneric < Manifest
95
+ def self.schema_id
4
96
  "http://inqlude.org/schema/generic-manifest-v1#"
5
97
  end
6
98
 
7
- def self.release_schema_id
99
+ def initialize
100
+ super(ManifestGeneric.schema_id)
101
+ end
102
+
103
+ def expected_filename
104
+ "#{name}.manifest"
105
+ end
106
+
107
+ def is_released?
108
+ # Purely commercial libraries often don't have release information publicly
109
+ # available, so we treat them as released, even, if the manifest only has
110
+ # generic data.
111
+ if licenses == ["Commercial"]
112
+ return true
113
+ else
114
+ return false
115
+ end
116
+ end
117
+
118
+ def has_version?
119
+ false
120
+ end
121
+
122
+ def create_release_manifest(release_date, version)
123
+ m = ManifestRelease.new
124
+ ManifestGeneric.all_keys.each do |key, type|
125
+ value = send("#{key}")
126
+ if value
127
+ m.send("#{key}=", value)
128
+ end
129
+ end
130
+
131
+ m.release_date = release_date
132
+ m.version = version
133
+ m
134
+ end
135
+ end
136
+
137
+ class ManifestRelease < Manifest
138
+ def self.schema_id
8
139
  "http://inqlude.org/schema/release-manifest-v1#"
9
140
  end
10
141
 
11
- def self.proprietary_release_schema_id
142
+ def initialize
143
+ super(ManifestRelease.schema_id)
144
+ end
145
+
146
+ def expected_filename
147
+ "#{name}.#{release_date}.manifest"
148
+ end
149
+
150
+ def is_released?
151
+ return true
152
+ end
153
+
154
+ def has_version?
155
+ true
156
+ end
157
+ end
158
+
159
+ class ManifestProprietaryRelease < Manifest
160
+ def self.schema_id
12
161
  "http://inqlude.org/schema/proprietary-release-manifest-v1#"
13
162
  end
14
163
 
15
- def self.parse_file path
16
- manifest = JSON File.read path
17
- filename = File.basename path
18
- manifest["filename"] = filename
19
- filename =~ /^(.*?)\./
20
- manifest["libraryname"] = $1
21
- manifest["schema_type"],manifest["schema_version"] =
22
- Manifest.parse_schema_id manifest["$schema"]
23
- manifest
164
+ def initialize
165
+ super(ManifestProprietaryRelease.schema_id)
24
166
  end
25
-
26
- def self.to_json manifest
27
- m = manifest.clone
28
- m.delete "filename"
29
- m.delete "libraryname"
30
- m.delete "schema_type"
31
- m.delete "schema_version"
32
- JSON.pretty_generate m
167
+
168
+ def expected_filename
169
+ "#{name}.#{release_date}.manifest"
33
170
  end
34
-
35
- def self.parse_schema_id schema_id
36
- schema_id =~ /^http:\/\/inqlude\.org\/schema\/(.*)-manifest-v(.*)\#$/
37
- type = $1
38
- version = $2.to_i
39
- raise "Unable to parse schema id '{schema_id}'" if !type || !version
40
- return type, version
171
+
172
+ def is_released?
173
+ return true
41
174
  end
42
175
 
176
+ def has_version?
177
+ true
178
+ end
43
179
  end
180
+
@@ -26,13 +26,7 @@ class ManifestHandler
26
26
  end
27
27
 
28
28
  def manifest_path manifest
29
- if manifest["schema_type"] == "release"
30
- return File.join( @settings.manifest_path, manifest["name"],
31
- "#{manifest["name"]}.#{manifest["release_date"]}.manifest" )
32
- else
33
- return File.join( @settings.manifest_path, manifest["name"],
34
- "#{manifest["name"]}.manifest" )
35
- end
29
+ File.join(@settings.manifest_path, manifest.path)
36
30
  end
37
31
 
38
32
  def libraries maturity = nil
@@ -41,31 +35,29 @@ class ManifestHandler
41
35
  else
42
36
  return @libraries.select do |l|
43
37
  manifest = l.latest_manifest
44
- manifest["maturity"] == maturity.to_s &&
45
- manifest["licenses"] != [ "Commercial" ]
38
+ manifest.maturity == maturity.to_s &&
39
+ manifest.licenses != [ "Commercial" ]
46
40
  end
47
41
  end
48
42
  end
49
43
 
50
44
  def unreleased_libraries
51
45
  return @libraries.select do |l|
52
- manifest = l.latest_manifest
53
- manifest["schema_type"] == "generic" &&
54
- manifest["licenses"] != [ "Commercial" ]
46
+ !l.latest_manifest.is_released?
55
47
  end
56
48
  end
57
49
 
58
50
  def commercial_libraries
59
51
  return @libraries.select do |l|
60
52
  manifest = l.latest_manifest
61
- manifest["licenses"].include? "Commercial"
53
+ manifest.licenses.include? "Commercial"
62
54
  end
63
55
  end
64
56
 
65
57
  def group name
66
58
  return @libraries.select do |l|
67
59
  manifest = l.latest_manifest
68
- manifest["group"] == name
60
+ manifest.group == name
69
61
  end
70
62
  end
71
63
 
@@ -79,13 +71,12 @@ class ManifestHandler
79
71
  end
80
72
 
81
73
  def manifest name
82
- read_remote
83
74
  @libraries.each do |library|
84
75
  if library.name == name
85
76
  return library.latest_manifest
86
77
  end
87
78
  end
88
- raise "Unable to find manifest '#{name}'"
79
+ raise InqludeError.new("Unable to find manifest '#{name}'")
89
80
  end
90
81
 
91
82
  def read_remote
@@ -125,4 +116,11 @@ class ManifestHandler
125
116
  end
126
117
  end
127
118
 
119
+ def generate_inqlude_all
120
+ all = []
121
+ libraries.each do |l|
122
+ all.push(l.latest_manifest.to_hash)
123
+ end
124
+ JSON.pretty_generate(all)
125
+ end
128
126
  end