inqlude 0.0.8 → 0.7.0

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 (63) hide show
  1. data/.gitignore +1 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +3 -0
  4. data/README +35 -1
  5. data/TODO +50 -15
  6. data/inqlude.gemspec +7 -2
  7. data/lib/cli.rb +70 -6
  8. data/lib/creator.rb +32 -8
  9. data/lib/git_hub_tool.rb +92 -0
  10. data/lib/inqlude.rb +7 -0
  11. data/lib/kde_frameworks_creator.rb +173 -0
  12. data/lib/kde_frameworks_release.rb +61 -0
  13. data/lib/library.rb +26 -1
  14. data/lib/manifest.rb +43 -0
  15. data/lib/manifest_handler.rb +59 -17
  16. data/lib/rpm_manifestizer.rb +2 -2
  17. data/lib/settings.rb +21 -10
  18. data/lib/verifier.rb +29 -18
  19. data/lib/version.rb +1 -1
  20. data/lib/view.rb +55 -10
  21. data/manifest-format.md +27 -12
  22. data/schema/generic-manifest-v1 +54 -0
  23. data/schema/proprietary-release-manifest-v1 +63 -0
  24. data/schema/release-manifest-v1 +73 -0
  25. data/spec/creator_spec.rb +94 -34
  26. data/spec/data/awesomelib/awesomelib.2013-09-08.manifest +14 -6
  27. data/spec/data/bleedingedge/bleedingedge.2012-01-01.manifest +3 -2
  28. data/spec/data/commercial/commercial.manifest +13 -0
  29. data/spec/data/karchive-generic.manifest +22 -0
  30. data/spec/data/karchive-release-beta.manifest +29 -0
  31. data/spec/data/karchive-release.manifest +29 -0
  32. data/spec/data/karchive-release2.manifest +29 -0
  33. data/spec/data/karchive.authors +10 -0
  34. data/spec/data/karchive.readme +35 -0
  35. data/spec/data/kservice-generic.manifest +22 -0
  36. data/spec/data/kservice.readme +9 -0
  37. data/spec/data/newlib/newlib.manifest +13 -0
  38. data/spec/data/proprietarylib/proprietarylib.2013-12-22.manifest +16 -0
  39. data/spec/data/rendertest-generic.manifest +20 -0
  40. data/spec/data/testcontent +1 -0
  41. data/spec/kde_frameworks_creator_spec.rb +263 -0
  42. data/spec/kde_frameworks_release_spec.rb +72 -0
  43. data/spec/library_spec.rb +54 -2
  44. data/spec/manifest_handler_spec.rb +102 -8
  45. data/spec/manifest_spec.rb +63 -0
  46. data/spec/rpm_manifestizer_spec.rb +2 -2
  47. data/spec/settings_spec.rb +53 -4
  48. data/spec/spec_helper.rb +40 -1
  49. data/spec/verifier_spec.rb +53 -22
  50. data/spec/view_spec.rb +145 -0
  51. data/view/all.html.haml +24 -0
  52. data/view/commercial.html.haml +17 -0
  53. data/view/contribute.html.haml +7 -3
  54. data/view/development.html.haml +36 -0
  55. data/view/favicon.ico +0 -0
  56. data/view/group.html.haml +20 -0
  57. data/view/index.html.haml +11 -1
  58. data/view/layout.html.haml +0 -5
  59. data/view/library.html.haml +4 -4
  60. data/view/public/inqlude.css +2 -2
  61. data/view/unreleased.html.haml +18 -0
  62. metadata +172 -97
  63. data/view/edge.html.haml +0 -9
@@ -4,6 +4,9 @@ require "thor"
4
4
  require "json"
5
5
  require "haml"
6
6
  require "date"
7
+ require "json-schema"
8
+ require "kramdown"
9
+ require "xdg"
7
10
 
8
11
  require File.expand_path('../version', __FILE__)
9
12
  require File.expand_path('../cli', __FILE__)
