inqlude 0.7.0 → 0.7.1

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 (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