indexer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.index +54 -0
  2. data/HISTORY.md +9 -0
  3. data/README.md +145 -0
  4. data/bin/index +7 -0
  5. data/data/indexer/r2013/index.kwalify +175 -0
  6. data/data/indexer/r2013/index.yes +172 -0
  7. data/data/indexer/r2013/index.yesi +67 -0
  8. data/data/indexer/r2013/ruby.txt +35 -0
  9. data/data/indexer/r2013/yaml.txt +30 -0
  10. data/lib/indexer.rb +65 -0
  11. data/lib/indexer/attributes.rb +171 -0
  12. data/lib/indexer/command.rb +260 -0
  13. data/lib/indexer/components.rb +8 -0
  14. data/lib/indexer/components/author.rb +140 -0
  15. data/lib/indexer/components/conflict.rb +78 -0
  16. data/lib/indexer/components/copyright.rb +95 -0
  17. data/lib/indexer/components/dependency.rb +18 -0
  18. data/lib/indexer/components/organization.rb +133 -0
  19. data/lib/indexer/components/repository.rb +140 -0
  20. data/lib/indexer/components/requirement.rb +360 -0
  21. data/lib/indexer/components/resource.rb +209 -0
  22. data/lib/indexer/conversion.rb +14 -0
  23. data/lib/indexer/conversion/gemfile.rb +44 -0
  24. data/lib/indexer/conversion/gemspec.rb +114 -0
  25. data/lib/indexer/conversion/gemspec_exporter.rb +304 -0
  26. data/lib/indexer/core_ext.rb +4 -0
  27. data/lib/indexer/error.rb +23 -0
  28. data/lib/indexer/gemfile.rb +75 -0
  29. data/lib/indexer/importer.rb +144 -0
  30. data/lib/indexer/importer/file.rb +94 -0
  31. data/lib/indexer/importer/gemfile.rb +27 -0
  32. data/lib/indexer/importer/gemspec.rb +43 -0
  33. data/lib/indexer/importer/html.rb +289 -0
  34. data/lib/indexer/importer/markdown.rb +45 -0
  35. data/lib/indexer/importer/ruby.rb +47 -0
  36. data/lib/indexer/importer/version.rb +38 -0
  37. data/lib/indexer/importer/yaml.rb +46 -0
  38. data/lib/indexer/loadable.rb +159 -0
  39. data/lib/indexer/metadata.rb +879 -0
  40. data/lib/indexer/model.rb +237 -0
  41. data/lib/indexer/revision.rb +43 -0
  42. data/lib/indexer/valid.rb +287 -0
  43. data/lib/indexer/validator.rb +313 -0
  44. data/lib/indexer/version/constraint.rb +124 -0
  45. data/lib/indexer/version/exceptions.rb +11 -0
  46. data/lib/indexer/version/number.rb +497 -0
  47. metadata +141 -0
