ore-core 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,66 @@
1
+ require 'ore/versions/exceptions/invalid_version'
2
+ require 'ore/versions/version'
3
+
4
+ require 'yaml'
5
+
6
+ module Ore
7
+ module Versions
8
+ #
9
+ # Represents a version loaded from a `VERSION` file.
10
+ #
11
+ class VersionFile < Version
12
+
13
+ # Common `VERSION` file-names.
14
+ @@files = %w[VERSION VERSION.yml]
15
+
16
+ #
17
+ # Finds the `VERSION` file.
18
+ #
19
+ # @param [Project] project
20
+ # The Ore project.
21
+ #
22
+ # @return [VersionFile, nil]
23
+ # The version file of the project.
24
+ #
25
+ def self.find(project)
26
+ @@files.each do |name|
27
+ return load(project.path(name)) if project.file?(name)
28
+ end
29
+
30
+ return nil
31
+ end
32
+
33
+ #
34
+ # Loads the version file of the project.
35
+ #
36
+ # @param [String] path
37
+ # The path to the version file.
38
+ #
39
+ # @return [VersionFile]
40
+ # The loaded version file.
41
+ #
42
+ # @raise [InvalidVersion]
43
+ # The `VERSION` file must contain either a `Hash` or a `String`.
44
+ #
45
+ def self.load(path)
46
+ data = YAML.load_file(path)
47
+
48
+ case data
49
+ when Hash
50
+ self.new(
51
+ (data[:major] || data['major']),
52
+ (data[:minor] || data['minor']),
53
+ (data[:patch] || data['patch']),
54
+ (data[:build] || data['build'])
55
+ )
56
+ when String
57
+ self.parse(data)
58
+ else
59
+ file = File.basename(@path)
60
+ raise(InvalidVersion,"invalid version data in #{file.dump}")
61
+ end
62
+ end
63
+
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,40 @@
1
+ module Ore
2
+ #
3
+ # Provides transparent access to {Ore::Specification}.
4
+ #
5
+ # @param [Symbol] name
6
+ # The constant name.
7
+ #
8
+ # @return [Object]
9
+ # The constant.
10
+ #
11
+ # @raise [NameError]
12
+ # The constant could not be found.
13
+ #
14
+ def self.const_missing(name)
15
+ if name == :Specification
16
+ begin
17
+ # attempt to load 'ore/specification' from the $LOAD_PATH
18
+ require 'ore/specification'
19
+ rescue ::LoadError
20
+ # find our `lib/` directory
21
+ lib_dir = File.expand_path(File.dirname(__FILE__))
22
+
23
+ # modify the $LOAD_PATH is 'ore/specification' is not available
24
+ $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
25
+
26
+ begin
27
+ # attempt loading 'ore/specification' again
28
+ require 'ore/specification'
29
+ rescue ::LoadError
30
+ # ore is probably not installed, so raise a NameError
31
+ return super(name)
32
+ end
33
+ end
34
+
35
+ return Ore.const_get(name)
36
+ end
37
+
38
+ super(name)
39
+ end
40
+ end
@@ -0,0 +1,6 @@
1
+ lib_dir = File.expand_path('lib',File.dirname(__FILE__))
2
+ $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
3
+
4
+ require 'ore/specification'
5
+
6
+ Ore::Specification.new
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'ore/dependency'
3
+
4
+ describe Dependency do
5
+ subject { Dependency }
6
+
7
+ describe "parse" do
8
+ it "should parse a dependency string with only a name" do
9
+ dep = subject.parse('foo')
10
+
11
+ dep.name.should == 'foo'
12
+ dep.versions.should be_empty
13
+ end
14
+
15
+ it "should parse a dependency with a version" do
16
+ dep = subject.parse('foo ~> 1.2.3')
17
+
18
+ dep.name.should == 'foo'
19
+ dep.versions.should == ['~> 1.2.3']
20
+ end
21
+ end
22
+
23
+ describe "parse_versions" do
24
+ it "should parse a single version" do
25
+ dep = subject.parse_versions('foo', '~> 1.2.3')
26
+
27
+ dep.versions.should == ['~> 1.2.3']
28
+ end
29
+
30
+ it "should parse multiple versions" do
31
+ dep = subject.parse_versions('foo', '~> 1.2.3, >= 1.4.0')
32
+
33
+ dep.versions.should == ['~> 1.2.3', '>= 1.4.0']
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'helpers/files'
3
+
4
+ require 'ore/document_file'
5
+
6
+ describe DocumentFile do
7
+ include Helpers::Files
8
+
9
+ subject { DocumentFile.new(file('.document')) }
10
+
11
+ it "should parse the file globs from a .document file" do
12
+ subject.file_globs.to_a.should =~ %w[
13
+ lib/**/*.rb
14
+ bin/*
15
+ ]
16
+ end
17
+
18
+ it "should parse the extra-file globs from a .document file" do
19
+ subject.extra_file_globs.to_a.should =~ %w[
20
+ ChangeLog.md
21
+ COPYING.txt
22
+ ]
23
+ end
24
+
25
+ it "should not consume the - separator" do
26
+ subject.file_globs.should_not include('-')
27
+ subject.extra_file_globs.should_not include('-')
28
+ end
29
+ end
@@ -0,0 +1,7 @@
1
+ module Helpers
2
+ module Files
3
+ def file(name)
4
+ File.join(File.dirname(__FILE__),'files',name)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ ChangeLog.md
5
+ COPYING.txt
@@ -0,0 +1 @@
1
+ 1.2.3
@@ -0,0 +1,5 @@
1
+ ---
2
+ :major: 1
3
+ :minor: 2
4
+ :patch: 3
5
+ :build:
@@ -0,0 +1,13 @@
1
+ require 'ore/project'
2
+
3
+ module Helpers
4
+ module Projects
5
+ def project_dir(name)
6
+ File.join(File.dirname(__FILE__),'projects',name)
7
+ end
8
+
9
+ def project(name)
10
+ Ore::Project.find(project_dir(name))
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ begin
4
+ Ore::Specification.new do |gemspec|
5
+ # custom logic here
6
+ end
7
+ rescue NameError
8
+ STDERR.puts "The 'dm-is-plugin.gemspec' file requires Ore."
9
+ STDERR.puts "Run `gem install ore` to install Ore."
10
+ end
@@ -0,0 +1,9 @@
1
+ name: dm-is-plugin
2
+ summary: DataMapper Plugin
3
+ description: A plugin for DataMapper
4
+ homepage: http://github.com/datamapper/dm-is-plugin
5
+ email: datamapper@googlegroups.com
6
+ authors: Dan Kubb
7
+
8
+ dependencies:
9
+ dm-core: ~> 1.0.0
@@ -0,0 +1,4 @@
1
+ require 'dm-core'
2
+ require 'dm-is-plugin/is/plugin'
3
+
4
+ DataMapper::Model.append_extensions DataMapper::Is::Plugin
@@ -0,0 +1,6 @@
1
+ module DataMapper
2
+ module Is
3
+ module Plugin
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,19 @@
1
+ name: Explicit
2
+ summary: An explicit library
3
+ description: This is a library written by strict developers.
4
+ license: MIT
5
+ homepage: http://github.com/user/explicit
6
+ email: user@example.com
7
+ authors:
8
+ - Senior Software Engineer
9
+ - Junior Software Engineer
10
+
11
+ post_install_message: |
12
+ Thanks for installing the Explicit gem!
13
+
14
+ To start Explicit, run the following command:
15
+
16
+ $ explicit
17
+
18
+ required_ruby_version: >= 1.8.7
19
+ required_rubygems_version: >= 1.3.7
@@ -0,0 +1,15 @@
1
+ module Explicit
2
+ module Version
3
+ MAJOR = 1
4
+
5
+ MINOR = 2
6
+
7
+ PATCH = 3
8
+
9
+ VERSION = [MAJOR, MINOR, PATCH].join('.')
10
+
11
+ def self.to_s
12
+ VERSION
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ name: ffi-binding
2
+ summary: FFI Binding
3
+ description: FFI Binding for some C library
4
+ homepage: http://github.com/wmeissner/ffi-binding
5
+ email: wmeissner@example.com
6
+ authors: Wayne Meissner
7
+
8
+ requirements: libstuff >= 1.0
9
+
10
+ dependencies:
11
+ ffi: ~> 0.6.0
@@ -0,0 +1,5 @@
1
+ module FFI
2
+ module Binding
3
+ VERSION = '1.2.3'
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ puts 'Built with Jeweler!'
@@ -0,0 +1,6 @@
1
+ name: Jewelery
2
+ summary: A library created with Jeweler
3
+ description: This is how projects have been layed out in the past.
4
+ homepage: http://github.com/technicalpickles/jewelery
5
+ email: technicalpickles@example.com
6
+ authors: technicalpickles
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ begin
4
+ Ore::Specification.new do |gemspec|
5
+ # custom logic here
6
+ end
7
+ rescue NameError
8
+ STDERR.puts "The 'my-project.gemspec' file requires Ore."
9
+ STDERR.puts "Run `gem install ore` to install Ore."
10
+ end
@@ -0,0 +1,4 @@
1
+ require 'jewelery/rubies'
2
+
3
+ module Jewelery
4
+ end
@@ -0,0 +1,4 @@
1
+ module Jewelery
2
+ class Rubies
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ version: 1.2.3
2
+ summary: Minimal
3
+ description: Least amount of effort
4
+ authors: me
@@ -0,0 +1,2 @@
1
+ module Minimal
2
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+ require 'ore/naming'
3
+
4
+ describe Naming do
5
+ subject do
6
+ obj = Object.new
7
+ obj.extend Ore::Naming
8
+ obj
9
+ end
10
+
11
+ describe "underscore" do
12
+ it "should underscore CamelCase names" do
13
+ subject.underscore('FooBar').should == 'foo_bar'
14
+ end
15
+
16
+ it "should not add leading underscores to Capitalized names" do
17
+ subject.underscore('Foo').should == 'foo'
18
+ end
19
+
20
+ it "should not add tailing underscores to CamelCase names" do
21
+ subject.underscore('FooX').should == 'foox'
22
+ end
23
+
24
+ it "should not add underscores when they already exist" do
25
+ subject.underscore('Foo_Bar').should == 'foo_bar'
26
+ end
27
+ end
28
+
29
+ it "should guess the module names from a project name" do
30
+ subject.modules_of('foo-bar').should == ['Foo', 'Bar']
31
+ end
32
+
33
+ it "should filter out obvious names from the module names" do
34
+ subject.modules_of('ruby-foo').should == ['Foo']
35
+ end
36
+
37
+ it "should recognize common acronyms in project names" do
38
+ subject.modules_of('ffi-bar').should == ['FFI', 'Bar']
39
+ end
40
+
41
+ it "should guess the namespace from a project name" do
42
+ subject.namespace_of('foo-bar').should == 'Foo::Bar'
43
+ end
44
+
45
+ it "should guess the namespace directories from a project name" do
46
+ subject.namespace_dirs_of('foo-bar').should == ['foo', 'bar']
47
+ end
48
+
49
+ it "should filter out namespaces that are rarely used in directory names" do
50
+ subject.namespace_dirs_of('ruby-foo').should == ['foo']
51
+ end
52
+
53
+ it "should guess the namespace directory from a project name" do
54
+ subject.namespace_path_of('foo-bar').should == 'foo/bar'
55
+ end
56
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'helpers/projects'
3
+ require 'projects/project_examples'
4
+
5
+ describe "DataMapper Plugin project" do
6
+ include Helpers::Projects
7
+
8
+ before(:all) do
9
+ @project = project('dm-is-plugin')
10
+ end
11
+
12
+ it_should_behave_like 'an Ore Project'
13
+
14
+ it "should correctly guess the namespace" do
15
+ @project.namespace.should == 'DataMapper::Is::Plugin'
16
+ end
17
+
18
+ it "should have a namespace directory" do
19
+ @project.namespace_dir.should == 'dm-is-plugin'
20
+ end
21
+
22
+ it "should use Bundler" do
23
+ @project.should be_bundler
24
+ end
25
+
26
+ it "should default the required RubyGems version to >= 1.3.6" do
27
+ @project.required_rubygems_version.should == '>= 1.3.6'
28
+ end
29
+ end