fastlane-plugin-semantic_release 1.0.1 → 1.0.2
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.
- checksums.yaml +4 -4
- data/README.md +37 -12
- data/lib/fastlane/plugin/semantic_release/actions/analyze_commits.rb +37 -38
- data/lib/fastlane/plugin/semantic_release/actions/conventional_changelog.rb +51 -55
- data/lib/fastlane/plugin/semantic_release/helper/semantic_release_helper.rb +14 -12
- data/lib/fastlane/plugin/semantic_release/version.rb +1 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0d36b85b2320a1df53dbf3763dfc1bc4fa9bdfad599f032ff2d5ea320c65328
|
4
|
+
data.tar.gz: 61e35082c7b62e22873b42ba21c9c16d3d3041c167357d9c2bcf3b679bd3bb6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b1c95f31840c0f65634472136d73e398317d9bc64edbaee5caefce6e4e6308edf15a8f78873c13384ff2d59b7ab7b48bf2786f279c81d2e8b708a3c35ace88b
|
7
|
+
data.tar.gz: c917d1ff56ddec4295823857a832c5c9f736049d60437e48ed5a4daa39bce5dba63e26007cffae0c9c1f2f6da8998430a24520af374aeb414a2c9b41f7967f35
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# semantic_release plugin
|
1
|
+
# semantic_release plugin for `fastlane`
|
2
2
|
|
3
|
-
[](https://rubygems.org/gems/fastlane-plugin-
|
3
|
+
[](https://circleci.com/gh/xotahal/fastlane-plugin-semantic_release) [](https://github.com/SiarheiFedartsou/fastlane-plugin-versioning/blob/master/LICENSE) [](https://badge.fury.io/rb/fastlane-plugin-semantic_release) [](https://rubygems.org/gems/fastlane-plugin-versioning)
|
4
4
|
|
5
5
|
## Getting Started
|
6
6
|
|
@@ -14,25 +14,42 @@ fastlane add_plugin semantic_release
|
|
14
14
|
|
15
15
|
Automated version managment and generator of release notes.
|
16
16
|
|
17
|
-
|
17
|
+
Inspired by [semantic-release](https://github.com/semantic-release/semantic-release) for npm packages. Based on [conventional commits](https://www.conventionalcommits.org/).
|
18
18
|
|
19
|
-
## Example
|
20
19
|
|
21
|
-
Check out the [example `Fastfile`](fastlane/Fastfile) to see how to use this plugin. Try it by cloning the repo, running `fastlane install_plugins` and `bundle exec fastlane test`.
|
22
20
|
|
23
|
-
|
21
|
+
## Actions
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
### analyze_commits
|
24
|
+
- analyzes your git history
|
25
|
+
- finds last tag on current branch (for example ios/beta/1.3.2)
|
26
|
+
- parses the last version from tag (1.3.2)
|
27
|
+
- gets all commits since this tag
|
28
|
+
- analyzes subject of every single commit and increases version number if there is a need (check conventional commit rules)
|
29
|
+
- if next version number is higher then last version number it will recommend you to release this version
|
28
30
|
|
31
|
+
Please run `fastlane action analyze_commits` to see all documentation in your command line.
|
32
|
+
```
|
33
|
+
isReleasable = analyze_commits(match: 'ios/beta*')
|
34
|
+
```
|
35
|
+
It leave these variables in lane_context. You can get them by `lane_context[SharedValues::RELEASE_NEXT_VERSION]` - for example.
|
29
36
|
```
|
30
|
-
|
37
|
+
['RELEASE_ANALYZED', 'True if commits were analyzed.'],
|
38
|
+
['RELEASE_IS_NEXT_VERSION_HIGHER', 'True if next version is higher then last version'],
|
39
|
+
['RELEASE_LAST_TAG_HASH', 'Hash of commit that is tagged as a last version'],
|
40
|
+
['RELEASE_LAST_VERSION', 'Last version number - parsed from last tag.'],
|
41
|
+
['RELEASE_NEXT_MAJOR_VERSION', 'Major number of the next version'],
|
42
|
+
['RELEASE_NEXT_MINOR_VERSION', 'Minor number of the next version'],
|
43
|
+
['RELEASE_NEXT_PATCH_VERSION', 'Patch number of the next version'],
|
44
|
+
['RELEASE_NEXT_VERSION', 'Next version string in format (major.minor.patch)'],
|
31
45
|
```
|
46
|
+
### conventional_changelog
|
47
|
+
- parses all commits since last version
|
48
|
+
- group those commits by their type (fix, feat, docs, refactor, chore, etc)
|
49
|
+
- and creates formated release notes either in markdown or in slack format
|
32
50
|
|
33
|
-
To automatically fix many of the styling issues, use
|
34
51
|
```
|
35
|
-
|
52
|
+
notes = conventional_changelog(format: 'slack', title: 'Android Alpha')
|
36
53
|
```
|
37
54
|
|
38
55
|
## Issues and Feedback
|
@@ -50,3 +67,11 @@ For more information about how the `fastlane` plugin system works, check out the
|
|
50
67
|
## About _fastlane_
|
51
68
|
|
52
69
|
_fastlane_ is the easiest way to automate beta deployments and releases for your iOS and Android apps. To learn more, check out [fastlane.tools](https://fastlane.tools).
|
70
|
+
|
71
|
+
## Questions
|
72
|
+
|
73
|
+
If you need anything ping us on [twitter](http://bit.ly/t-xotahal).
|
74
|
+
|
75
|
+
| Jiri Otahal |
|
76
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------ |
|
77
|
+
| [<img src="https://avatars3.githubusercontent.com/u/3531955?v=4" width="100px;" style="border-radius:50px"/>](http://bit.ly/t-xotahal) |
|
@@ -14,7 +14,6 @@ module Fastlane
|
|
14
14
|
RELEASE_NEXT_VERSION = :RELEASE_NEXT_VERSION
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
17
|
class AnalyzeCommitsAction < Action
|
19
18
|
def self.run(params)
|
20
19
|
# Last version tag name
|
@@ -26,81 +25,81 @@ module Fastlane
|
|
26
25
|
version = '0.0.0'
|
27
26
|
|
28
27
|
begin
|
29
|
-
#Try to find the tag
|
28
|
+
# Try to find the tag
|
30
29
|
command = "git describe --tags --match=#{params[:match]}"
|
31
30
|
tag = Actions.sh(command, log: false)
|
32
31
|
rescue
|
33
32
|
UI.message("Tag was not found for match pattern - #{params[:match]}")
|
34
33
|
end
|
35
34
|
|
36
|
-
if tag.empty?
|
35
|
+
if tag.empty?
|
37
36
|
UI.message("First commit of the branch is taken as a begining of next release")
|
38
37
|
# If there is no tag found we taking the first commit of current branch
|
39
38
|
hash = Actions.sh('git rev-list --max-parents=0 HEAD', log: false).chomp
|
40
39
|
else
|
41
40
|
# Tag's format is v2.3.4-5-g7685948
|
42
41
|
# See git describe man page for more info
|
43
|
-
|
44
|
-
version =
|
42
|
+
tag_name = tag.split('-')[0].strip
|
43
|
+
version = tag_name.match(params[:tag_version_match])[0]
|
45
44
|
# Get a hash of last version tag
|
46
|
-
command = "git rev-list -n 1 #{
|
45
|
+
command = "git rev-list -n 1 #{tag_name}"
|
47
46
|
hash = Actions.sh(command, log: false).chomp
|
48
47
|
|
49
|
-
UI.message("Found a tag #{
|
48
|
+
UI.message("Found a tag #{tag_name} associated with version #{version}")
|
50
49
|
end
|
51
50
|
|
52
51
|
# converts last version string to the int numbers
|
53
|
-
|
54
|
-
|
55
|
-
|
52
|
+
next_major = (version.split('.')[0] || 0).to_i
|
53
|
+
next_minor = (version.split('.')[1] || 0).to_i
|
54
|
+
next_patch = (version.split('.')[2] || 0).to_i
|
56
55
|
|
57
56
|
# Get commits log between last version and head
|
58
57
|
commits = Helper::SemanticReleaseHelper.git_log('%s', hash)
|
59
|
-
splitted = commits.split("\n")
|
58
|
+
splitted = commits.split("\n")
|
60
59
|
|
61
60
|
UI.message("Found #{splitted.length} commits since last release")
|
62
61
|
releases = params[:releases]
|
63
62
|
|
64
|
-
|
63
|
+
splitted.each do |line|
|
65
64
|
# conventional commits are in format
|
66
65
|
# type: subject (fix: app crash - for example)
|
67
66
|
type = line.split(":")[0]
|
68
67
|
release = releases[type.to_sym]
|
69
68
|
|
70
|
-
if release == "patch"
|
71
|
-
|
72
|
-
elsif release == "minor"
|
73
|
-
|
74
|
-
|
75
|
-
elsif release == "major"
|
76
|
-
|
77
|
-
|
78
|
-
|
69
|
+
if release == "patch"
|
70
|
+
next_patch += 1
|
71
|
+
elsif release == "minor"
|
72
|
+
next_minor += 1
|
73
|
+
next_patch = 0
|
74
|
+
elsif release == "major"
|
75
|
+
next_major += 1
|
76
|
+
next_minor = 0
|
77
|
+
next_patch = 0
|
79
78
|
end
|
80
79
|
|
81
|
-
|
82
|
-
UI.message("#{
|
80
|
+
next_version = "#{next_major}.#{next_minor}.#{next_patch}"
|
81
|
+
UI.message("#{next_version}: #{line}")
|
83
82
|
end
|
84
83
|
|
85
|
-
|
84
|
+
next_version = "#{next_major}.#{next_minor}.#{next_patch}"
|
86
85
|
|
87
|
-
|
86
|
+
is_releasable = Helper::SemanticReleaseHelper.semver_gt(next_version, version)
|
88
87
|
|
89
88
|
Actions.lane_context[SharedValues::RELEASE_ANALYZED] = true
|
90
|
-
Actions.lane_context[SharedValues::RELEASE_IS_NEXT_VERSION_HIGHER] =
|
89
|
+
Actions.lane_context[SharedValues::RELEASE_IS_NEXT_VERSION_HIGHER] = is_releasable
|
91
90
|
# Last release analysis
|
92
91
|
Actions.lane_context[SharedValues::RELEASE_LAST_TAG_HASH] = hash
|
93
92
|
Actions.lane_context[SharedValues::RELEASE_LAST_VERSION] = version
|
94
93
|
# Next release analysis
|
95
|
-
Actions.lane_context[SharedValues::RELEASE_NEXT_MAJOR_VERSION] =
|
96
|
-
Actions.lane_context[SharedValues::RELEASE_NEXT_MINOR_VERSION] =
|
97
|
-
Actions.lane_context[SharedValues::RELEASE_NEXT_PATCH_VERSION] =
|
98
|
-
Actions.lane_context[SharedValues::RELEASE_NEXT_VERSION] =
|
94
|
+
Actions.lane_context[SharedValues::RELEASE_NEXT_MAJOR_VERSION] = next_major
|
95
|
+
Actions.lane_context[SharedValues::RELEASE_NEXT_MINOR_VERSION] = next_minor
|
96
|
+
Actions.lane_context[SharedValues::RELEASE_NEXT_PATCH_VERSION] = next_patch
|
97
|
+
Actions.lane_context[SharedValues::RELEASE_NEXT_VERSION] = next_version
|
99
98
|
|
100
|
-
|
101
|
-
UI.success(
|
99
|
+
success_message = "Next version (#{next_version}) is higher than last version (#{version}). This version should be released."
|
100
|
+
UI.success(success_message) if is_releasable
|
102
101
|
|
103
|
-
|
102
|
+
is_releasable
|
104
103
|
end
|
105
104
|
|
106
105
|
#####################################################
|
@@ -124,20 +123,20 @@ module Fastlane
|
|
124
123
|
key: :match,
|
125
124
|
description: "Match parameter of git describe. See man page of git describe for more info",
|
126
125
|
verify_block: proc do |value|
|
127
|
-
|
126
|
+
UI.user_error!("No match for analyze_commits action given, pass using `match: 'expr'`") unless value && !value.empty?
|
128
127
|
end
|
129
128
|
),
|
130
129
|
FastlaneCore::ConfigItem.new(
|
131
130
|
key: :releases,
|
132
131
|
description: "Map types of commit to release (major, minor, patch)",
|
133
132
|
default_value: { fix: "patch", feat: "minor" },
|
134
|
-
type: Hash
|
133
|
+
type: Hash
|
135
134
|
),
|
136
135
|
FastlaneCore::ConfigItem.new(
|
137
136
|
key: :tag_version_match,
|
138
137
|
description: "To parse version number from tag name",
|
139
|
-
default_value: '\d+\.\d+\.\d+'
|
140
|
-
)
|
138
|
+
default_value: '\d+\.\d+\.\d+'
|
139
|
+
)
|
141
140
|
]
|
142
141
|
end
|
143
142
|
|
@@ -152,7 +151,7 @@ module Fastlane
|
|
152
151
|
['RELEASE_NEXT_MAJOR_VERSION', 'Major number of the next version'],
|
153
152
|
['RELEASE_NEXT_MINOR_VERSION', 'Minor number of the next version'],
|
154
153
|
['RELEASE_NEXT_PATCH_VERSION', 'Patch number of the next version'],
|
155
|
-
['RELEASE_NEXT_VERSION', 'Next version string in format (major.minor.patch)']
|
154
|
+
['RELEASE_NEXT_VERSION', 'Next version string in format (major.minor.patch)']
|
156
155
|
]
|
157
156
|
end
|
158
157
|
|
@@ -13,31 +13,30 @@ module Fastlane
|
|
13
13
|
|
14
14
|
# If analyze commits action was not run there will be no version in shared
|
15
15
|
# values. We need to run the action to get next version number
|
16
|
-
|
16
|
+
unless analyzed
|
17
17
|
UI.user_error!("Release hasn't been analyzed yet. Run analyze_commits action first please.")
|
18
18
|
# version = other_action.analyze_commits(match: params[:match])
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
last_tag_hash = lane_context[SharedValues::RELEASE_LAST_TAG_HASH]
|
22
22
|
version = lane_context[SharedValues::RELEASE_NEXT_VERSION]
|
23
23
|
|
24
24
|
# Get commits log between last version and head
|
25
|
-
commits = Helper::SemanticReleaseHelper.git_log('%s|%H|%h|%an|%at',
|
26
|
-
parsed =
|
25
|
+
commits = Helper::SemanticReleaseHelper.git_log('%s|%H|%h|%an|%at', last_tag_hash)
|
26
|
+
parsed = parse_commits(commits.split("\n"))
|
27
27
|
|
28
|
+
commit_url = params[:commit_url]
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
if params[:format] == 'markdown' then
|
32
|
-
result = markdown(parsed, version, commitUrl, params)
|
30
|
+
if params[:format] == 'markdown'
|
31
|
+
result = markdown(parsed, version, commit_url, params)
|
33
32
|
elsif params[:format] == 'slack'
|
34
|
-
result = slack(parsed, version,
|
33
|
+
result = slack(parsed, version, commit_url, params)
|
35
34
|
end
|
36
35
|
|
37
36
|
result
|
38
37
|
end
|
39
38
|
|
40
|
-
def self.markdown(commits, version,
|
39
|
+
def self.markdown(commits, version, commit_url, params)
|
41
40
|
sections = params[:sections]
|
42
41
|
|
43
42
|
# Begining of release notes
|
@@ -45,96 +44,94 @@ module Fastlane
|
|
45
44
|
result += "\n"
|
46
45
|
result += "(#{Date.today})"
|
47
46
|
|
48
|
-
|
47
|
+
params[:order].each do |type|
|
49
48
|
# write section only if there is at least one commit
|
50
|
-
next if
|
49
|
+
next if commits.none? { |commit| commit[:type] == type }
|
51
50
|
|
52
51
|
result += "\n\n"
|
53
52
|
result += "### #{sections[type.to_sym]}"
|
54
53
|
result += "\n"
|
55
54
|
|
56
|
-
|
57
|
-
if commit[:type]
|
58
|
-
authorName = commit[:authorName]
|
59
|
-
shortHash = commit[:shortHash]
|
60
|
-
hash = commit[:hash]
|
61
|
-
link = "#{commitUrl}/#{hash}"
|
55
|
+
commits.each do |commit|
|
56
|
+
next if commit[:type] != type
|
62
57
|
|
63
|
-
|
58
|
+
author_name = commit[:author_name]
|
59
|
+
short_hash = commit[:short_hash]
|
60
|
+
hash = commit[:hash]
|
61
|
+
link = "#{commit_url}/#{hash}"
|
64
62
|
|
65
|
-
|
66
|
-
result += "- #{authorName}"
|
67
|
-
end
|
63
|
+
result += "- #{commit[:subject]} ([#{short_hash}](#{link}))"
|
68
64
|
|
69
|
-
|
65
|
+
if params[:display_author]
|
66
|
+
result += "- #{author_name}"
|
70
67
|
end
|
68
|
+
|
69
|
+
result += "\n"
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
74
|
-
|
75
73
|
result
|
76
74
|
end
|
77
75
|
|
78
|
-
def self.slack(commits, version,
|
76
|
+
def self.slack(commits, version, commit_url, params)
|
79
77
|
sections = params[:sections]
|
80
78
|
|
81
79
|
# Begining of release notes
|
82
80
|
result = "*#{version} #{params[:title]}* (#{Date.today})"
|
83
81
|
result += "\n"
|
84
82
|
|
85
|
-
|
83
|
+
params[:order].each do |type|
|
86
84
|
# write section only if there is at least one commit
|
87
|
-
next if
|
85
|
+
next if commits.none? { |commit| commit[:type] == type }
|
88
86
|
|
89
87
|
result += "\n\n"
|
90
88
|
result += "*#{sections[type.to_sym]}*"
|
91
89
|
result += "\n"
|
92
90
|
|
93
|
-
|
94
|
-
if commit[:type]
|
95
|
-
authorName = commit[:authorName]
|
96
|
-
shortHash = commit[:shortHash]
|
97
|
-
hash = commit[:hash]
|
98
|
-
link = "#{commitUrl}/#{hash}"
|
91
|
+
commits.each do |commit|
|
92
|
+
next if commit[:type] != type
|
99
93
|
|
100
|
-
|
94
|
+
author_name = commit[:author_name]
|
95
|
+
short_hash = commit[:short_hash]
|
96
|
+
hash = commit[:hash]
|
97
|
+
link = "#{commit_url}/#{hash}"
|
101
98
|
|
102
|
-
|
103
|
-
result += "- #{authorName}"
|
104
|
-
end
|
99
|
+
result += "- #{commit[:subject]} (<#{link}|#{short_hash}>)"
|
105
100
|
|
106
|
-
|
101
|
+
if params[:display_author]
|
102
|
+
result += "- #{author_name}"
|
107
103
|
end
|
104
|
+
|
105
|
+
result += "\n"
|
108
106
|
end
|
109
107
|
end
|
110
108
|
|
111
|
-
|
112
109
|
result
|
113
110
|
end
|
114
111
|
|
115
|
-
def self.
|
112
|
+
def self.parse_commits(commits)
|
116
113
|
parsed = []
|
117
114
|
# %s|%H|%h|%an|%at
|
118
|
-
|
115
|
+
commits.each do |line|
|
119
116
|
splitted = line.split("|")
|
120
117
|
|
121
|
-
|
118
|
+
subject_splitted = splitted[0].split(":")
|
122
119
|
|
123
|
-
if
|
124
|
-
type =
|
125
|
-
subject =
|
120
|
+
if subject_splitted.length > 1
|
121
|
+
type = subject_splitted[0]
|
122
|
+
subject = subject_splitted[1]
|
126
123
|
else
|
127
124
|
type = 'no_type'
|
128
|
-
subject =
|
125
|
+
subject = subject_splitted[0]
|
129
126
|
end
|
130
127
|
|
131
128
|
commit = {
|
132
|
-
type: type.strip
|
133
|
-
subject: subject.strip
|
129
|
+
type: type.strip,
|
130
|
+
subject: subject.strip,
|
134
131
|
hash: splitted[1],
|
135
|
-
|
136
|
-
|
137
|
-
commitDate: splitted[4]
|
132
|
+
short_hash: splitted[2],
|
133
|
+
author_name: splitted[3],
|
134
|
+
commitDate: splitted[4]
|
138
135
|
}
|
139
136
|
|
140
137
|
parsed.push(commit)
|
@@ -143,7 +140,6 @@ module Fastlane
|
|
143
140
|
parsed
|
144
141
|
end
|
145
142
|
|
146
|
-
|
147
143
|
#####################################################
|
148
144
|
# @!group Documentation
|
149
145
|
#####################################################
|
@@ -195,7 +191,7 @@ module Fastlane
|
|
195
191
|
chore: "Building system",
|
196
192
|
test: "Testing",
|
197
193
|
docs: "Documentation",
|
198
|
-
no_type: "Rest work"
|
194
|
+
no_type: "Rest work"
|
199
195
|
},
|
200
196
|
type: Hash,
|
201
197
|
optional: true
|
@@ -206,14 +202,14 @@ module Fastlane
|
|
206
202
|
default_value: false,
|
207
203
|
type: Boolean,
|
208
204
|
optional: true
|
209
|
-
)
|
205
|
+
)
|
210
206
|
]
|
211
207
|
end
|
212
208
|
|
213
209
|
def self.output
|
214
210
|
# Define the shared values you are going to provide
|
215
211
|
# Example
|
216
|
-
[
|
212
|
+
[]
|
217
213
|
end
|
218
214
|
|
219
215
|
def self.return_value
|
@@ -12,23 +12,24 @@ module Fastlane
|
|
12
12
|
command = "git log --pretty='#{pretty}' --reverse #{start}..HEAD"
|
13
13
|
Actions.sh(command, log: false).chomp
|
14
14
|
end
|
15
|
+
|
15
16
|
def self.semver_gt(first, second)
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
first_major = (first.split('.')[0] || 0).to_i
|
18
|
+
first_minor = (first.split('.')[1] || 0).to_i
|
19
|
+
first_patch = (first.split('.')[2] || 0).to_i
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
second_major = (second.split('.')[0] || 0).to_i
|
22
|
+
second_minor = (second.split('.')[1] || 0).to_i
|
23
|
+
second_patch = (second.split('.')[2] || 0).to_i
|
23
24
|
|
24
25
|
# Check if next version is higher then last version
|
25
|
-
if
|
26
|
+
if first_major > second_major
|
26
27
|
return true
|
27
|
-
elsif
|
28
|
-
if
|
28
|
+
elsif first_major == second_major
|
29
|
+
if first_minor > second_minor
|
29
30
|
return true
|
30
|
-
elsif
|
31
|
-
if
|
31
|
+
elsif first_minor == second_minor
|
32
|
+
if first_patch > second_patch
|
32
33
|
return true
|
33
34
|
end
|
34
35
|
end
|
@@ -36,8 +37,9 @@ module Fastlane
|
|
36
37
|
|
37
38
|
return false
|
38
39
|
end
|
40
|
+
|
39
41
|
def self.semver_lt(first, second)
|
40
|
-
return !semver_gt(first,second)
|
42
|
+
return !semver_gt(first, second)
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-semantic_release
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jiří Otáhal
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|