@@ -16,3 +19,7 @@ require File.expand_path('../upstream', __FILE__)
16
19
  require File.expand_path('../verifier', __FILE__)
17
20
  require File.expand_path('../library', __FILE__)
18
21
  require File.expand_path('../creator', __FILE__)
22
+ require File.expand_path('../git_hub_tool', __FILE__)
23
+ require File.expand_path('../manifest', __FILE__)
24
+ require File.expand_path('../kde_frameworks_creator', __FILE__)
25
+ require File.expand_path('../kde_frameworks_release', __FILE__)
@@ -0,0 +1,173 @@
1
+ # Copyright (C) 2014 Cornelius Schumacher <schumacher@kde.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
17
+ class KdeFrameworksCreator
18
+
19
+ attr_reader :warnings, :errors
20
+
21
+ def initialize
22
+ @frameworks = Hash.new
23
+ end
24
+
25
+ def parse_checkout dir_name, options = {}
26
+ @warnings = []
27
+ @errors = []
28
+ Dir.entries( dir_name ).each do |entry|
29
+ next if entry =~ /^\./
30
+ next if entry == "kapidox"
31
+ next if entry == "kde4support"
32
+
33
+ @frameworks[entry] = {}
34
+ parse_readme File.join(dir_name,entry), options
35
+ parse_authors File.join(dir_name,entry)
36
+ end
37
+ end
38
+
39
+ def frameworks
40
+ @frameworks.keys
41
+ end
42
+
43
+ def framework name
44
+ f = @frameworks[name]
45
+ raise "Unable to read '#{name}'" if !f
46
+ f
47
+ end
48
+
49
+ def parse_readme path, options = {}
50
+ @errors = [] if !@errors
51
+
52
+ name = extract_name( path )
53
+ framework = @frameworks[name] || {}
54
+
55
+ state = nil
56
+ File.open(File.join(path,"README.md")).each_line do |line|
57
+ if line =~ /^# (.*)/
58
+ framework["title"] = $1
59
+ state = :parse_summary
60
+ next
61
+ elsif line =~ /^## Introduction/
62
+ framework["introduction"] = ""
63
+ state = :parse_introduction
64
+ next
65
+ elsif line =~ /^## Links/
66
+ state = :parse_links
67
+ next
68
+ end
69
+
70
+ if state == :parse_summary
71
+ if line =~ /^##/
72
+ state = nil
73
+ else
74
+ if !line.strip.empty?
75
+ framework["summary"] = line.strip
76
+ end
77
+ end
78
+ end
79
+
80
+ if state == :parse_introduction
81
+ if line =~ /^##/
82
+ framework["introduction"].strip!
83
+ state = nil
84
+ else
85
+ framework["introduction"] += line
86
+ end
87
+ end
88
+
89
+ if state == :parse_links
90
+ if line =~ /^##/
91
+ state = nil
92
+ else
93
+ if line =~ /- (.*): (.*)/
94
+ link_name = $1
95
+ url = $2
96
+ link_name = link_name.downcase.gsub(/ /,"_")
97
+ if url =~ /<(.*)>/
98
+ url = $1
99
+ end
100
+ framework["link_#{link_name}"] = url
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ required_fields = []
107
+ [ "title", "summary", "introduction", "link_home_page" ].each do |field|
108
+ if !options[:ignore_errors] || !options[:ignore_errors].include?(field)
109
+ required_fields.push field
110
+ end
111
+ end
112
+
113
+ required_fields.each do |field|
114
+ if !framework.has_key?(field) || framework[field].strip.empty?
115
+ @errors.push( { :name => name, :issue => "missing_" + field } )
116
+ end
117
+ end
118
+
119
+ @frameworks[name] = framework
120
+ end
121
+
122
+ def parse_authors path
123
+ name = extract_name( path )
124
+
125
+ authors_path = File.join(path,"AUTHORS")
126
+ if ( !File.exists?( authors_path ) )
127
+ @warnings.push( { :name => name, :issue => "missing_file",
128
+ :details => "AUTHORS" } )
129
+ return
130
+ end
131
+
132
+ authors = []
133
+ File.open(authors_path).each_line do |line|
134
+ if line =~ /(.* <.*@.*>)/
135
+ authors.push $1
136
+ end
137
+ end
138
+
139
+ framework = @frameworks[name] || {}
140
+
141
+ framework["authors"] = authors
142
+
143
+ @frameworks[name] = framework
144
+ end
145
+
146
+ def extract_name path
147
+ path.split("/").last
148
+ end
149
+
150
+ def create_manifests output_dir
151
+ settings = Settings.new
152
+ settings.manifest_path = output_dir
153
+ @frameworks.each do |name,framework|
154
+ creator = Creator.new settings, name
155
+ manifest = creator.create_generic_manifest
156
+ fill_in_data framework, manifest
157
+ creator.create_dir
158
+ creator.write_manifest manifest
159
+ end
160
+ end
161
+
162
+ 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"
172
+ end
173
+ end
@@ -0,0 +1,61 @@
1
+ # Copyright (C) 2014 Cornelius Schumacher <schumacher@kde.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
17
+ class KdeFrameworksRelease
18
+
19
+ attr_reader :generic_manifests
20
+
21
+ def initialize handler
22
+ @handler = handler
23
+ end
24
+
25
+ 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
+ }
38
+ m
39
+ end
40
+
41
+ def read_generic_manifests
42
+ @generic_manifests = Array.new
43
+ @handler.read_remote
44
+ @handler.group("kde-frameworks").each do |library|
45
+ @generic_manifests.push library.generic_manifest
46
+ end
47
+ @generic_manifests
48
+ end
49
+
50
+ def write_release_manifests release_date, version
51
+ @generic_manifests.each do |generic_manifest|
52
+ release_manifest = KdeFrameworksRelease.create_release_manifest(
53
+ generic_manifest, release_date, version )
54
+ path = @handler.manifest_path( release_manifest )
55
+ File.open( path, "w" ) do |file|
56
+ file.write Manifest.to_json( release_manifest )
57
+ end
58
+ end
59
+ end
60
+
61
+ end
@@ -4,7 +4,32 @@ class Library
4
4
  attr_accessor :manifests
