gem-release 1.0.0 → 2.0.0.dev.1

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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +13 -0
  3. data/Gemfile.lock +72 -0
  4. data/{lib/gem_release/templates/LICENSE → MIT-LICENSE.md} +3 -2
  5. data/README.md +646 -0
  6. data/README.md.erb +159 -0
  7. data/TODO.txt +194 -0
  8. data/lib/gem/release.rb +13 -0
  9. data/lib/gem/release/cmds.rb +16 -0
  10. data/lib/gem/release/cmds/base.rb +101 -0
  11. data/lib/gem/release/cmds/bootstrap.rb +222 -0
  12. data/lib/gem/release/cmds/bump.rb +165 -0
  13. data/lib/gem/release/cmds/gemspec.rb +85 -0
  14. data/lib/gem/release/cmds/release.rb +100 -0
  15. data/lib/gem/release/cmds/runner.rb +52 -0
  16. data/lib/gem/release/cmds/tag.rb +93 -0
  17. data/lib/gem/release/config.rb +42 -0
  18. data/lib/gem/release/config/env.rb +49 -0
  19. data/lib/gem/release/config/files.rb +35 -0
  20. data/lib/gem/release/context.rb +76 -0
  21. data/lib/gem/release/context/gem.rb +28 -0
  22. data/lib/gem/release/context/gemspec.rb +41 -0
  23. data/lib/gem/release/context/paths.rb +87 -0
  24. data/lib/gem/release/context/system.rb +36 -0
  25. data/lib/gem/release/data.rb +60 -0
  26. data/lib/gem/release/files/template.rb +61 -0
  27. data/lib/gem/release/files/template/context.rb +30 -0
  28. data/lib/gem/release/files/templates.rb +59 -0
  29. data/lib/gem/release/files/templates/group.rb +47 -0
  30. data/lib/gem/release/files/version.rb +68 -0
  31. data/lib/gem/release/helper.rb +45 -0
  32. data/lib/gem/release/helper/hash.rb +35 -0
  33. data/lib/gem/release/helper/string.rb +43 -0
  34. data/lib/gem/release/support/gem_command.rb +67 -0
  35. data/lib/gem/release/support/registry.rb +59 -0
  36. data/lib/gem/release/templates/.gitignore +8 -0
  37. data/lib/gem/release/templates/Gemfile +3 -0
  38. data/lib/gem/release/templates/gemspec +19 -0
  39. data/lib/gem/release/templates/licenses/mit.md +21 -0
  40. data/lib/gem/release/templates/licenses/mpl-2.md +373 -0
  41. data/lib/gem/release/templates/main.rb +1 -0
  42. data/lib/gem/release/templates/rspec/.rspec +3 -0
  43. data/lib/gem/release/templates/rspec/spec/spec_helper.rb +4 -0
  44. data/lib/gem/release/templates/travis/.travis.yml +1 -0
  45. data/lib/gem/release/templates/version.rb +1 -0
  46. data/lib/gem/release/version.rb +5 -0
  47. data/lib/gem/release/version/number.rb +102 -0
  48. data/lib/rubygems/commands/bootstrap_command.rb +4 -93
  49. data/lib/rubygems/commands/bump_command.rb +4 -110
  50. data/lib/rubygems/commands/gemspec_command.rb +5 -29
  51. data/lib/rubygems/commands/release_command.rb +4 -70
  52. data/lib/rubygems/commands/tag_command.rb +5 -46
  53. data/lib/rubygems_plugin.rb +8 -2
  54. metadata +56 -83
  55. data/lib/core_ext/hash/symbolize_keys.rb +0 -13
  56. data/lib/core_ext/kernel/silence.rb +0 -18
  57. data/lib/core_ext/string/camelize.rb +0 -5
  58. data/lib/gem_release.rb +0 -10
  59. data/lib/gem_release/command_options.rb +0 -31
  60. data/lib/gem_release/configuration.rb +0 -33
  61. data/lib/gem_release/gemspec_template.rb +0 -35
  62. data/lib/gem_release/helpers.rb +0 -104
  63. data/lib/gem_release/template.rb +0 -52
  64. data/lib/gem_release/templates/Gemfile +0 -3
  65. data/lib/gem_release/templates/README.md +0 -1
  66. data/lib/gem_release/templates/Rakefile +0 -10
  67. data/lib/gem_release/templates/gemspec +0 -18
  68. data/lib/gem_release/templates/gitignore +0 -25
  69. data/lib/gem_release/templates/test/test_helper.rb +0 -2
  70. data/lib/gem_release/templates/version.rb +0 -12
  71. data/lib/gem_release/version.rb +0 -3
  72. data/lib/gem_release/version_file.rb +0 -115
  73. data/lib/gem_release/version_template.rb +0 -14
