pronto 0.7.1 → 0.8.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -2
- data/LICENSE +1 -1
- data/README.md +31 -21
- data/lib/pronto/bitbucket.rb +3 -1
- data/lib/pronto/cli.rb +1 -1
- data/lib/pronto/config.rb +17 -12
- data/lib/pronto/formatter/git_formatter.rb +1 -1
- data/lib/pronto/formatter/github_status_formatter/status_builder.rb +1 -2
- data/lib/pronto/runner.rb +8 -0
- data/lib/pronto/runners.rb +12 -10
- data/lib/pronto/version.rb +1 -1
- data/pronto.gemspec +1 -1
- metadata +11 -6
- data/lib/pronto/formatter/github_status_formatter/inflector.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5a612afb137e615ee5e2ff77940bef61836f285
|
4
|
+
data.tar.gz: 0028f06bc680ba757b55872dadb633a38dae08e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8232ab1382ee1447884bf1061e58d28f8a62100c59743ac5a6a8264404c94b61966e8478b0b11b2da999eaab21a136233fc44cbc1354d4403dc6301094d88915
|
7
|
+
data.tar.gz: 8a4a1196d482efceedb8c64edced6b56fa8977fe07ce9511cd4cf6374863dd5fdfa2e4f5992d56cc93eeb6a03f669182c67de03418cffbe6774e914a773e62ad
|
data/CHANGELOG.md
CHANGED
@@ -1,14 +1,33 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.8.0
|
4
|
+
|
5
|
+
### New features
|
6
|
+
|
7
|
+
* [#199](https://github.com/mmozuras/pronto/pull/199): add support for Ruby 2.4.0.
|
8
|
+
|
9
|
+
### Changes
|
10
|
+
|
11
|
+
* [#181](https://github.com/mmozuras/pronto/pull/181): add ENV variables for all configuration options.
|
12
|
+
* [#184](https://github.com/mmozuras/pronto/pull/184): prefix all ENV variables with `PRONTO_`.
|
13
|
+
* [#185](https://github.com/mmozuras/pronto/pull/185): allow excluding files to lint for single runner.
|
14
|
+
|
15
|
+
### Bugs fixed
|
16
|
+
|
17
|
+
* [#179](https://github.com/mmozuras/pronto/pull/179): correctly select branch name for fix Bitbucket pull request formatter.
|
18
|
+
* [#187](https://github.com/mmozuras/pronto/pull/187): correctly handle nil/false with consolidate_comments config option.
|
19
|
+
* [#189](https://github.com/mmozuras/pronto/pull/189): do not post anything when all consolidated comments already exist.
|
20
|
+
* [#195](https://github.com/mmozuras/pronto/pull/195): fix warning for default formatters value.
|
21
|
+
|
3
22
|
## 0.7.1
|
4
23
|
|
5
24
|
### Changes
|
6
25
|
|
7
26
|
* Remove support for Ruby 1.9.3.
|
8
27
|
|
9
|
-
|
28
|
+
### Bugs fixed
|
10
29
|
|
11
|
-
* [#149](https://github.com/mmozuras/pronto/issues/149):
|
30
|
+
* [#149](https://github.com/mmozuras/pronto/issues/149): use patches to correctly find line position for GitHub pull request formatter.
|
12
31
|
|
13
32
|
## 0.7.0
|
14
33
|
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
[](http://inch-ci.org/github/mmozuras/pronto)
|
8
8
|
|
9
9
|
**Pronto** runs analysis quickly by checking only the relevant changes. Created to
|
10
|
-
be used on [pull requests](#github-integration), but also works [locally](#local-changes) and integrates with [GitLab](#gitlab-integration) and [Bitbucket](#bitbucket-integration).
|
10
|
+
be used on [GitHub pull requests](#github-integration), but also works [locally](#local-changes) and integrates with [GitLab](#gitlab-integration) and [Bitbucket](#bitbucket-integration).
|
11
11
|
Perfect if want to find out quickly if branch introduces changes that conform
|
12
12
|
to your [styleguide](https://github.com/mmozuras/pronto-rubocop), [are DRY](https://github.com/mmozuras/pronto-flay), [don't introduce security holes](https://github.com/mmozuras/pronto-brakeman) and [more](#runners).
|
13
13
|
|
@@ -74,13 +74,13 @@ Just run `pronto` without any arguments to see what Pronto is capable of.
|
|
74
74
|
|
75
75
|
Available Options
|
76
76
|
|
77
|
-
Command flag
|
78
|
-
|
79
|
-
`--exit-code`
|
80
|
-
`-c/--commit`
|
81
|
-
`-i/--index`
|
82
|
-
`-r/--runner`
|
83
|
-
`-f/--formatters
|
77
|
+
| Command flag | Description |
|
78
|
+
|:------------------|:------------------------------------------------------------|
|
79
|
+
| `--exit-code` | Exits with non-zero code if there were any warnings/errors. |
|
80
|
+
| `-c/--commit` | Commit for the diff. |
|
81
|
+
| `-i/--index` | Analyze changes in git index (staging area). |
|
82
|
+
| `-r/--runner` | Run only the passed runners. |
|
83
|
+
| `-f/--formatters` | Pick output formatters. |
|
84
84
|
|
85
85
|
### GitHub Integration
|
86
86
|
|
@@ -89,32 +89,32 @@ on GitHub commits using `GithubFormatter` or `GithubPullRequestFormatter`.
|
|
89
89
|
|
90
90
|
Add Pronto runners you want to use to your Gemfile:
|
91
91
|
|
92
|
-
Set the
|
92
|
+
Set the PRONTO_GITHUB_ACCESS_TOKEN environment variable or value in `.pronto.yml` to
|
93
93
|
[OAuth token](https://help.github.com/articles/creating-an-access-token-for-command-line-use) that has access to the repository.
|
94
94
|
|
95
95
|
Then just run it:
|
96
96
|
|
97
97
|
```sh
|
98
|
-
$
|
98
|
+
$ PRONTO_GITHUB_ACCESS_TOKEN=token pronto run -f github -c origin/master
|
99
99
|
```
|
100
100
|
|
101
101
|
or, if you want comments to appear on pull request diff, instead of commit:
|
102
102
|
|
103
103
|
```sh
|
104
|
-
$
|
104
|
+
$ PRONTO_GITHUB_ACCESS_TOKEN=token pronto run -f github_pr -c origin/master
|
105
105
|
```
|
106
106
|
|
107
107
|
Use `GithubStatusFormatter` to submit [commit status](https://github.com/blog/1227-commit-status-api):
|
108
108
|
|
109
109
|
```sh
|
110
|
-
$
|
110
|
+
$ PRONTO_GITHUB_ACCESS_TOKEN=token pronto run -f github_status -c origin/master
|
111
111
|
```
|
112
112
|
|
113
113
|
It's possible to combine multiple formatters.
|
114
114
|
To get both pull request comments and commit status summary use:
|
115
115
|
|
116
116
|
```sh
|
117
|
-
$
|
117
|
+
$ PRONTO_GITHUB_ACCESS_TOKEN=token PULL_REQUEST_ID=id pronto run -f github_status github_pr -c origin/master
|
118
118
|
```
|
119
119
|
|
120
120
|
As an alternative, you can also set up a rake task:
|
@@ -135,16 +135,16 @@ on GitLab commits using `GitlabFormatter`.
|
|
135
135
|
|
136
136
|
**note: this requires at least GitLab v7.5.0**
|
137
137
|
|
138
|
-
Set the `
|
138
|
+
Set the `PRONTO_GITLAB_API_ENDPOINT` environment variable or value in `.pronto.yml` to
|
139
139
|
your API endpoint URL. If you are using Gitlab.com's hosted service your
|
140
140
|
endpoint will be `https://gitlab.com/api/v3`.
|
141
|
-
Set the `
|
141
|
+
Set the `PRONTO_GITLAB_API_PRIVATE_TOKEN` environment variable or value in `.pronto.yml
|
142
142
|
to your Gitlab private token which you can find in your account settings.
|
143
143
|
|
144
144
|
Then just run it:
|
145
145
|
|
146
146
|
```sh
|
147
|
-
$
|
147
|
+
$ PRONTO_GITLAB_API_ENDPOINT="https://gitlab.com/api/v3" PRONTO_GITLAB_API_PRIVATE_TOKEN=token pronto run -f gitlab -c origin/master
|
148
148
|
```
|
149
149
|
|
150
150
|
### Bitbucket Integration
|
@@ -154,19 +154,19 @@ on Bitbucket commits using `BitbucketFormatter` or `BitbucketPullRequestFormatte
|
|
154
154
|
|
155
155
|
Add Pronto runners you want to use to your Gemfile:
|
156
156
|
|
157
|
-
Set the
|
157
|
+
Set the PRONTO_BITBUCKET_USERNAME and PRONTO_BITBUCKET_PASSWORD environment variables or values in `.pronto.yml`.
|
158
158
|
.
|
159
159
|
|
160
160
|
Then just run it:
|
161
161
|
|
162
162
|
```sh
|
163
|
-
$
|
163
|
+
$ PRONTO_BITBUCKET_USERNAME=user PRONTO_BITBUCKET_PASSWORD=pass pronto run -f bitbucket -c origin/master
|
164
164
|
```
|
165
165
|
|
166
166
|
or, if you want comments to appear on pull request diff, instead of commit:
|
167
167
|
|
168
168
|
```sh
|
169
|
-
$
|
169
|
+
$ PRONTO_BITBUCKET_USERNAME=user PRONTO_BITBUCKET_PASSWORD=pass pronto run -f bitbucket_pr -c origin/master
|
170
170
|
```
|
171
171
|
|
172
172
|
## Configuration
|
@@ -180,13 +180,17 @@ The file has the following format:
|
|
180
180
|
all:
|
181
181
|
exclude:
|
182
182
|
- 'spec/**/*'
|
183
|
+
# exclude files for single runner
|
184
|
+
eslint:
|
185
|
+
exclude:
|
186
|
+
- 'app/assets/**/*'
|
183
187
|
github:
|
184
188
|
slug: mmozuras/pronto
|
185
189
|
access_token: B26354
|
186
190
|
api_endpoint: https://api.github.com/
|
187
191
|
web_endpoint: https://github.com/
|
188
192
|
gitlab:
|
189
|
-
slug:
|
193
|
+
slug: 1234567 # gitlab's project ID
|
190
194
|
api_private_token: 46751
|
191
195
|
api_endpoint: https://api.vinted.com/gitlab
|
192
196
|
bitbucket:
|
@@ -200,7 +204,7 @@ verbose: false
|
|
200
204
|
|
201
205
|
All properties that can be specified via `.pronto.yml`, can also be specified
|
202
206
|
via environment variables. Their names will be the upcased path to the property.
|
203
|
-
For example: `
|
207
|
+
For example: `PRONTO_GITHUB_SLUG` or `PRONTO_GITLAB_API_PRIVATE_TOKEN`. Environment variables
|
204
208
|
will always take precedence over values in configuration file.
|
205
209
|
|
206
210
|
## Runners
|
@@ -221,14 +225,18 @@ Currently available:
|
|
221
225
|
* [pronto-jshint](https://github.com/mmozuras/pronto-jshint)
|
222
226
|
* [pronto-json](https://github.com/deees/pronto-json)
|
223
227
|
* [pronto-luacheck](https://github.com/seikichi/pronto-luacheck)
|
228
|
+
* [pronto-phpcs](https://github.com/EllisV/pronto-phpcs)
|
229
|
+
* [pronto-phpmd](https://github.com/EllisV/pronto-phpmd)
|
224
230
|
* [pronto-poper](https://github.com/mmozuras/pronto-poper)
|
225
231
|
* [pronto-rails_best_practices](https://github.com/mmozuras/pronto-rails_best_practices)
|
226
232
|
* [pronto-rails_schema](https://github.com/raimondasv/pronto-rails_schema)
|
227
233
|
* [pronto-reek](https://github.com/mmozuras/pronto-reek)
|
228
234
|
* [pronto-rubocop](https://github.com/mmozuras/pronto-rubocop)
|
229
235
|
* [pronto-scss](https://github.com/mmozuras/pronto-scss)
|
236
|
+
* [pronto-shellcheck](https://github.com/pclalv/pronto-shellcheck)
|
230
237
|
* [pronto-slim](https://github.com/nysthee/pronto-slim)
|
231
238
|
* [pronto-spell](https://github.com/mmozuras/pronto-spell)
|
239
|
+
* [pronto-stylelint](https://github.com/kevinjalbert/pronto-stylelint)
|
232
240
|
* [pronto-swiftlint](https://github.com/ajanauskas/pronto-swiftlint)
|
233
241
|
* [pronto-tailor](https://github.com/ajanauskas/pronto-tailor)
|
234
242
|
|
@@ -242,6 +250,8 @@ Articles to help you to get started:
|
|
242
250
|
* [Pronto and git hooks](http://elliotthilaire.net/gem-pronto-and-git-hooks/)
|
243
251
|
* [How to end fruitless dev discussions about your project’s code style?](https://medium.com/appaloosa-store-engineering/how-to-end-fruitless-dev-discussions-about-your-project-s-code-style-245070bff6d4)
|
244
252
|
* [Free automated code reviews using Pronto](https://hovancik.net/blog/2016/04/11/free-automated-code-reviews-using-pronto.html)
|
253
|
+
* [Automated Elixir code review with Github, Credo and Travis CI](https://medium.com/fazibear/automated-elixir-code-review-with-github-credo-and-travis-ci-986cd56b8f02)
|
254
|
+
* [Running Rubocop before git commit](https://christoph.luppri.ch/articles/2016/11/21/running-rubocop-before-git-commit/)
|
245
255
|
|
246
256
|
Make a Pull Request to add something you wrote or found useful.
|
247
257
|
|
data/lib/pronto/bitbucket.rb
CHANGED
@@ -65,7 +65,9 @@ module Pronto
|
|
65
65
|
@pull ||= if env_pull_id
|
66
66
|
pull_requests.find { |pr| pr.id.to_i == env_pull_id.to_i }
|
67
67
|
elsif @repo.branch
|
68
|
-
pull_requests.find
|
68
|
+
pull_requests.find do |pr|
|
69
|
+
pr.source['branch']['name'] == @repo.branch
|
70
|
+
end
|
69
71
|
end
|
70
72
|
end
|
71
73
|
|
data/lib/pronto/cli.rb
CHANGED
data/lib/pronto/config.rb
CHANGED
@@ -7,16 +7,26 @@ module Pronto
|
|
7
7
|
%w(github gitlab bitbucket).each do |service|
|
8
8
|
ConfigFile::EMPTY[service].each do |key, _|
|
9
9
|
name = "#{service}_#{key}"
|
10
|
-
define_method(name) { ENV[name.upcase] || @config_hash[service][key] }
|
10
|
+
define_method(name) { ENV["PRONTO_#{name.upcase}"] || @config_hash[service][key] }
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
def consolidate_comments?
|
15
|
-
|
15
|
+
consolidated =
|
16
|
+
ENV['PRONTO_CONSOLIDATE_COMMENTS'] ||
|
17
|
+
@config_hash.fetch('consolidate_comments', false)
|
18
|
+
consolidated
|
16
19
|
end
|
17
20
|
|
18
|
-
def excluded_files
|
19
|
-
|
21
|
+
def excluded_files(runner)
|
22
|
+
files =
|
23
|
+
if runner == 'all'
|
24
|
+
ENV['PRONTO_EXCLUDE'] || @config_hash['all']['exclude']
|
25
|
+
else
|
26
|
+
@config_hash.fetch(runner, {})['exclude']
|
27
|
+
end
|
28
|
+
|
29
|
+
Array(files)
|
20
30
|
.flat_map { |path| Dir[path.to_s] }
|
21
31
|
.map { |path| File.expand_path(path) }
|
22
32
|
end
|
@@ -30,19 +40,14 @@ module Pronto
|
|
30
40
|
end
|
31
41
|
|
32
42
|
def max_warnings
|
33
|
-
@config_hash['max_warnings']
|
43
|
+
ENV['PRONTO_MAX_WARNINGS'] || @config_hash['max_warnings']
|
34
44
|
end
|
35
45
|
|
36
46
|
def logger
|
37
47
|
@logger ||= begin
|
38
|
-
@config_hash['verbose']
|
48
|
+
verbose = ENV['PRONTO_VERBOSE'] || @config_hash['verbose']
|
49
|
+
verbose ? Logger.new($stdout) : Logger.silent
|
39
50
|
end
|
40
51
|
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def exclude
|
45
|
-
@config_hash['all']['exclude']
|
46
|
-
end
|
47
52
|
end
|
48
53
|
end
|
@@ -83,7 +83,7 @@ module Pronto
|
|
83
83
|
existing = old_comments[key]
|
84
84
|
comments = dedupe_comments(existing, comments) if existing
|
85
85
|
|
86
|
-
if config.consolidate_comments?
|
86
|
+
if config.consolidate_comments? && !comments.empty?
|
87
87
|
comment = consolidate_comments(comments)
|
88
88
|
memo.push(comment)
|
89
89
|
else
|
data/lib/pronto/runner.rb
CHANGED
@@ -11,6 +11,14 @@ module Pronto
|
|
11
11
|
repository
|
12
12
|
end
|
13
13
|
|
14
|
+
def self.title
|
15
|
+
@runner_name ||= begin
|
16
|
+
source_path, _line = instance_method(:run).source_location
|
17
|
+
file_name, _extension = File.basename(source_path).split('.')
|
18
|
+
file_name
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
14
22
|
def ruby_patches
|
15
23
|
return [] unless @patches
|
16
24
|
|
data/lib/pronto/runners.rb
CHANGED
@@ -6,14 +6,18 @@ module Pronto
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def run(patches)
|
9
|
-
patches = reject_excluded(patches)
|
10
|
-
return []
|
9
|
+
patches = reject_excluded(@config.excluded_files('all'), patches)
|
10
|
+
return [] if patches.none?
|
11
11
|
|
12
12
|
result = []
|
13
13
|
@runners.each do |runner|
|
14
14
|
next if exceeds_max?(result)
|
15
15
|
@config.logger.log("Running #{runner}")
|
16
|
-
|
16
|
+
runner_patches = reject_excluded(
|
17
|
+
@config.excluded_files(runner.title), patches
|
18
|
+
)
|
19
|
+
next if runner_patches.none?
|
20
|
+
result += runner.new(runner_patches, patches.commit).run.flatten.compact
|
17
21
|
end
|
18
22
|
result = result.take(@config.max_warnings) if @config.max_warnings
|
19
23
|
result
|
@@ -21,14 +25,12 @@ module Pronto
|
|
21
25
|
|
22
26
|
private
|
23
27
|
|
24
|
-
def reject_excluded(patches)
|
25
|
-
return patches unless
|
26
|
-
patches.reject! { |patch| excluded?(patch) }
|
27
|
-
patches
|
28
|
-
end
|
28
|
+
def reject_excluded(excluded_files, patches)
|
29
|
+
return patches unless excluded_files.any?
|
29
30
|
|
30
|
-
|
31
|
-
|
31
|
+
patches.reject do |patch|
|
32
|
+
excluded_files.include?(patch.new_file_full_path.to_s)
|
33
|
+
end
|
32
34
|
end
|
33
35
|
|
34
36
|
def exceeds_max?(warnings)
|
data/lib/pronto/version.rb
CHANGED
data/pronto.gemspec
CHANGED
@@ -44,7 +44,7 @@ Gem::Specification.new do |s|
|
|
44
44
|
s.add_runtime_dependency('thor', '~> 0.19.0')
|
45
45
|
s.add_runtime_dependency('octokit', '~> 4.3', '>= 4.1.0')
|
46
46
|
s.add_runtime_dependency('gitlab', '~> 3.6', '>= 3.4.0')
|
47
|
-
s.add_runtime_dependency('httparty', '
|
47
|
+
s.add_runtime_dependency('httparty', '>= 0.13.7', '< 0.15')
|
48
48
|
s.add_runtime_dependency('rainbow', '~> 2.1')
|
49
49
|
s.add_development_dependency('rake', '~> 11.0')
|
50
50
|
s.add_development_dependency('rspec', '~> 3.4')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pronto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mindaugas Mozūras
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rugged
|
@@ -88,16 +88,22 @@ dependencies:
|
|
88
88
|
name: httparty
|
89
89
|
requirement: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
|
-
- - "
|
91
|
+
- - ">="
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: 0.13.7
|
94
|
+
- - "<"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.15'
|
94
97
|
type: :runtime
|
95
98
|
prerelease: false
|
96
99
|
version_requirements: !ruby/object:Gem::Requirement
|
97
100
|
requirements:
|
98
|
-
- - "
|
101
|
+
- - ">="
|
99
102
|
- !ruby/object:Gem::Version
|
100
103
|
version: 0.13.7
|
104
|
+
- - "<"
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0.15'
|
101
107
|
- !ruby/object:Gem::Dependency
|
102
108
|
name: rainbow
|
103
109
|
requirement: !ruby/object:Gem::Requirement
|
@@ -259,7 +265,6 @@ files:
|
|
259
265
|
- lib/pronto/formatter/github_formatter.rb
|
260
266
|
- lib/pronto/formatter/github_pull_request_formatter.rb
|
261
267
|
- lib/pronto/formatter/github_status_formatter.rb
|
262
|
-
- lib/pronto/formatter/github_status_formatter/inflector.rb
|
263
268
|
- lib/pronto/formatter/github_status_formatter/sentence.rb
|
264
269
|
- lib/pronto/formatter/github_status_formatter/status_builder.rb
|
265
270
|
- lib/pronto/formatter/gitlab_formatter.rb
|
@@ -303,7 +308,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
303
308
|
version: '0'
|
304
309
|
requirements: []
|
305
310
|
rubyforge_project:
|
306
|
-
rubygems_version: 2.
|
311
|
+
rubygems_version: 2.6.10
|
307
312
|
signing_key:
|
308
313
|
specification_version: 4
|
309
314
|
summary: Pronto runs analysis by checking only the introduced changes
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Pronto
|
2
|
-
module Formatter
|
3
|
-
class GithubStatusFormatter
|
4
|
-
class Inflector
|
5
|
-
def self.underscore(camel_cased_word)
|
6
|
-
return camel_cased_word unless camel_cased_word =~ /[A-Z-]|::/
|
7
|
-
word = camel_cased_word.to_s.gsub(/::/, '/')
|
8
|
-
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
9
|
-
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
10
|
-
word.tr!('-', '_')
|
11
|
-
word.downcase!
|
12
|
-
word
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|