5
5
 
6
6
  def versions
7
- versions = @manifests.map { |m| m["version"] }
7
+ versions = release_manifests.map { |m| m["version"] }
8
8
  end
9
9
 
10
+ def generic_manifest
11
+ @manifests.each do |m|
12
+ if m["schema_type"] == "generic"
13
+ return m
14
+ end
15
+ end
16
+ nil
17
+ end
18
+
19
+ def release_manifests
20
+ result = @manifests.reject { |m| m["schema_type"] == "generic" }
21
+ result.sort! do |m1,m2|
22
+ m1["release_date"] <=> m2["release_date"]
23
+ end
24
+ result
25
+ end
26
+
27
+ def latest_manifest
28
+ if release_manifests.empty?
29
+ return generic_manifest
30
+ else
31
+ return release_manifests.last
32
+ end
33
+ end
34
+
10
35
  end
@@ -0,0 +1,43 @@
1
+ class Manifest
2
+
3
+ def self.generic_schema_id
4
+ "http://inqlude.org/schema/generic-manifest-v1#"
5
+ end
6
+
7
+ def self.release_schema_id
8
+ "http://inqlude.org/schema/release-manifest-v1#"
9
+ end
10
+
11
+ def self.proprietary_release_schema_id
12
+ "http://inqlude.org/schema/proprietary-release-manifest-v1#"
13
+ end
14
+
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
24
+ 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
33
+ 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
41
+ end
42
+
43
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2011 Cornelius Schumacher <schumacher@kde.org>
1
+ # Copyright (C) 2011-2013 Cornelius Schumacher <schumacher@kde.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -25,19 +25,64 @@ class ManifestHandler
25
25
  @manifests = Array.new
