ore-core 0.1.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 (67) hide show
  1. data/.document +4 -0
  2. data/.rspec +1 -0
  3. data/.yardopts +1 -0
  4. data/ChangeLog.md +17 -0
  5. data/GemspecYML.md +284 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +68 -0
  8. data/Rakefile +25 -0
  9. data/gemspec.yml +18 -0
  10. data/lib/ore.rb +3 -0
  11. data/lib/ore/checks.rb +88 -0
  12. data/lib/ore/defaults.rb +140 -0
  13. data/lib/ore/dependency.rb +65 -0
  14. data/lib/ore/document_file.rb +118 -0
  15. data/lib/ore/exceptions.rb +3 -0
  16. data/lib/ore/exceptions/exception.rb +4 -0
  17. data/lib/ore/exceptions/invalid_metadata.rb +6 -0
  18. data/lib/ore/exceptions/project_not_found.rb +6 -0
  19. data/lib/ore/naming.rb +113 -0
  20. data/lib/ore/paths.rb +146 -0
  21. data/lib/ore/project.rb +599 -0
  22. data/lib/ore/settings.rb +274 -0
  23. data/lib/ore/specification.rb +29 -0
  24. data/lib/ore/versions.rb +3 -0
  25. data/lib/ore/versions/exceptions.rb +1 -0
  26. data/lib/ore/versions/exceptions/invalid_version.rb +8 -0
  27. data/lib/ore/versions/version.rb +75 -0
  28. data/lib/ore/versions/version_constant.rb +126 -0
  29. data/lib/ore/versions/version_file.rb +66 -0
  30. data/lib/rubygems_plugin.rb +40 -0
  31. data/ore-core.gemspec +6 -0
  32. data/spec/dependency_spec.rb +36 -0
  33. data/spec/document_file_spec.rb +29 -0
  34. data/spec/helpers/files.rb +7 -0
  35. data/spec/helpers/files/.document +5 -0
  36. data/spec/helpers/files/VERSION +1 -0
  37. data/spec/helpers/files/VERSION.yml +5 -0
  38. data/spec/helpers/projects.rb +13 -0
  39. data/spec/helpers/projects/dm-is-plugin/Gemfile +3 -0
  40. data/spec/helpers/projects/dm-is-plugin/VERSION +1 -0
  41. data/spec/helpers/projects/dm-is-plugin/dm-is-plugin.gemspec +10 -0
  42. data/spec/helpers/projects/dm-is-plugin/gemspec.yml +9 -0
  43. data/spec/helpers/projects/dm-is-plugin/lib/dm-is-plugin.rb +4 -0
  44. data/spec/helpers/projects/dm-is-plugin/lib/dm-is-plugin/is/plugin.rb +6 -0
  45. data/spec/helpers/projects/explicit/gemspec.yml +19 -0
  46. data/spec/helpers/projects/explicit/lib/explicit/version.rb +15 -0
  47. data/spec/helpers/projects/ffi-binding/gemspec.yml +11 -0
  48. data/spec/helpers/projects/ffi-binding/lib/ffi/binding/version.rb +5 -0
  49. data/spec/helpers/projects/jewelery/VERSION +1 -0
  50. data/spec/helpers/projects/jewelery/bin/jewelery +3 -0
  51. data/spec/helpers/projects/jewelery/gemspec.yml +6 -0
  52. data/spec/helpers/projects/jewelery/jewelery.gemspec +10 -0
  53. data/spec/helpers/projects/jewelery/lib/jewelery.rb +4 -0
  54. data/spec/helpers/projects/jewelery/lib/jewelery/rubies.rb +4 -0
  55. data/spec/helpers/projects/minimal/gemspec.yml +4 -0
  56. data/spec/helpers/projects/minimal/lib/minimal.rb +2 -0
  57. data/spec/naming_spec.rb +56 -0
  58. data/spec/projects/dm_plugin_project_spec.rb +29 -0
  59. data/spec/projects/explicit_project_spec.rb +37 -0
  60. data/spec/projects/ffi_binding_project_spec.rb +25 -0
  61. data/spec/projects/jeweler_project_spec.rb +17 -0
  62. data/spec/projects/minimal_project_spec.rb +17 -0
  63. data/spec/projects/project_examples.rb +40 -0
  64. data/spec/spec_helper.rb +4 -0
  65. data/spec/versions/version_file_spec.rb +28 -0
  66. data/spec/versions/version_spec.rb +53 -0
  67. metadata +170 -0
