pronto 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Inline docs](http://inch-ci.org/github/mmozuras/pronto.svg)](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
|