jeweler2 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. data/.document +8 -0
  2. data/ChangeLog.markdown +177 -0
  3. data/Gemfile +18 -0
  4. data/Gemfile.lock +47 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.markdown +217 -0
  7. data/Rakefile +80 -0
  8. data/bin/jeweler +5 -0
  9. data/features/generator/cucumber.feature +103 -0
  10. data/features/generator/directory_layout.feature +86 -0
  11. data/features/generator/dotdocument.feature +13 -0
  12. data/features/generator/env_options.feature +9 -0
  13. data/features/generator/gemfile.feature +71 -0
  14. data/features/generator/git.feature +102 -0
  15. data/features/generator/license.feature +20 -0
  16. data/features/generator/rakefile.feature +158 -0
  17. data/features/generator/readme.feature +12 -0
  18. data/features/generator/test.feature +54 -0
  19. data/features/generator/test_helper.feature +149 -0
  20. data/features/placeholder.feature +5 -0
  21. data/features/step_definitions/debug_steps.rb +6 -0
  22. data/features/step_definitions/filesystem_steps.rb +70 -0
  23. data/features/step_definitions/generator_steps.rb +380 -0
  24. data/features/step_definitions/task_steps.rb +6 -0
  25. data/features/support/env.rb +42 -0
  26. data/features/tasks/build_gem.feature +9 -0
  27. data/features/tasks/version.feature +31 -0
  28. data/features/tasks/version_bumping.feature +49 -0
  29. data/jeweler.gemspec +245 -0
  30. data/jeweler2.gemspec +233 -0
  31. data/lib/jeweler/commands/build_gem.rb +36 -0
  32. data/lib/jeweler/commands/check_dependencies.rb +66 -0
  33. data/lib/jeweler/commands/install_gem.rb +31 -0
  34. data/lib/jeweler/commands/release_gemspec.rb +82 -0
  35. data/lib/jeweler/commands/release_to_git.rb +59 -0
  36. data/lib/jeweler/commands/release_to_rubygems.rb +28 -0
  37. data/lib/jeweler/commands/validate_gemspec.rb +30 -0
  38. data/lib/jeweler/commands/version/base.rb +55 -0
  39. data/lib/jeweler/commands/version/bump_major.rb +13 -0
  40. data/lib/jeweler/commands/version/bump_minor.rb +12 -0
  41. data/lib/jeweler/commands/version/bump_patch.rb +14 -0
  42. data/lib/jeweler/commands/version/write.rb +12 -0
  43. data/lib/jeweler/commands/write_gemspec.rb +39 -0
  44. data/lib/jeweler/commands.rb +20 -0
  45. data/lib/jeweler/errors.rb +8 -0
  46. data/lib/jeweler/gemcutter_tasks.rb +8 -0
  47. data/lib/jeweler/gemspec_helper.rb +87 -0
  48. data/lib/jeweler/generator/application.rb +61 -0
  49. data/lib/jeweler/generator/bacon_mixin.rb +43 -0
  50. data/lib/jeweler/generator/github_mixin.rb +29 -0
  51. data/lib/jeweler/generator/micronaut_mixin.rb +41 -0
  52. data/lib/jeweler/generator/minitest_mixin.rb +42 -0
  53. data/lib/jeweler/generator/options.rb +163 -0
  54. data/lib/jeweler/generator/rdoc_mixin.rb +9 -0
  55. data/lib/jeweler/generator/riot_mixin.rb +42 -0
  56. data/lib/jeweler/generator/rspec_mixin.rb +42 -0
  57. data/lib/jeweler/generator/shindo_mixin.rb +44 -0
  58. data/lib/jeweler/generator/shoulda_mixin.rb +42 -0
  59. data/lib/jeweler/generator/testspec_mixin.rb +42 -0
  60. data/lib/jeweler/generator/testunit_mixin.rb +39 -0
  61. data/lib/jeweler/generator/yard_mixin.rb +14 -0
  62. data/lib/jeweler/generator.rb +295 -0
  63. data/lib/jeweler/rubyforge_tasks.rb +95 -0
  64. data/lib/jeweler/rubygems_dot_org_tasks.rb +38 -0
  65. data/lib/jeweler/rubygems_tasks.rb +38 -0
  66. data/lib/jeweler/specification.rb +110 -0
  67. data/lib/jeweler/tasks.rb +224 -0
  68. data/lib/jeweler/templates/.document +5 -0
  69. data/lib/jeweler/templates/.gitignore +48 -0
  70. data/lib/jeweler/templates/Gemfile +12 -0
  71. data/lib/jeweler/templates/LICENSE.txt +20 -0
  72. data/lib/jeweler/templates/README.rdoc +19 -0
  73. data/lib/jeweler/templates/Rakefile +9 -0
  74. data/lib/jeweler/templates/bacon/flunking.rb +7 -0
  75. data/lib/jeweler/templates/bacon/helper.rb +9 -0
  76. data/lib/jeweler/templates/bundler_setup.erb +10 -0
  77. data/lib/jeweler/templates/features/default.feature +9 -0
  78. data/lib/jeweler/templates/features/support/env.rb +10 -0
  79. data/lib/jeweler/templates/jeweler_tasks.erb +31 -0
  80. data/lib/jeweler/templates/micronaut/flunking.rb +7 -0
  81. data/lib/jeweler/templates/micronaut/helper.rb +18 -0
  82. data/lib/jeweler/templates/minitest/flunking.rb +7 -0
  83. data/lib/jeweler/templates/minitest/helper.rb +12 -0
  84. data/lib/jeweler/templates/other_tasks.erb +86 -0
  85. data/lib/jeweler/templates/riot/flunking.rb +11 -0
  86. data/lib/jeweler/templates/riot/helper.rb +4 -0
  87. data/lib/jeweler/templates/rspec/.rspec +1 -0
  88. data/lib/jeweler/templates/rspec/flunking.rb +7 -0
  89. data/lib/jeweler/templates/rspec/helper.rb +12 -0
  90. data/lib/jeweler/templates/shindo/flunking.rb +8 -0
  91. data/lib/jeweler/templates/shindo/helper.rb +6 -0
  92. data/lib/jeweler/templates/shoulda/flunking.rb +7 -0
  93. data/lib/jeweler/templates/shoulda/helper.rb +11 -0
  94. data/lib/jeweler/templates/testspec/flunking.rb +7 -0
  95. data/lib/jeweler/templates/testspec/helper.rb +7 -0
  96. data/lib/jeweler/templates/testunit/flunking.rb +7 -0
  97. data/lib/jeweler/templates/testunit/helper.rb +10 -0
  98. data/lib/jeweler/version.rb +10 -0
  99. data/lib/jeweler/version_helper.rb +141 -0
  100. data/lib/jeweler.rb +177 -0
  101. data/test/fixtures/bar/VERSION.yml +4 -0
  102. data/test/fixtures/bar/bin/foo_the_ultimate_bin +1 -0
  103. data/test/fixtures/bar/hey_include_me_in_gemspec +0 -0
  104. data/test/fixtures/bar/lib/foo_the_ultimate_lib.rb +1 -0
  105. data/test/fixtures/existing-project-with-version-constant/.document +5 -0
  106. data/test/fixtures/existing-project-with-version-constant/.gitignore +5 -0
  107. data/test/fixtures/existing-project-with-version-constant/LICENSE.txt +20 -0
  108. data/test/fixtures/existing-project-with-version-constant/README.rdoc +7 -0
  109. data/test/fixtures/existing-project-with-version-constant/Rakefile +85 -0
  110. data/test/fixtures/existing-project-with-version-constant/existing-project-with-version.gemspec +29 -0
  111. data/test/fixtures/existing-project-with-version-constant/lib/existing_project_with_version.rb +0 -0
  112. data/test/fixtures/existing-project-with-version-constant/test/existing_project_with_version_test.rb +7 -0
  113. data/test/fixtures/existing-project-with-version-constant/test/test_helper.rb +10 -0
  114. data/test/fixtures/existing-project-with-version-plaintext/.document +5 -0
  115. data/test/fixtures/existing-project-with-version-plaintext/.gitignore +5 -0
  116. data/test/fixtures/existing-project-with-version-plaintext/LICENSE.txt +20 -0
  117. data/test/fixtures/existing-project-with-version-plaintext/README.rdoc +7 -0
  118. data/test/fixtures/existing-project-with-version-plaintext/Rakefile +84 -0
  119. data/test/fixtures/existing-project-with-version-plaintext/VERSION +1 -0
  120. data/test/fixtures/existing-project-with-version-plaintext/existing-project-with-version.gemspec +29 -0
  121. data/test/fixtures/existing-project-with-version-plaintext/lib/existing_project_with_version.rb +0 -0
  122. data/test/fixtures/existing-project-with-version-plaintext/test/existing_project_with_version_test.rb +7 -0
  123. data/test/fixtures/existing-project-with-version-plaintext/test/test_helper.rb +10 -0
  124. data/test/fixtures/existing-project-with-version-yaml/.document +5 -0
  125. data/test/fixtures/existing-project-with-version-yaml/.gitignore +5 -0
  126. data/test/fixtures/existing-project-with-version-yaml/LICENSE.txt +20 -0
  127. data/test/fixtures/existing-project-with-version-yaml/README.rdoc +7 -0
  128. data/test/fixtures/existing-project-with-version-yaml/Rakefile +84 -0
  129. data/test/fixtures/existing-project-with-version-yaml/VERSION.yml +4 -0
  130. data/test/fixtures/existing-project-with-version-yaml/bin/foo_the_ultimate_bin +0 -0
  131. data/test/fixtures/existing-project-with-version-yaml/existing-project-with-version.gemspec +29 -0
  132. data/test/fixtures/existing-project-with-version-yaml/lib/existing_project_with_version.rb +0 -0
  133. data/test/fixtures/existing-project-with-version-yaml/test/existing_project_with_version_test.rb +7 -0
  134. data/test/fixtures/existing-project-with-version-yaml/test/test_helper.rb +10 -0
  135. data/test/geminstaller.yml +12 -0
  136. data/test/jeweler/commands/test_build_gem.rb +103 -0
  137. data/test/jeweler/commands/test_install_gem.rb +35 -0
  138. data/test/jeweler/commands/test_release_to_gemcutter.rb +39 -0
  139. data/test/jeweler/commands/test_release_to_git.rb +198 -0
  140. data/test/jeweler/commands/test_release_to_github.rb +390 -0
  141. data/test/jeweler/commands/test_validate_gemspec.rb +27 -0
  142. data/test/jeweler/commands/test_write_gemspec.rb +101 -0
  143. data/test/jeweler/commands/version/test_base.rb +32 -0
  144. data/test/jeweler/commands/version/test_bump_major.rb +22 -0
  145. data/test/jeweler/commands/version/test_bump_minor.rb +19 -0
  146. data/test/jeweler/commands/version/test_bump_patch.rb +20 -0
  147. data/test/jeweler/commands/version/test_write.rb +22 -0
  148. data/test/jeweler/generator/test_application.rb +120 -0
  149. data/test/jeweler/generator/test_options.rb +225 -0
  150. data/test/jeweler/test_gemspec_helper.rb +44 -0
  151. data/test/jeweler/test_generator.rb +141 -0
  152. data/test/jeweler/test_generator_initialization.rb +164 -0
  153. data/test/jeweler/test_generator_mixins.rb +23 -0
  154. data/test/jeweler/test_specification.rb +237 -0
  155. data/test/jeweler/test_tasks.rb +50 -0
  156. data/test/jeweler/test_version_helper.rb +214 -0
  157. data/test/shoulda_macros/jeweler_macros.rb +35 -0
  158. data/test/test_helper.rb +178 -0
  159. data/test/test_jeweler.rb +175 -0
  160. metadata +343 -0