data/README.md.erb ADDED
@@ -0,0 +1,159 @@
1
+ # gem release [![Build Status](https://secure.travis-ci.org/svenfuchs/gem-release.png)](http://travis-ci.org/svenfuchs/gem-release)
2
+
3
+ This gem plugin aims at making gem development easier by automating repetitive work based on conventions, configuration, and templates.
4
+
5
+ It adds the commands `bootstrap`, `gemspec`, `bump`, `tag` and a `release` to the rubygems `gem` command.
6
+
7
+ | Project | Gem Release |
8
+ | ---------------------- | ------------ |
9
+ | Gem name | gem-release |
10
+ | License | [MIT](https://github.com/svenfuchs/gem-release/blob/master/LICENSE.md) |
11
+ | Version | [![Gem Version](https://badge.fury.io/rb/gem-release.png)](http://badge.fury.io/rb/gem-release) |
12
+ | Continuous integration | [![Build Status](https://secure.travis-ci.org/svenfuchs/gem-release.png?branch=master)](https://travis-ci.org/svenfuchs/gem-release) |
13
+ | Test coverage | [![Coverage Status](https://coveralls.io/repos/svenfuchs/gem-release/badge.png)](https://coveralls.io/r/svenfuchs/gem-release) |
14
+ | Documentation | [Documentation](http://rdoc.info/github/svenfuchs/gem-release/frames) |
15
+ | Credits | [Contributors](https://github.com/svenfuchs/gem-release/graphs/contributors) |
16
+
17
+ # Table of contents
18
+
19
+ * [Demo](#demo)
20
+ * [Installation](#installation)
21
+ * [Configuration](#configuration)
22
+ * [Conventions](#conventions)
23
+ * [Reference](#reference)
24
+ * [Scenarios](#scenarios)
25
+ * [Development](#development)
26
+
27
+ # Demo
28
+
29
+ This gif demos some of the things you can do with this plugin:
30
+
31
+ ![gem-relase-demo](https://cloud.githubusercontent.com/assets/2208/25568627/12a3b468-2e07-11e7-8d7b-055b5d7c71b9.gif)
32
+
33
+ ## Installation
34
+
35
+ The gem provides a rubygems plugin, so it's just:
36
+
37
+ ```
38
+ gem install gem-release
39
+ ```
40
+
41
+
42
+ # Configuration
43
+
44
+ Defaults for all options can be specified in a config file at either one of
45
+ these locations:
46
+
47
+ * `~/.gem_release/config.yml`
48
+ * `~/.gem_release.yml`
49
+ * `./.gem_release/config.yml`
50
+ * `./.gem_release.yml`
51
+
52
+ Config files must be in the [YAML](http://www.yaml.org/) format, and list
53
+ options per command. Common options can be set on the root.
54
+
55
+ For instance, the following entries will set the `quiet` flag for all commands,
56
+ and a custom host name with `gem release`:
57
+
58
+ ```yaml
59
+ quiet: true
60
+
61
+ release:
62
+ host: https://example.com
63
+ ```
64
+
65
+ Defaults for all options also can be specified as environment variables, for
66
+ example `GEM_RELEASE_PRETEND=true`.
67
+
68
+ Defaults specified in config files and environment variables can be overridden
69
+ as command line options when issuing the respective `gem` command.
70
+
71
+ Only the first config file found in the locations given above will be used, if
72
+ any, and defaults from this config file will be merged with both environment
73
+ variables and given command line options.
74
+
75
+
76
+ # Conventions
77
+
78
+ When bootstrapping a new gem:
79
+
80
+ * A gem name `gem_name` is left untouched when mapped to the path `lib/gem_name`, and the Ruby constant name `GemName`.
81
+ * A gem name `gem-name` is mapped to the path `lib/gem/name`, and the Ruby constant name `Gem::Name`
82
+
83
+ When bumping the version of an existing gem `gem-name` the following locations are checked:
84
+
85
+ * `lib/gem/name/version.rb`
86
+ * `lib/gem-name/version.rb`
87
+
88
+
89
+ # Reference
90
+
91
+ The gem `gem-release` adds the following commands to the rubygems `gem` command:
92
+
93
+ <% cmds.each do |name, help| -%>
94
+ * [gem <%= name %>](#gem-<%= name %>) - <%= help[:summary] %>
95
+ <% end -%>
96
+
97
+ <% cmds.each do |name, help| -%>
98
+ ## gem <%= name %>
99
+
100
+ <%= help[:summary] %>
101
+
102
+ <% if help[:arguments] -%>
103
+ ### Arguments
104
+
105
+ ```
106
+ <%= help[:arguments] %>
107
+ ```
108
+
109
+ <% end -%>
110
+ <% if help[:options] -%>
111
+ ### Options
112
+
113
+ ```
114
+ <%= help[:options] %>
115
+ ```
116
+ <% end -%>
117
+
118
+ <% if help[:description] -%>
119
+ ### Description
120
+
121
+ <%= help[:description] %>
122
+
123
+ <% end -%>
124
+ <% end -%>
125
+
126
+ # Scenarios
127
+
128
+ <% scenarios.each do |scenario| -%>
129
+ * [<%= scenario[:title] %>](#<%= scenario[:id] %>)
130
+ <% end -%>
131
+
132
+ <% scenarios.each do |scenario| -%>
133
+ <%= scenario[:text] %>
134
+ <% end -%>
135
+
136
+ # Development
137
+
138
+ Running tests:
139
+
140
+ ```
141
+ bundle install
142
+ bundle exec rspec
143
+ ```
144
+
145
+ Testing commands against a [Geminabox](https://github.com/geminabox/geminabox) instance:
146
+
147
+ ```
148
+ # start geminabox
149
+ bundle install
150
+ bundle exec rackup
151
+
152
+ # workaround rubygems issue with a missing key
153
+ # see https://github.com/geminabox/geminabox/issues/153
154
+ echo ':localhost: none' >> ~/.gem/credentials
155
+
156
+ # test release
157
+ bundle exec gem release --host=http://localhost:9292 --key localhost
158
+ ```
159
+
data/TODO.txt ADDED
@@ -0,0 +1,194 @@
1
+ # Todo
2
+
3
+ * Make it so that if no arg is given, we fallback to the first gemspec file
4
+ first. only if there's no gemspec file we use the dirname?
5
+
6
+ * Add a changelog
7
+
8
+ * Release and tag should fail if there are uncommitted changes
9
+ https://github.com/svenfuchs/gem-release/issues/34
10
+
11
+ * Make sure we don't double tag the same repo when several args are given
12
+
13
+ # Fix
14
+
15
+ * Misleading success message
16
+ https://github.com/svenfuchs/gem-release/issues/60
17
+
18
+ # Double check
19
+
20
+ - Issues with in-repo gems [1]
21
+ https://github.com/svenfuchs/gem-release/issues/58
22
+
23
+ x bump fails when there is a space in the path to project done:2017-05-01 [2]
24
+ https://github.com/svenfuchs/gem-release/issues/33
25
+ looks like this is fixed. this did not result in any errors:
26
+ cd /tmp
27
+ mkdir -p '/tmp/seanmackesey/Google Drive/code/lib/ruby'
28
+ cd /tmp/seanmackesey/Google\ Drive/code/lib/ruby
29
+ gem bootstrap foo
30
+ gem bump --no-push
31
+
32
+ - gem bump --tag --release pushes the wrong version [3]
33
+ https://github.com/svenfuchs/gem-release/issues/36
34
+
35
+ # Refactor
36
+
37
+ should create the directory foo, and cd into it
38
+
39
+ cd tmp
40
+ gem bootstrap foo
41
+
42
+
43
+ should bootstrap a gem foo
44
+
45
+ cd foo
46
+ gem bootstrap
47
+
48
+ should fail, as there's no foo.gemspec
49
+
50
+ cd tmp
51
+ gem bump foo
52
+
53
+ should bump the first gemspec's gem, no matter the dir name
54
+
55
+ cd foo
56
+ gem bump
57
+
58
+ # Scenario: Nested gem with conventional directory name
59
+
60
+ ### Setup
61
+
62
+ ```
63
+ export GEM_RELEASE_PUSH=false
64
+ cd /tmp
65
+ rm -rf sinja
66
+ gem bootstrap sinja
67
+ cd sinja
68
+ mkdir extensions
69
+ cd extensions
70
+ gem bootstrap sinja-sequel
71
+ cd /tmp/sinja
72
+ tree
73
+ ```
74
+
75
+ ### Directory structure
76
+
77
+ ```
78
+ .
79
+ ├── Gemfile
80
+ ├── LICENSE.md
81
+ ├── extensions
82
+ │   └── sinja-sequel
83
+ │   ├── Gemfile
84
+ │   ├── LICENSE.md
85
+ │   ├── lib
86
+ │   │   └── sinja
87
+ │   │   ├── sequel
88
+ │   │   │   └── version.rb
89
+ │   │   └── sequel.rb
90
+ │   └── sinja-sequel.gemspec
91
+ ├── lib
92
+ │   ├── sinja
93
+ │   │   └── version.rb
94
+ │   └── sinja.rb
95
+ └── sinja.gemspec
96
+ ```
97
+
98
+ ### Behaviour
99
+
100
+ ```
101
+ # this bumps both sinja and sinja-sequel
102
+ cd /tmp/sinja
103
+ gem bump --recurse
104
+
105
+ # this bumps sinja
106
+ cd /tmp/sinja
107
+ gem bump
108
+
109
+ # this also bumps sinja
110
+ cd /tmp/sinja
111
+ gem bump sinja
112
+
113
+ # this bumps sinja-sequel only
114
+ cd /tmp/sinja
115
+ gem bump sinja-sequel
116
+
117
+ # this also bumps sinja-sequel only
118
+ cd /tmp/sinja/extensions/sinja-sequel
119
+ gem bump
120
+
121
+ # this also bumps sinja-sequel only
122
+ cd /tmp/sinja/extensions/sinja-sequel
123
+ gem bump sinja-sequel
124
+ ```
125
+
126
+ ## Nested gem with irregular directory name
127
+
128
+ ### Setup
129
+
130
+ ```
131
+ export GEM_RELEASE_PUSH=false
132
+ cd /tmp
133
+ rm -rf sinja
134
+ gem bootstrap sinja
135
+ cd sinja
136
+ mkdir -p extensions
137
+ cd extensions
138
+ gem bootstrap sinja-sequel
139
+ mv sinja-sequel sequel
140
+ cd /tmp/sinja
141
+ tree
142
+ ```
143
+
144
+ ### Directory structure
145
+
146
+ ```
147
+ .
148
+ ├── Gemfile
149
+ ├── LICENSE.md
150
+ ├── extensions
151
+ │   └── sequel
152
+ │   ├── Gemfile
153
+ │   ├── LICENSE.md
154
+ │   ├── lib
155
+ │   │   └── sinja
156
+ │   │   ├── sequel
157
+ │   │   │   └── version.rb
158
+ │   │   └── sequel.rb
159
+ │   └── sinja-sequel.gemspec
160
+ ├── lib
161
+ │   ├── sinja
162
+ │   │   └── version.rb
163
+ │   └── sinja.rb
164
+ └── sinja.gemspec
165
+ ```
166
+
167
+ ### Behaviour
168
+
169
+ ```
170
+ # this bumps both sinja and sinja-sequel
171
+ cd /tmp/sinja
172
+ gem bump --recurse
173
+
174
+ # this bumps sinja
175
+ cd /tmp/sinja
176
+ gem bump
177
+
178
+ # this also bumps sinja
179
+ cd /tmp/sinja
180
+ gem bump sinja
181
+
182
+ # this bumps sinja-sequel only
183
+ cd /tmp/sinja
184
+ gem bump sinja-sequel
185
+
186
+ # this also bumps sinja-sequel only
187
+ cd /tmp/sinja/extensions/sinja-sequel
188
+ gem bump
189
+
190
+ # this also bumps sinja-sequel only
191
+ cd /tmp/sinja/extensions/sinja-sequel
192
+ gem bump sinja-sequel
193
+ ```
194
+
@@ -0,0 +1,13 @@
1
+ module Gem
2
+ module Release
3
+ Abort = Class.new(StandardError)
4
+
5
+ STRATEGIES = {
6
+ git: '`git ls-files app lib`.split("\n")',
7
+ glob: "Dir.glob('{bin/*,lib/**/*,[A-Z]*}')"
8
+ }
9
+ end
10
+ end
11
+
12
+ require 'gem/release/cmds'
13
+ require 'gem/release/config'
@@ -0,0 +1,16 @@
1
+ require 'gem/release/cmds/bootstrap'
2
+ require 'gem/release/cmds/bump'
3
+ require 'gem/release/cmds/gemspec'
4
+ require 'gem/release/cmds/release'
5
+ require 'gem/release/cmds/runner'
6
+ require 'gem/release/cmds/tag'
7
+
8
+ module Gem
9
+ module Release
10
+ module Cmds
11
+ def self.[](cmd)
12
+ Base[cmd]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,101 @@
1
+ require 'gem/release/helper'
2
+ require 'gem/release/helper/hash'
3
+ require 'gem/release/helper/string'
4
+ require 'gem/release/support/registry'
5
+
6
+ module Gem
7
+ module Release
8
+ module Cmds
9
+ class Base < Struct.new(:context, :args, :opts)
10
+ include Helper, Helper::Hash, Helper::String, Registry
11
+
12
+ class << self
13
+ include Helper::String
14
+
15
+ def inherited(cmd)
16
+ cmd.register underscore(cmd.name.split('::').last)
17
+ end
18
+
19
+ def arg(name, summary)
20
+ args << [name, summary]
21
+ end
22
+
23
+ def args
24
+ @args ||= []
25
+ end
26
+
27
+ def opt(*args, &block)
28
+ opts << [args, block]
29
+ end
30
+
31
+ def opts
32
+ @opts ||= superclass != self.class && superclass.respond_to?(:opts) ? superclass.opts.dup : []
33
+ end
34
+
35
+ def usage(usage = nil)
36
+ usage ? @usage = usage : @usage || '[usage]'
37
+ end
38
+
39
+ WIDTH = 70
40
+
41
+ def summary(summary = nil)
42
+ summary ? @summary = wrap(summary, WIDTH) : @summary || '[summary]'
43
+ end
44
+
45
+ def description(description = nil)
46
+ description ? @description = wrap(description, WIDTH) : @description
47
+ end
48
+ end
49
+
50
+ opt '--pretend' do
51
+ opts[:pretend] = true
52
+ end
53
+
54
+ opt '--quiet' do
55
+ opts[:quiet] = true
56
+ end
57
+
58
+ attr_reader :gem
59
+
60
+ def initialize(context, args, opts)
61
+ opts = defaults.merge(opts)
62
+ super
63
+ end
64
+
65
+ def in_dirs
66
+ context.in_dirs(args, opts) do |name|
67
+ @gem = Context::Gem.new(name)
68
+ yield
69
+ end
70
+ end
71
+
72
+ def in_gem_dirs
73
+ context.in_gem_dirs(args, opts) do |name|
74
+ @gem = Context::Gem.new(name)
75
+ yield
76
+ end
77
+ end
78
+
79
+ def pretend?
80
+ !!opts[:pretend]
81
+ end
82
+
83
+ def quiet?
84
+ opts[:quiet] || opts[:silent]
85
+ end
86
+
87
+ def opts
88
+ @opts ||= config.merge(super)
89
+ end
90
+
91
+ def config
92
+ context.config.for(registry_key)
93
+ end
94
+
95
+ def defaults
96
+ self.class.const_defined?(:DEFAULTS) ? self.class::DEFAULTS : {}
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end