@@ -0,0 +1,8 @@
1
+ require_relative 'components/author'
2
+ require_relative 'components/organization'
3
+ require_relative 'components/copyright'
4
+ require_relative 'components/conflict'
5
+ require_relative 'components/resource'
6
+ require_relative 'components/repository'
7
+ require_relative 'components/requirement'
8
+
@@ -0,0 +1,140 @@
1
+ module Indexer
2
+
3
+ # Author is used to model Authors and Maintainers.
4
+ #
5
+ # TODO: Should Author have an `organization` field. If so
6
+ # is it a map with `name` and `website` fields?
7
+ #
8
+ # TODO: Should we have `team` field (think Github)?
9
+ #
10
+ class Author < Model
11
+
12
+ # Parse `entry` and create Author object.
13
+ def self.parse(entry)
14
+ case entry
15
+ when Author
16
+ entry
17
+ when String
18
+ parse_string(entry)
19
+ when Array
20
+ parse_array(entry)
21
+ when Hash
22
+ new(entry)
23
+ end
24
+ end
25
+
26
+ #
27
+ def self.parse_array(array)
28
+ data = {}
29
+ array.each do |value|
30
+ v = value.strip
31
+ case v
32
+ when /^(.*?)\s*\<(.*?@.*?)\>/
33
+ data[:name] = $1 unless $1.empty?
34
+ data[:email] = $2
35
+ when /^(http|https)\:/
36
+ data[:website] = v
37
+ when /\@/
38
+ data[:email] = v
39
+ else
40
+ data[:name] = v
41
+ end
42
+ end
43
+ new(data)
44
+ end
45
+
46
+ #
47
+ def self.parse_string(string)
48
+ if md = /(.*?)\s*\<(.*?)\>/.match(string)
49
+ new(:name=>md[1], :email=>md[2])
50
+ else
51
+ new(:name=>string)
52
+ end
53
+ end
54
+
55
+ #
56
+ def initialize(data)
57
+ super(data)
58
+ #raise ArgumentError, "person must have a name" unless name
59
+ end
60
+
61
+ #
62
+ def initialize_attributes
63
+ @data = {
64
+ :roles => []
65
+ }
66
+ end
67
+
68
+ #
69
+ attr :name
70
+
71
+ #
72
+ def name=(name)
73
+ Valid.oneline!(name, :name)
74
+ @data[:name] = name
75
+ end
76
+
77
+ #
78
+ attr :email
79
+
80
+ #
81
+ def email=(email)
82
+ Valid.email!(email, :email)
83
+ @data[:email] = email
84
+ end
85
+
86
+ #
87
+ attr :website
88
+
89
+ #
90
+ def website=(website)
91
+ Valid.url!(website, :website)
92
+ @data[:website] = website
93
+ end
94
+
95
+ #
96
+ attr :team
97
+
98
+ # TODO: validate team
99
+ def team=(team)
100
+ @data[:team] = team
101
+ end
102
+
103
+ # List of roles the person plays in the project.
104
+ # This can be any string or array of strings.
105
+ attr :roles
106
+
107
+ #
108
+ def roles=(role)
109
+ @data[:roles] = (
110
+ r = [role].flatten
111
+ r.each{ |x| Valid.oneline?(x) }
112
+ r
113
+ )
114
+ end
115
+
116
+ alias :role :roles
117
+ alias :role= :roles=
118
+
119
+ alias :group :roles
120
+ alias :group= :roles=
121
+
122
+ #
123
+ def to_h
124
+ h = {}
125
+ h['name'] = name
126
+ h['email'] = email if email
127
+ h['website'] = website if website
128
+ h['roles'] = roles if not roles.empty?
129
+ h
130
+ end
131
+
132
+ # CONSIDE: Only name has to be equal?
133
+ def ==(other)
134
+ return false unless Author === other
135
+ return false unless name == other.name
136
+ return true
137
+ end
138
+ end
139
+
140
+ end
@@ -0,0 +1,78 @@
1
+ module Indexer
2
+
3
+ # The Conflict class models the name and versions of
4
+ # packages that have know incompatibilities.
5
+ #
6
+ class Conflict < Model
7
+
8
+ # Parse `data` into a Dependency instance.
9
+ #
10
+ # TODO: What about respond_to?(:to_str) for String, etc.
11
+ def self.parse(data)
12
+ case data
13
+ when String
14
+ parse_string(data)
15
+ when Array
16
+ parse_array(data)
17
+ when Hash
18
+ parse_hash(data)
19
+ else
20
+ raise(ValidationError, "Conflict")
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ #
27
+ #
28
+ def self.parse_string(data)
29
+ name, version = data.split(/\s+/)
30
+ new(:name=>name, :version=>version)
31
+ end
32
+
33
+ #
34
+ #
35
+ def self.parse_array(data)
36
+ name, version = *data
37
+ new(:name=>name, :version=>version)
38
+ end
39
+
40
+ #
41
+ #
42
+ def self.parse_hash(data)
43
+ new(data)
44
+ end
45
+
46
+ public
47
+
48
+ #
49
+ # The name of the package that causes the conflict.
50
+ #
51
+ # Yea it's *ALWAYS* THEIR fault ;-)
52
+ #
53
+ attr :name
54
+
55
+ #
56
+ # Set the name of the package.
57
+ #
58
+ def name=(name)
59
+ @data[:name] = name.to_s
60
+ end
61
+
62
+ #
63
+ # The versions constraint of the conflicting package.
64
+ # This is used when only certain versions of the package
65
+ # are the problem.
66
+ #
67
+ attr_reader :version
68
+
69
+ #
70
+ # Set the version constraint.
71
+ #
72
+ def version=(version)
73
+ @data[:version] = Version::Constraint.parse(version)
74
+ end
75
+
76
+ end
77
+
78
+ end
@@ -0,0 +1,95 @@
1
+ module Indexer
2
+
3
+ # Copyright class models a copyright holer, the year of copyright
4
+ # and the accosiated license.
5
+ #
6
+ class Copyright < Model
7
+
8
+ # Parse copyright entry.
9
+ #
10
+ def self.parse(copyright, default_license=nil)
11
+ case copyright
12
+ when Array
13
+ year, holder, license = *copyright
14
+ when Hash
15
+ year = copyright['year'] || copyright[:year]
16
+ holder = copyright['holder'] || copyright[:holder]
17
+ license = copyright['license'] || copyright[:license]
18
+ when String
19
+ case copyright
20
+ when /(\d\d\d\d)\s+(.*?)\s*\((.*?)\)$/
21
+ year, holder, license = $1, $2, $3
22
+ when /(\d\d\d\d)\s+(.*?)\s*$/
23
+ year, holder, license = $1, $2, nil
24
+ when /(opyright|\(c\))(.*?)\s*\((.*?)\)$/
25
+ year, holder, license = nil, $1, $2
26
+ when /(opyright|\(c\))(.*?)\s*$/
27
+ year, holder, license = nil, $1, nil
28
+ end
29
+ else
30
+ raise ValidationError, "copyright"
31
+ end
32
+ license = license || default_license
33
+ new(:holder=>holder, :year=>year, :license=>license)
34
+ end
35
+
36
+ #
37
+ def initialize(data)
38
+ super(data)
39
+ raise(ValidationError, "copyright must have a holder") unless holder
40
+ end
41
+
42
+ #
43
+ attr :year
44
+
45
+ #
46
+ attr :holder
47
+
48
+ #
49
+ attr :license
50
+
51
+ #
52
+ def year=(year)
53
+ Valid.copyright_year!(year, "copyright.year")
54
+ @data[:year] = year
55
+ end
56
+
57
+ #
58
+ def holder=(holder)
59
+ Valid.oneline!(holder, "copyright.holder")
60
+ @data[:holder] = holder
61
+ end
62
+
63
+ #
64
+ def license=(license)
65
+ if license.nil?
66
+ @data.delete(:license)
67
+ else
68
+ Valid.oneline!(license, "copyright.license")
69
+ @data[:license] = license
70
+ end
71
+ end
72
+
73
+ #
74
+ # Standard copyright stamp.
75
+ #
76
+ def to_s
77
+ s = ["Copyright (c)"]
78
+ s << year if year
79
+ s << holder
80
+ s << "(#{license})" if license
81
+ s.join(' ') + ". All Rights Reserved."
82
+ end
83
+
84
+ #
85
+ def to_h
86
+ h = {}
87
+ h['holder'] = holder
88
+ h['year'] = year if year
89
+ h['license'] = license if license
90
+ h
91
+ end
92
+
93
+ end
94
+
95
+ end
@@ -0,0 +1,18 @@
1
+ module Indexer
2
+
3
+ # Dependency class is essentially the same as {Requirement}, but
4
+ # a dependency represents a binary package requirement that would
5
+ # need to be installed using an operating systems own package
6
+ # management system, or installed manually.
7
+ #
8
+ # Dependency is a sublcass of {Requirement}. It only exists as a separate
9
+ # class becuase an OS package managers MIGHT require some additional
10
+ # information --but as of yet that's not the case.
11
+ #
12
+ # TODO: Why not merge the two and add a field to distinguish them?
13
+ #
14
+ class Dependency < Requirement
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,133 @@
1
+ module Indexer
2
+
3
+ # Organization is used to model companies involved in project.
4
+ #
5
+ class Organization < Model
6
+
7
+ # Parse `entry` and create Organization object.
8
+ def self.parse(entry)
9
+ case entry
10
+ when Organization
11
+ entry
12
+ when String
13
+ parse_string(entry)
14
+ when Array
15
+ parse_array(entry)
16
+ when Hash
17
+ new(entry)
18
+ end
19
+ end
20
+
21
+ #
22
+ def self.parse_array(array)
23
+ data = {}
24
+ array.each do |value|
25
+ v = value.strip
26
+ case v
27
+ when /^(.*?)\s*\<(.*?@.*?)\>/
28
+ data[:name] = $1 unless $1.empty?
29
+ data[:email] = $2
30
+ when /^(http|https)\:/
31
+ data[:website] = v
32
+ when /\@/
33
+ data[:email] = v
34
+ else
35
+ data[:name] = v
36
+ end
37
+ end
38
+ new(data)
39
+ end
40
+
41
+ #
42
+ def self.parse_string(string)
43
+ if md = /(.*?)\s*\<(.*?)\>/.match(string)
44
+ new(:name=>md[1], :email=>md[2])
45
+ else
46
+ new(:name=>string)
47
+ end
48
+ end
49
+
50
+ #
51
+ def initialize(data)
52
+ super(data)
53
+ #raise ArgumentError, "person must have a name" unless name
54
+ end
55
+
56
+ #
57
+ def initialize_attributes
58
+ @data = {
59
+ :roles => []
60
+ }
61
+ end
62
+
63
+ #
64
+ attr :name
65
+
66
+ #
67
+ def name=(name)
68
+ Valid.oneline!(name, :name)
69
+ @data[:name] = name
70
+ end
71
+
72
+ #
73
+ attr :email
74
+
75
+ #
76
+ def email=(email)
77
+ Valid.email!(email, :email)
78
+ @data[:email] = email
79
+ end
80
+
81
+ #
82
+ attr :website
83
+
84
+ #
85
+ def website=(website)
86
+ Valid.url!(website, :website)
87
+ @data[:website] = website
88
+ end
89
+
90
+ # List of roles the person plays in the project.
91
+ # This can be any string or array of strings.
92
+ attr :roles
93
+
94
+ #
95
+ def roles=(roles)
96
+ @data[:roles] = (
97
+ r = [roles].flatten
98
+ r.each{ |x| Valid.oneline?(x) }
99
+ r
100
+ )
101
+ end
102
+
103
+ # Signular term for #roles can be used as well.
104
+ alias :role :roles
105
+ alias :role= :roles=
106
+
107
+ # Group is a synonym for role.
108
+ alias :group :roles
109
+ alias :group= :roles=
110
+
111
+ # Team is a common synonym for role too.
112
+ alias :team :roles
113
+ alias :teams= :roles=
114
+
115
+ # Convert to simple Hash represepentation.
116
+ def to_h
117
+ h = {}
118
+ h['name'] = name
119
+ h['email'] = email if email
120
+ h['website'] = website if website
121
+ h['roles'] = roles if not roles.empty?
122
+ h
123
+ end
124
+
125
+ # CONSIDER: Only name has to be equal?
126
+ def ==(other)
127
+ return false unless Organization === other
128
+ return false unless name == other.name
129
+ return true
130
+ end
131
+ end
132
+
133
+ end