@@ -0,0 +1,31 @@
1
+ class Jeweler
2
+ module Commands
3
+ class InstallGem
4
+ include FileUtils
5
+
6
+ attr_accessor :gemspec_helper, :output
7
+
8
+ def initialize
9
+ self.output = $stdout
10
+ end
11
+
12
+ def run
13
+ command = "#{gem_command} install #{gemspec_helper.gem_path}"
14
+ output.puts "Executing #{command.inspect}:"
15
+
16
+ sh command # TODO where does sh actually come from!? - rake, apparently
17
+ end
18
+
19
+ def gem_command
20
+ "#{Config::CONFIG['RUBY_INSTALL_NAME']} -S gem"
21
+ end
22
+
23
+ def self.build_for(jeweler)
24
+ command = new
25
+ command.output = jeweler.output
26
+ command.gemspec_helper = jeweler.gemspec_helper
27
+ command
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,82 @@
1
+ require 'pathname'
2
+
3
+ class Jeweler
4
+ module Commands
5
+ class ReleaseGemspec
6
+ attr_accessor :gemspec, :version, :repo, :output, :gemspec_helper, :base_dir
7
+
8
+ def initialize(attributes = {})
9
+ self.output = $stdout
10
+
11
+ attributes.each_pair do |key, value|
12
+ send("#{key}=", value)
13
+ end
14
+ end
15
+
16
+ def run
17
+ unless clean_staging_area?
18
+ system "git status"
19
+ raise "Unclean staging area! Be sure to commit or .gitignore everything first. See `git status` above."
20
+ end
21
+
22
+ #repo.checkout('master')
23
+
24
+ regenerate_gemspec!
25
+ commit_gemspec! if gemspec_changed?
26
+
27
+ output.puts "Pushing current branch to origin"
28
+ repo.push
29
+ end
30
+
31
+ def clean_staging_area?
32
+ # surprisingly simpler than ruby-git
33
+ `git ls-files --deleted --modified --others --exclude-standard` == ""
34
+ end
35
+
36
+ def commit_gemspec!
37
+ gemspec_gitpath = working_subdir.join(gemspec_helper.path)
38
+ repo.add(gemspec_gitpath.to_s)
39
+ output.puts "Committing #{gemspec_gitpath}"
40
+ repo.commit "Regenerate gemspec for version #{version}"
41
+ end
42
+
43
+ def regenerate_gemspec!
44
+ gemspec_helper.update_version(version)
45
+ gemspec_helper.write
46
+ end
47
+
48
+ def gemspec_changed?
49
+ # OMGHAX. ruby-git status always ends up being 'M', so let's do it a crazy way
50
+ system "git status -s #{working_subdir.join(gemspec_helper.path)} | grep #{working_subdir.join(gemspec_helper.path)} > /dev/null 2>/dev/null"
51
+ end
52
+
53
+ def gemspec_helper
54
+ @gemspec_helper ||= Jeweler::GemSpecHelper.new(self.gemspec, self.base_dir)
55
+ end
56
+
57
+ def working_subdir
58
+ return @working_subdir if @working_subdir
59
+ cwd = base_dir_path
60
+ @working_subdir = cwd.relative_path_from(Pathname.new(repo.dir.path))
61
+ @working_subdir
62
+ end
63
+
64
+ def base_dir_path
65
+ Pathname.new(base_dir).realpath
66
+ end
67
+
68
+ def self.build_for(jeweler)
69
+ command = self.new
70
+
71
+ command.base_dir = jeweler.base_dir
72
+ command.gemspec = jeweler.gemspec
73
+ command.version = jeweler.version
74
+ command.repo = jeweler.repo
75
+ command.output = jeweler.output
76
+ command.gemspec_helper = jeweler.gemspec_helper
77
+
78
+ command
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,59 @@
1
+ class Jeweler
2
+ module Commands
3
+ class ReleaseToGit
4
+ attr_accessor :gemspec, :version, :repo, :output, :gemspec_helper, :base_dir
5
+
6
+ def initialize(attributes = {})
7
+ self.output = $stdout
8
+
9
+ attributes.each_pair do |key, value|
10
+ send("#{key}=", value)
11
+ end
12
+ end
13
+
14
+ def run
15
+ unless clean_staging_area?
16
+ system "git status"
17
+ raise "Unclean staging area! Be sure to commit or .gitignore everything first. See `git status` above."
18
+ end
19
+
20
+ #repo.checkout('master')
21
+ repo.push
22
+
23
+ if release_not_tagged?
24
+ output.puts "Tagging #{release_tag}"
25
+ repo.add_tag(release_tag)
26
+
27
+ output.puts "Pushing #{release_tag} to origin"
28
+ repo.push('origin', release_tag)
29
+ end
30
+ end
31
+
32
+ def clean_staging_area?
33
+ `git ls-files --deleted --modified --others --exclude-standard` == ""
34
+ end
35
+
36
+ def release_tag
37
+ "v#{version}"
38
+ end
39
+
40
+ def release_not_tagged?
41
+ tag = repo.tag(release_tag) rescue nil
42
+ tag.nil?
43
+ end
44
+
45
+ def self.build_for(jeweler)
46
+ command = self.new
47
+
48
+ command.base_dir = jeweler.base_dir
49
+ command.gemspec = jeweler.gemspec
50
+ command.version = jeweler.version
51
+ command.repo = jeweler.repo
52
+ command.output = jeweler.output
53
+ command.gemspec_helper = jeweler.gemspec_helper
54
+
55
+ command
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,28 @@
1
+ class Jeweler
2
+ module Commands
3
+ class ReleaseToRubygems
4
+ include FileUtils
5
+
6
+ attr_accessor :gemspec, :version, :output, :gemspec_helper
7
+
8
+ def initialize
9
+ self.output = $stdout
10
+ end
11
+
12
+ def run
13
+ command = "gem push #{@gemspec_helper.gem_path}"
14
+ output.puts "Executing #{command.inspect}:"
15
+ sh command
16
+ end
17
+
18
+ def self.build_for(jeweler)
19
+ command = new
20
+ command.gemspec = jeweler.gemspec
21
+ command.gemspec_helper = jeweler.gemspec_helper
22
+ command.version = jeweler.version
23
+ command.output = jeweler.output
24
+ command
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ class Jeweler
2
+ module Commands
3
+ class ValidateGemspec
4
+ attr_accessor :gemspec_helper, :output
5
+
6
+ def initialize
7
+ self.output = $stdout
8
+ end
9
+
10
+ def run
11
+ begin
12
+ gemspec_helper.parse
13
+ output.puts "#{gemspec_helper.path} is valid."
14
+ rescue Exception => e
15
+ output.puts "#{gemspec_helper.path} is invalid. See the backtrace for more details."
16
+ raise
17
+ end
18
+ end
19
+
20
+ def self.build_for(jeweler)
21
+ command = new
22
+
23
+ command.gemspec_helper = jeweler.gemspec_helper
24
+ command.output = jeweler.output
25
+
26
+ command
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,55 @@
1
+ require 'pathname'
2
+
3
+ class Jeweler
4
+ module Commands
5
+ module Version
6
+ class Base
7
+
8
+ attr_accessor :repo, :version_helper, :gemspec, :commit, :base_dir
9
+
10
+ def run
11
+ update_version
12
+
13
+ self.version_helper.write
14
+ self.gemspec.version = self.version_helper.to_s
15
+
16
+ commit_version if self.repo && self.commit
17
+ end
18
+
19
+ def update_version
20
+ raise "Subclasses should implement this"
21
+ end
22
+
23
+ def commit_version
24
+ if self.repo
25
+ self.repo.add(working_subdir.join(version_helper.path))
26
+ self.repo.commit("Version bump to #{self.version_helper.to_s}")
27
+ end
28
+ end
29
+
30
+ def working_subdir
31
+ return @working_subdir if @working_subdir
32
+ cwd = base_dir_path
33
+ @working_subdir = cwd.relative_path_from(Pathname.new(repo.dir.path))
34
+ @working_subdir
35
+ end
36
+
37
+ def base_dir_path
38
+ Pathname.new(base_dir).realpath
39
+ end
40
+
41
+
42
+ def self.build_for(jeweler)
43
+ command = new
44
+ command.repo = jeweler.repo
45
+ command.version_helper = jeweler.version_helper
46
+ command.gemspec = jeweler.gemspec
47
+ command.commit = jeweler.commit
48
+ command.base_dir = jeweler.base_dir
49
+
50
+ command
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,13 @@
1
+ class Jeweler
2
+ module Commands
3
+ module Version
4
+ class BumpMajor < Base
5
+
6
+ def update_version
7
+ self.version_helper.bump_major
8
+ end
9
+
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ class Jeweler
2
+ module Commands
3
+ module Version
4
+ class BumpMinor < Base
5
+
6
+ def update_version
7
+ self.version_helper.bump_minor
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ class Jeweler
2
+ module Commands
3
+ module Version
4
+ class BumpPatch < Base
5
+
6
+ def update_version
7
+ self.version_helper.bump_patch
8
+ end
9
+
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,12 @@
1
+ class Jeweler
2
+ module Commands
3
+ module Version
4
+ class Write < Base
5
+ attr_accessor :major, :minor, :patch, :build
6
+ def update_version
7
+ version_helper.update_to major, minor, patch, build
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,39 @@
1
+ class Jeweler
2
+ module Commands
3
+ class WriteGemspec
4
+ attr_accessor :base_dir, :gemspec, :version, :output, :gemspec_helper, :version_helper
5
+
6
+ def initialize
7
+ self.output = $stdout
8
+ end
9
+
10
+ def run
11
+ gemspec_helper.spec.version ||= begin
12
+ version_helper.refresh
13
+ version_helper.to_s
14
+ end
15
+
16
+ gemspec_helper.write
17
+
18
+ output.puts "Generated: #{gemspec_helper.path}"
19
+ end
20
+
21
+ def gemspec_helper
22
+ @gemspec_helper ||= GemSpecHelper.new(self.gemspec, self.base_dir)
23
+ end
24
+
25
+ def self.build_for(jeweler)
26
+ command = new
27
+
28
+ command.base_dir = jeweler.base_dir
29
+ command.gemspec = jeweler.gemspec
30
+ command.version = jeweler.version
31
+ command.output = jeweler.output
32
+ command.gemspec_helper = jeweler.gemspec_helper
33
+ command.version_helper = jeweler.version_helper
34
+
35
+ command
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,20 @@
1
+ class Jeweler
2
+ module Commands
3
+ require_relative 'commands/build_gem'
4
+ require_relative 'commands/install_gem'
5
+ require_relative 'commands/check_dependencies'
6
+ require_relative 'commands/release_to_git'
7
+ require_relative 'commands/release_gemspec'
8
+ require_relative 'commands/release_to_rubygems'
9
+ require_relative 'commands/validate_gemspec'
10
+ require_relative 'commands/write_gemspec'
11
+
12
+ module Version
13
+ require_relative 'commands/version/base'
14
+ require_relative 'commands/version/bump_major'
15
+ require_relative 'commands/version/bump_minor'
16
+ require_relative 'commands/version/bump_patch'
17
+ require_relative 'commands/version/write'
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,8 @@
1
+ class Jeweler
2
+ # Gemspec related error
3
+ class GemspecError < StandardError
4
+ end
5
+
6
+ class VersionYmlError < StandardError
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require_relative 'rubygems_tasks'
2
+
3
+ class Jeweler
4
+ # Deprecated tasks for publishing to Gemcutter. See Jeweler::RubygemsDotOrgTasks
5
+ # for the current tasks to use.
6
+ class GemcutterTasks < RubygemsDotOrgTasks
7
+ end
8
+ end
@@ -0,0 +1,87 @@
1
+ class Jeweler
2
+ class GemSpecHelper
3
+ attr_accessor :spec, :base_dir
4
+
5
+ def initialize(spec, base_dir = nil)
6
+ self.spec = spec
7
+ self.base_dir = base_dir || ''
8
+
9
+ yield spec if block_given?
10
+ end
11
+
12
+ def valid?
13
+ begin
14
+ parse
15
+ true
16
+ rescue
17
+ false
18
+ end
19
+ end
20
+
21
+ def write
22
+ File.open(path, 'w') do |f|
23
+ f.write self.to_ruby
24
+ end
25
+ end
26
+
27
+ def to_ruby
28
+ normalize_files(:files)
29
+ normalize_files(:extra_rdoc_files)
30
+
31
+ gemspec_ruby = @spec.to_ruby
32
+ gemspec_ruby = prettyify_array(gemspec_ruby, :files)
33
+ gemspec_ruby = prettyify_array(gemspec_ruby, :extra_rdoc_files)
34
+ gemspec_ruby = <<-END
35
+ # Generated by jeweler
36
+ # DO NOT EDIT THIS FILE DIRECTLY
37
+ # Instead, edit Jeweler::Tasks in #{Rake.application.rakefile}, and run 'rake gemspec'
38
+ #{gemspec_ruby}
39
+ END
40
+ end
41
+
42
+ def path
43
+ denormalized_path = File.join(@base_dir, "#{@spec.name}.gemspec")
44
+ absolute_path = File.expand_path(denormalized_path)
45
+ absolute_path.gsub(Dir.getwd + File::SEPARATOR, '')
46
+ end
47
+
48
+ def parse
49
+ data = self.to_ruby
50
+ parsed_gemspec = nil
51
+ Thread.new { parsed_gemspec = eval("$SAFE = 3\n#{data}", binding, path) }.join
52
+ parsed_gemspec
53
+ end
54
+
55
+ def normalize_files(array_attribute)
56
+ array = @spec.send(array_attribute)
57
+ # only keep files, no directories, and sort
58
+ array = array.select do |path|
59
+ File.file? File.join(@base_dir, path)
60
+ end.sort
61
+
62
+ @spec.send("#{array_attribute}=", array)
63
+ end
64
+
65
+ # Adds extra space when outputting an array. This helps create better version control diffs, because otherwise it is all on the same line.
66
+ def prettyify_array(gemspec_ruby, array_name)
67
+ gemspec_ruby.gsub(/s\.#{array_name.to_s} = \[.+?\]/) do |match|
68
+ leadin, files = match[0..-2].split("[")
69
+
70
+ leadin + "[\n #{files.gsub(%|", "|, %|",\n "|)}\n ]"
71
+ end
72
+ end
73
+
74
+ def gem_path
75
+ File.join(@base_dir, 'pkg', parse.file_name)
76
+ end
77
+
78
+ def update_version(version)
79
+ @spec.version = version.to_s
80
+ end
81
+
82
+ # Checks whether it uses the version helper or the users defined version.
83
+ def has_version?
84
+ !@spec.version.nil?
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,61 @@
1
+ require 'shellwords'
2
+
3
+ class Jeweler
4
+ class Generator
5
+ class Application
6
+ class << self
7
+ include Shellwords
8
+
9
+ def run!(*arguments)
10
+ options = build_options(arguments)
11
+
12
+ if options[:invalid_argument]
13
+ $stderr.puts options[:invalid_argument]
14
+ options[:show_help] = true
15
+ end
16
+
17
+ if options[:show_help]
18
+ $stderr.puts options.opts
19
+ return 1
20
+ end
21
+
22
+ if options[:project_name].nil? || options[:project_name].squeeze.strip == ""
23
+ $stderr.puts options.opts
24
+ return 1
25
+ end
26
+
27
+ begin
28
+ generator = Jeweler::Generator.new(options)
29
+ generator.run
30
+ return 0
31
+ rescue Jeweler::NoGitUserName
32
+ $stderr.puts %Q{No user.name found in ~/.gitconfig. Please tell git about yourself (see http://help.github.com/git-email-settings/ for details). For example: git config --global user.name "mad voo"}
33
+ return 1
34
+ rescue Jeweler::NoGitUserEmail
35
+ $stderr.puts %Q{No user.email found in ~/.gitconfig. Please tell git about yourself (see http://help.github.com/git-email-settings/ for details). For example: git config --global user.email mad.vooo@gmail.com}
36
+ return 1
37
+ rescue Jeweler::NoGitHubUser
38
+ $stderr.puts %Q{No github.user found in ~/.gitconfig. Please tell git about your GitHub account (see http://github.com/blog/180-local-github-config for details). For example: git config --global github.user defunkt}
39
+ return 1
40
+ rescue Jeweler::NoGitHubToken
41
+ $stderr.puts %Q{No github.token found in ~/.gitconfig. Please tell git about your GitHub account (see http://github.com/blog/180-local-github-config for details). For example: git config --global github.token 6ef8395fecf207165f1a82178ae1b984}
42
+ return 1
43
+ rescue Jeweler::FileInTheWay
44
+ $stderr.puts "The directory #{options[:project_name]} already exists. Maybe move it out of the way before continuing?"
45
+ return 1
46
+ end
47
+ end
48
+
49
+ def build_options(arguments)
50
+ env_opts_string = ENV['JEWELER_OPTS'] || ""
51
+ env_opts = Jeweler::Generator::Options.new(shellwords(env_opts_string))
52
+ argument_opts = Jeweler::Generator::Options.new(arguments)
53
+
54
+ env_opts.merge(argument_opts)
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,43 @@
1
+ class Jeweler
2
+ class Generator
3
+ module BaconMixin
4
+
5
+ def self.extended(generator)
6
+ generator.development_dependencies << ["bacon", ">= 0"]
7
+ end
8
+
9
+ def default_task
10
+ 'spec'
11
+ end
12
+
13
+ def feature_support_require
14
+ 'test/unit/assertions'
15
+ end
16
+
17
+ def feature_support_extend
18
+ 'Test::Unit::Assertions' # NOTE can't use bacon inside of cucumber actually
19
+ end
20
+
21
+ def test_dir
22
+ 'spec'
23
+ end
24
+
25
+ def test_task
26
+ 'spec'
27
+ end
28
+
29
+ def test_pattern
30
+ 'spec/**/*_spec.rb'
31
+ end
32
+
33
+ def test_filename
34
+ "#{require_name}_spec.rb"
35
+ end
36
+
37
+ def test_helper_filename
38
+ "spec_helper.rb"
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,29 @@
1
+ class Jeweler
2
+ class Generator
3
+ module GithubMixin
4
+ def self.extended(generator)
5
+ generator.github_username = generator.options[:github_username]
6
+ generator.github_token = generator.options[:github_token]
7
+ generator.should_create_remote_repo = generator.options[:create_repo]
8
+
9
+ unless generator.github_username
10
+ raise NoGitHubUser
11
+ end
12
+
13
+ if generator.should_create_remote_repo
14
+ unless generator.github_token
15
+ raise NoGitHubToken
16
+ end
17
+ end
18
+ end
19
+
20
+ def git_remote
21
+ @git_remote ||= "git@github.com:#{github_username}/#{project_name}.git"
22
+ end
23
+
24
+ def homepage
25
+ @homepage ||= "http://github.com/#{github_username}/#{project_name}"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,41 @@
1
+ class Jeweler
2
+ class Generator
3
+ module MicronautMixin
4
+ def self.extended(generator)
5
+ generator.development_dependencies << ["spicycode-micronaut", ">= 0"]
6
+ end
7
+
8
+ def default_task
9
+ 'examples'
10
+ end
11
+
12
+ def feature_support_require
13
+ 'micronaut/expectations'
14
+ end
15
+
16
+ def feature_support_extend
17
+ 'Micronaut::Matchers'
18
+ end
19
+
20
+ def test_dir
21
+ 'examples'
22
+ end
23
+
24
+ def test_task
25
+ 'examples'
26
+ end
27
+
28
+ def test_pattern
29
+ 'examples/**/*_example.rb'
30
+ end
31
+
32
+ def test_filename
33
+ "#{require_name}_example.rb"
34
+ end
35
+
36
+ def test_helper_filename
37
+ "example_helper.rb"
38
+ end
39
+ end
40
+ end
41
+ end