26
26
  end
27
27
 
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
36
+ end
37
+
28
38
  def libraries maturity = nil
29
39
  if !maturity
30
40
  return @libraries
31
41
  else
32
- return @libraries.select { |l| l.manifests.last["maturity"] == maturity.to_s }
33
- end
42
+ return @libraries.select do |l|
43
+ manifest = l.latest_manifest
44
+ manifest["maturity"] == maturity.to_s &&
45
+ manifest["licenses"] != [ "Commercial" ]
46
+ end
47
+ end
48
+ end
49
+
50
+ def unreleased_libraries
51
+ return @libraries.select do |l|
52
+ manifest = l.latest_manifest
53
+ manifest["schema_type"] == "generic" &&
54
+ manifest["licenses"] != [ "Commercial" ]
55
+ end
56
+ end
57
+
58
+ def commercial_libraries
59
+ return @libraries.select do |l|
60
+ manifest = l.latest_manifest
61
+ manifest["licenses"].include? "Commercial"
62
+ end
63
+ end
64
+
65
+ def group name
66
+ return @libraries.select do |l|
67
+ manifest = l.latest_manifest
68
+ manifest["group"] == name
69
+ end
70
+ end
71
+
72
+ def library name
73
+ @libraries.each do |library|
74
+ if library.name == name
75
+ return library
76
+ end
77
+ end
78
+ nil
34
79
  end
35
80
 
36
81
  def manifest name
37
82
  read_remote
38
83
  @libraries.each do |library|
39
84
  if library.name == name
40
- return library.manifests.last
85
+ return library.latest_manifest
41
86
  end
42
87
  end
43
88
  raise "Unable to find manifest '#{name}'"
@@ -58,13 +103,9 @@ class ManifestHandler
58
103
  library.name = File.basename dirname
59
104
  local_manifests = Array.new
60
105
  Dir.glob( "#{dirname}/*.manifest" ).sort.each do |filename|
61
- File.open filename do |file|
62
- manifest = JSON file.read
63
- manifest["filename"] = File.basename filename
64
- manifest["libraryname"] = library.name
65
- local_manifests.push manifest
66
- manifests.push manifest
67
- end
106
+ manifest = Manifest.parse_file filename
107
+ local_manifests.push manifest
108
+ manifests.push manifest
68
109
  end
69
110
  library.manifests = local_manifests
70
111
  libraries.push library
@@ -72,14 +113,15 @@ class ManifestHandler
72
113
  end
73
114
 
74
115
  def fetch_remote
75
- if !File.exists? @settings.manifest_path + "/.git"
76
- if File.exists? @settings.manifest_path
77
- system "rm -r #{@settings.manifest_path}"
116
+ if File.exists? @settings.manifest_path
117
+ if !File.exists? @settings.manifest_path + "/.git"
118
+ raise "Can't fetch data into '#{@settings.manifest_path}' because it's not a git repository."
119
+ else
120
+ system "cd #{@settings.manifest_path}; git pull >/dev/null"
78
121
  end
79
- system "git clone https://github.com/cornelius/inqlude-data.git " +
80
- "#{@settings.manifest_path}"
81
122
  else
82
- system "cd #{@settings.manifest_path}; git pull"
123
+ system "git clone git://anongit.kde.org/websites/inqlude-data " +
124
+ "#{@settings.manifest_path}"
83
125
  end
84
126
  end
85
127
 
@@ -122,11 +122,11 @@ class RpmManifestizer
122
122
  end
123
123
 
124
124
  def is_library? rpm_name
125
- rpm_name =~ /^lib/
125
+ !!(rpm_name =~ /^lib/)
126
126
  end
127
127
 
128
128
  def is_32bit? rpm_name
129
- rpm_name =~ /\-32bit/
129
+ !!(rpm_name =~ /\-32bit/)
130
130
  end
131
131
 
132
132
  def cut_off_number_suffix name