@@ -0,0 +1,274 @@
1
+ require 'ore/exceptions/invalid_metadata'
2
+ require 'ore/versions/version'
3
+ require 'ore/dependency'
4
+
5
+ module Ore
6
+ #
7
+ # A mixin for {Project} which provides methods for normalizing and
8
+ # setting project attributes.
9
+ #
10
+ module Settings
11
+ protected
12
+
13
+ #
14
+ # Sets the version of the project.
15
+ #
16
+ # @param [Hash<Integer>, String] version
17
+ # The version from the metadata file.
18
+ #
19
+ # @raise [InvalidVersion]
20
+ # The version must either be a `String` or a `Hash`.
21
+ #
22
+ def set_version!(version)
23
+ case version
24
+ when Hash
25
+ major = version['major']
26
+ minor = version['minor']
27
+ patch = version['patch']
28
+ build = version['build']
29
+
30
+ @version = Versions::Version.new(major,minor,patch,build)
31
+ when String
32
+ @version = Versions::Version.parse(version.to_s)
33
+ else
34
+ raise(InvalidMetadata,"version must be a Hash or a String")
35
+ end
36
+ end
37
+
38
+ #
39
+ # Sets the license(s) of the project.
40
+ #
41
+ # @param [Array, String] license
42
+ # The license(s) of the project.
43
+ #
44
+ def set_license!(license)
45
+ if license.kind_of?(Array)
46
+ @licenses += license
47
+ else
48
+ @licenses << license
49
+ end
50
+ end
51
+
52
+ #
53
+ # Sets the authors of the project.
54
+ #
55
+ # @param [Array<String>, String] authors
56
+ # The authors listed in the metadata file.
57
+ #
58
+ def set_authors!(authors)
59
+ if authors.kind_of?(Array)
60
+ @authors += authors
61
+ else
62
+ @authors << authors
63
+ end
64
+ end
65
+
66
+ #
67
+ # Sets the release date of the project.
68
+ #
69
+ # @param [String] date
70
+ # The release date from the metadata file.
71
+ #
72
+ def set_date!(date)
73
+ @date = Date.parse(date)
74
+ end
75
+
76
+ #
77
+ # Sets the require-paths of the project.
78
+ #
79
+ # @param [Array<String>, String] paths
80
+ # The require-paths or the glob-pattern listed in the metadata file.
81
+ #
82
+ def set_require_paths!(paths)
83
+ if paths.kind_of?(Array)
84
+ paths.each { |path| add_require_path(path) }
85
+ else
86
+ glob(paths) { |path| add_require_path(path) }
87
+ end
88
+ end
89
+
90
+ #
91
+ # Sets the executables of the project.
92
+ #
93
+ # @param [Array<String>, String]
94
+ # The executable names or the glob-pattern listed in the metadata
95
+ # file.
96
+ #
97
+ def set_executables!(paths)
98
+ if paths.kind_of?(Array)
99
+ paths.each { |path| add_executable(path) }
100
+ else
101
+ glob(paths) { |path| add_executable(path) }
102
+ end
103
+ end
104
+
105
+ #
106
+ # Sets the default executable of the project.
107
+ #
108
+ # @param [String] name
109
+ # The default executable name listed in the metadata file.
110
+ #
111
+ def set_default_executable!(name)
112
+ if @executables.include?(name)
113
+ @default_executable = name
114
+ else
115
+ warn "#{name} is not in the executables list"
116
+ end
117
+ end
118
+
119
+ #
120
+ # Sets the extra documentation files of the project.
121
+ #
122
+ # @param [Array<String>, String] paths
123
+ # The file paths or the glob-pattern listed in the metadata file.
124
+ #
125
+ def set_extra_doc_files!(paths)
126
+ if paths.kind_of?(Array)
127
+ paths.each { |path| add_extra_doc_file(path) }
128
+ else
129
+ glob(paths) { |path| add_extra_doc_file(path) }
130
+ end
131
+ end
132
+
133
+ #
134
+ # Sets the files of the project.
135
+ #
136
+ # @param [Array<String>, String] paths
137
+ # The files or the glob-pattern listed in the metadata file.
138
+ #
139
+ def set_files!(paths)
140
+ if paths.kind_of?(Array)
141
+ paths.each { |path| add_file(path) }
142
+ else
143
+ glob(paths) { |path| add_file(path) }
144
+ end
145
+ end
146
+
147
+ #
148
+ # Sets the test-files of the project.
149
+ #
150
+ # @param [Array<String>, String] paths
151
+ # The test-files of the glob-pattern listed in the metadata file.
152
+ #
153
+ def set_test_files!(paths)
154
+ if paths.kind_of?(Array)
155
+ paths.each { |path| add_test_file(path) }
156
+ else
157
+ glob(paths) { |path| add_test_file(path) }
158
+ end
159
+ end
160
+
161
+ #
162
+ # Sets the post-installation message.
163
+ #
164
+ # @param [String] message
165
+ # The post-install message.
166
+ #
167
+ # @since 0.1.0
168
+ #
169
+ def set_post_install_message!(message)
170
+ @post_install_message = message
171
+ end
172
+
173
+ #
174
+ # Sets the external requirements of the project.
175
+ #
176
+ # @param [Array, String] requirements
177
+ # The external requirements.
178
+ #
179
+ # @since 0.2.0
180
+ #
181
+ def set_requirements!(requirements)
182
+ if requirements.kind_of?(Array)
183
+ @requirements += requirements
184
+ else
185
+ @requirements << requirements
186
+ end
187
+ end
188
+
189
+ #
190
+ # Sets the Ruby version required by the project.
191
+ #
192
+ # @param [String] version
193
+ # The version requirement.
194
+ #
195
+ def set_required_ruby_version!(version)
196
+ @required_ruby_version = version.to_s
197
+ end
198
+
199
+ #
200
+ # Sets the RubyGems version required by the project.
201
+ #
202
+ # @param [String] version
203
+ # The version requirement.
204
+ #
205
+ def set_required_rubygems_version!(version)
206
+ @required_rubygems_version = version.to_s
207
+ end
208
+
209
+ #
210
+ # Sets the dependencies of the project.
211
+ #
212
+ # @param [Hash{String => String}] dependencies
213
+ # The dependencey names and versions listed in the metadata file.
214
+ #
215
+ # @raise [InvalidMetadata]
216
+ # The dependencies must be a `Hash`.
217
+ #
218
+ def set_dependencies!(dependencies)
219
+ unless dependencies.kind_of?(Hash)
220
+ raise(InvalidMetadata,"dependencies must be a Hash")
221
+ end
222
+
223
+ dependencies.each do |name,versions|
224
+ versions = versions.to_s
225
+
226
+ @dependencies << Dependency.parse_versions(name,versions)
227
+ end
228
+ end
229
+
230
+ #
231
+ # Sets the runtime-dependencies of the project.
232
+ #
233
+ # @param [Hash{String => String}] dependencies
234
+ # The runtime-dependencey names and versions listed in the metadata
235
+ # file.
236
+ #
237
+ # @raise [InvalidMetadata]
238
+ # The runtime-dependencies must be a `Hash`.
239
+ #
240
+ def set_runtime_dependencies!(dependencies)
241
+ unless dependencies.kind_of?(Hash)
242
+ raise(InvalidMetadata,"runtime_dependencies must be a Hash")
243
+ end
244
+
245
+ dependencies.each do |name,versions|
246
+ versions = versions.to_s
247
+
248
+ @runtime_dependencies << Dependency.parse_versions(name,versions)
249
+ end
250
+ end
251
+
252
+ #
253
+ # Sets the development-dependencies of the project.
254
+ #
255
+ # @param [Hash{String => String}] dependencies
256
+ # The development-dependencey names and versions listed in the
257
+ # metadata file.
258
+ #
259
+ # @raise [InvalidMetadata]
260
+ # The development-dependencies must be a `Hash`.
261
+ #
262
+ def set_development_dependencies!(dependencies)
263
+ unless dependencies.kind_of?(Hash)
264
+ raise(InvalidMetadata,"development_dependencies must be a Hash")
265
+ end
266
+
267
+ dependencies.each do |name,versions|
268
+ versions = versions.to_s
269
+
270
+ @development_dependencies << Dependency.parse_versions(name,versions)
271
+ end
272
+ end
273
+ end
274
+ end
@@ -0,0 +1,29 @@
1
+ require 'ore/project'
2
+
3
+ module Ore
4
+ #
5
+ # Acts as a drop-in replacement for calling `Gem::Specification.new`
6
+ # in a projects gemspec file.
7
+ #
8
+ module Specification
9
+ #
10
+ # Creates a new Gem Specification, and automatically populates it
11
+ # using the metadata file.
12
+ #
13
+ # @yield [gemspec]
14
+ # The given block will be passed the populated Gem Specification
15
+ # object.
16
+ #
17
+ # @yieldparam [Gem::Specification] gemspec
18
+ # The newly created Gem Specification.
19
+ #
20
+ # @return [Gem::Specification]
21
+ # The Gem Specification.
22
+ #
23
+ # @see Project#to_gemspec
24
+ #
25
+ def Specification.new(&block)
26
+ Project.find.to_gemspec(&block)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ require 'ore/versions/version'
2
+ require 'ore/versions/version_file'
3
+ require 'ore/versions/version_constant'
@@ -0,0 +1 @@
1
+ require 'ore/versions/exceptions/invalid_version'
@@ -0,0 +1,8 @@
1
+ require 'ore/exceptions/exception'
2
+
3
+ module Ore
4
+ module Versions
5
+ class InvalidVersion < Exception
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,75 @@
1
+ require 'ore/versions/exceptions/invalid_version'
2
+
3
+ require 'rubygems/version'
4
+
5
+ module Ore
6
+ module Versions
7
+ #
8
+ # Represents a standard three-number version.
9
+ #
10
+ # @see http://semver.org/
11
+ #
12
+ class Version < Gem::Version
13
+
14
+ # Major version number
15
+ attr_reader :major
16
+
17
+ # Minor version number
18
+ attr_reader :minor
19
+
20
+ # Patch version number
21
+ attr_reader :patch
22
+
23
+ # The build string
24
+ attr_reader :build
25
+
26
+ #
27
+ # Creates a new version.
28
+ #
29
+ # @param [Integer, nil] major
30
+ # The major version number.
31
+ #
32
+ # @param [Integer, nil] minor
33
+ # The minor version number.
34
+ #
35
+ # @param [Integer, nil] patch
36
+ # The patch version number.
37
+ #
38
+ # @param [Integer, nil] build (nil)
39
+ # The build version number.
40
+ #
41
+ def initialize(major,minor,patch,build=nil)
42
+ @major = (major || 0)
43
+ @minor = (minor || 0)
44
+ @patch = (patch || 0)
45
+ @build = build
46
+
47
+ numbers = [@major,@minor,@patch]
48
+ numbers << @build if @build
49
+
50
+ super(numbers.join('.'))
51
+ end
52
+
53
+ #
54
+ # Parses a version string.
55
+ #
56
+ # @param [String] string
57
+ # The version string.
58
+ #
59
+ # @return [Version]
60
+ # The parsed version.
61
+ #
62
+ def self.parse(string)
63
+ major, minor, patch, build = string.split('.',4)
64
+
65
+ return self.new(
66
+ (major || 0).to_i,
67
+ (minor || 0).to_i,
68
+ (patch || 0).to_i,
69
+ build
70
+ )
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,126 @@
1
+ require 'ore/versions/version'
2
+ require 'ore/naming'
3
+
4
+ module Ore
5
+ module Versions
6
+ #
7
+ # Represents a version loaded from a Ruby `VERSION` constant or
8
+ # `Version` module.
9
+ #
10
+ class VersionConstant < Version
11
+
12
+ include Naming
13
+
14
+ # Common file-name that the `VERSION` constant or `Version` module
15
+ # is defined within.
16
+ @@file_name = 'version.rb'
17
+
18
+ #
19
+ # Finds the `version.rb` file.
20
+ #
21
+ # @param [Project] project
22
+ # The project.
23
+ #
24
+ # @return [VersionConstant, nil]
25
+ # The loaded version constant.
26
+ #
27
+ def self.find(project)
28
+ if project.namespace_dir
29
+ path = File.join(project.namespace_dir,@@file_name)
30
+
31
+ self.load(project.lib_path(path)) if project.lib_file?(path)
32
+ end
33
+ end
34
+
35
+ #
36
+ # Extracts the `VERSION` constant or the major / minor / patch / build
37
+ # version numbers from the `Version` module.
38
+ #
39
+ # @param [String] path
40
+ # The path to the `version.rb` file.
41
+ #
42
+ # @return [VersionConstant, nil]
43
+ # The loaded version constant.
44
+ #
45
+ def self.load(path)
46
+ major = nil
47
+ minor = nil
48
+ patch = nil
49
+ build = nil
50
+
51
+ File.open(path) do |file|
52
+ file.each_line do |line|
53
+ unless line =~ /^\s*#/ # skip commented lines
54
+ if line =~ /(VERSION|Version)\s*=\s*/
55
+ version = extract_version(line)
56
+
57
+ return self.parse(version) if version
58
+ elsif line =~ /(MAJOR|Major)\s*=\s*/
59
+ major ||= extract_number(line)
60
+ elsif line =~ /(MINOR|Minor)\s*=\s*/
61
+ minor ||= extract_number(line)
62
+ elsif line =~ /(PATCH|Patch)\s*=\s*/
63
+ patch ||= extract_number(line)
64
+ elsif line =~ /(BUILD|Build)\s*=\s*/
65
+ build ||= extract_string(line)
66
+ end
67
+
68
+ break if (major && minor && patch && build)
69
+ end
70
+ end
71
+ end
72
+
73
+ return self.new(major,minor,patch,build)
74
+ end
75
+
76
+ protected
77
+
78
+ #
79
+ # Extracts the version string from a `VERSION` constant declaration.
80
+ #
81
+ # @param [String] line
82
+ # The line of Ruby code where the `VERSION` constant was defined.
83
+ #
84
+ # @return [String, nil]
85
+ # The extracted version string.
86
+ #
87
+ def self.extract_version(line)
88
+ if (match = line.match(/=\s*['"](\d+\.\d+\.\d+(\.\w+)?)['"]/))
89
+ match[1]
90
+ end
91
+ end
92
+
93
+ #
94
+ # Extracts a number from a `BUILD` constant declaration.
95
+ #
96
+ # @param [String] line
97
+ # The line of Ruby code where the constant was defined.
98
+ #
99
+ # @return [String, nil]
100
+ # The extracted string.
101
+ #
102
+ def self.extract_string(line)
103
+ if (match = line.match(/=\s*['"]?(\w+)['"]?/))
104
+ match[1]
105
+ end
106
+ end
107
+
108
+ #
109
+ # Extracts a version number from a `MAJOR`, `MINOR`, `PATCH` or
110
+ # `BUILD` constant declaration.
111
+ #
112
+ # @param [String] line
113
+ # The line of Ruby code where the constant was defined.
114
+ #
115
+ # @return [Integer, nil]
116
+ # The extracted version number.
117
+ #
118
+ def self.extract_number(line)
119
+ if (match = line.match(/=\s*['"]?(\d+)['"]?/))
120
+ match[1].to_i
121
+ end
122
+ end
123
+
124
+ end
125
+ end
126
+ end