ruby_git 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7087b8dd63c3607ba8feab849f53758dab7bd5e9f651d2abde5c0883a0d9540e
4
- data.tar.gz: 7955f33dea5ed42578726c5089d3246322618eeee85a6713c1121fe92f0ef2b5
3
+ metadata.gz: 88ac1dcb3abb6fc749755848f777ebd367e76ef9ae737ef4f778890afd8ff096
4
+ data.tar.gz: ba110f2ac31a96989e6e486a2377f76b080ea03533d304448848bf351ef96988
5
5
  SHA512:
6
- metadata.gz: a52889cbf50620fd7edf6b47ad903554e2ae075d6f822d659640c91db33943110a4795e28f1bc40e57474fad71817adc0a78e3081d718df740d03702cabcd29c
7
- data.tar.gz: db553459c9cea1e038088eb7d9298ee4bd873d6c5e315f937adbdc487981b27a18cf6445aa5228d6bada9d5e70785fc682725ca8697d44335004a5feaf524285
6
+ metadata.gz: f4f1d53fd8cc7c4939e7ccf797e39702a6541159c06673fc5ec8e723629008020d8a0371f0365b0c255bc9eb0af83ed8d6b6dc9dd7f52d3f53d1286c2253be59
7
+ data.tar.gz: 6a11a5211e5554fec26034351e1a7c531ce25d87e9b9c3d3ab53aac3b9569ed997135dfb879c1e3d3a3a80653811ee64082ed4e18baa8a1b300f58ea0d7d1e97
data/.gitignore CHANGED
@@ -14,3 +14,5 @@
14
14
  rubocop-report.json
15
15
 
16
16
  /Gemfile.lock
17
+ .idea
18
+ .irb_history
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper.rb
2
+ --color
3
+ --format documentation
data/.yardopts CHANGED
@@ -2,3 +2,4 @@
2
2
  --hide-void-return
3
3
  --markup-provider=redcarpet
4
4
  --markup markdown
5
+ - CHANGELOG.md CONTRIBUTING.md MAINTAINERS.md RELEASING.md LICENSE.md
@@ -1,9 +1,30 @@
1
1
  # Change Log
2
2
 
3
- ## 0.1.1
3
+ ## [v0.1.2](https://github.com/jcouball/ruby_git/releases/tag/v0.1.2) (2020-09-24)
4
4
 
5
- See https://github.com/jcouball/ruby_git/releases/tag/v0.1.1
5
+ [Full Changelog](https://github.com/jcouball/ruby_git/compare/v0.1.1...v0.1.2)
6
6
 
7
- ## 0.1.0
7
+ **Merged pull requests:**
8
8
 
9
- See https://github.com/jcouball/ruby_git/releases/tag/v0.1.0
9
+ - Update instructions for creating releases and updating the changelog [\#8](https://github.com/jcouball/ruby_git/pull/8) ([jcouball](https://github.com/jcouball))
10
+ - Changes requested in documentation review [\#7](https://github.com/jcouball/ruby_git/pull/7) ([jcouball](https://github.com/jcouball))
11
+ - Set and retrieve the path to the git binary used by this library [\#6](https://github.com/jcouball/ruby_git/pull/6) ([jcouball](https://github.com/jcouball))
12
+ - Move RSpec config from Rakefile to .rspec [\#5](https://github.com/jcouball/ruby_git/pull/5) ([jcouball](https://github.com/jcouball))
13
+ - Release v0.1.1 [\#4](https://github.com/jcouball/ruby_git/pull/4) ([jcouball](https://github.com/jcouball))
14
+
15
+ ## [v0.1.1](https://github.com/jcouball/ruby_git/releases/tag/v0.1.1) (2020-09-18)
16
+
17
+ [Full Changelog](https://github.com/jcouball/ruby_git/compare/v0.1.0...v0.1.1)
18
+
19
+ **Merged pull requests:**
20
+
21
+ - Add notice saying that this project is a work in progress [\#3](https://github.com/jcouball/ruby_git/pull/3) ([jcouball](https://github.com/jcouball))
22
+ - Remove Gemfile.lock and add it to .gitignore [\#2](https://github.com/jcouball/ruby_git/pull/2) ([jcouball](https://github.com/jcouball))
23
+
24
+ ## [v0.1.0](https://github.com/jcouball/ruby_git/releases/tag/v0.1.0) (2020-09-18)
25
+
26
+ [Full Changelog](https://github.com/jcouball/ruby_git/compare/04b4b2bc59b0b09ad45a69572450cb393dbe79a1...v0.1.0)
27
+
28
+
29
+
30
+ \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
@@ -59,7 +59,7 @@ request meets [the project's coding standards](#coding-standards).
59
59
 
60
60
  ## Coding standards
61
61
 
62
- In order to ensure high quality, all pull requests must meet these requirements:
62
+ All pull requests must meet these requirements:
63
63
 
64
64
  ### 1 PR = 1 Commit
65
65
  * All commits for a PR must be squashed into one commit
@@ -76,14 +76,21 @@ In order to ensure high quality, all pull requests must meet these requirements:
76
76
  ### Documentation
77
77
  * New and updated public methods must have [YARD](https://yardoc.org/)
78
78
  documentation added to them
79
+ * [The YARD Cheatsheet](https://gist.github.com/thelastinuit/5984665e6ab69d3c0a413a03602c45be)
80
+ is a good reference
79
81
  * New and updated public facing features should be documented in the project's
80
82
  [README.md](README.md)
81
- * All documentation must pass `yardstick` documentation analysis.
83
+ * All documentation must pass `yardstick` documentation analysis
82
84
  * The documentation suite must maintain 100% documentation to pass
83
85
 
84
86
  ### Continuous Integration
85
87
  * All tests must pass in the project's [Travis CI](https://travis-ci.org/jcouball/ruby_git)
86
- build before the pull request will be merged
88
+ build before the pull request will be merged.
89
+ * You can simulate what happens in the Travis CI build by running `bundle exec rake` in
90
+ the projects root directory.
91
+
92
+ ### Other Design Guidelines
93
+ * Use keyword args with defaults instead of an opts hash
87
94
 
88
95
  ## Licensing
89
96
 
@@ -0,0 +1,8 @@
1
+ # Maintainers
2
+
3
+ When making changes in this repository, one of the maintainers below must review
4
+ and approve your pull request.
5
+
6
+ ### Maintainers
7
+
8
+ * [James Couball](https://github.com/jcouball)
data/README.md CHANGED
@@ -1,12 +1,14 @@
1
- # Ruby Git
1
+ # RubyGit
2
2
 
3
3
  **THIS PROJECT IS A WORK IN PROGRESS AND IS NOT USEFUL IN ITS CURRENT STATE**
4
4
 
5
5
  [![Build Status](https://travis-ci.org/jcouball/ruby_git.svg?branch=main)](https://travis-ci.org/jcouball/ruby_git)
6
6
  [![Maintainability](https://api.codeclimate.com/v1/badges/2d8d52a55d655b6a3def/maintainability)](https://codeclimate.com/github/jcouball/ruby_git/maintainability)
7
7
 
8
- Ruby Git is an object-oriented wrapper for the `git` command line tool for working with Worktrees
9
- and Repositories. It tries to make more sense out of the Git command line.
8
+ RubyGit is an object-oriented wrapper for the `git` command line tool for working with Worktrees
9
+ and Repositories. It tries to make more sense out of the Git command line. See the object model
10
+ in [this Lucid chart diagram](https://app.lucidchart.com/invitations/accept/7df13bab-3383-4683-8cb4-e76d539de93d)
11
+ (requires sign in).
10
12
 
11
13
  ## Installation
12
14
 
@@ -26,6 +28,16 @@ Or install it directly from the command line:
26
28
 
27
29
  ## Usage
28
30
 
31
+ To configure RubyGit:
32
+
33
+ ```Ruby
34
+ RubyGit.git.path = '/usr/local/bin/git'
35
+
36
+ # Returns the user set path or searches for 'git' in ENV['PATH']
37
+ RubyGit.git.path #=> '/usr/local/bin/git'
38
+ RubyGit.git.version #=> [2,28,0]
39
+ ```
40
+
29
41
  To work with an existing Worktree:
30
42
 
31
43
  ```Ruby
@@ -56,14 +68,11 @@ The full API is documented in [the RubyGit YARD documentation](https://github.co
56
68
 
57
69
  ## Development
58
70
 
59
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec`
60
- to run the tests. You can also run `bin/console` for an interactive prompt that will allow
61
- you to experiment.
71
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run
72
+ `bundle exec rake` to run tests, static analysis, and build the gem.
62
73
 
63
- To install this gem onto your local machine, run `bundle exec rake install`. To release a
64
- new version, update the version number in `version.rb`, and then run
65
- `bundle exec rake release`, which will create a git tag for the version, push git commits
66
- and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
74
+ For experimentation, you can also run `bin/console` for an interactive (IRB) prompt that
75
+ automatically requires ruby_git.
67
76
 
68
77
  ## Contributing
69
78
 
@@ -10,18 +10,26 @@ and the new release version to be created is `1.1.0.pre1`.
10
10
 
11
11
  ## Prepare the release
12
12
 
13
- From a fork of ruby_git, create a PR containing changes to (1) bump the
14
- version number, (2) update the CHANGELOG.md, and (3) tag the release.
15
-
16
- * Bump the version number in lib/ruby_git/version.rb following [Semantic Versioning](https://semver.org)
17
- guidelines
18
- * Add a link in CHANGELOG.md to the release tag which will be created later
19
- in this guide
20
- * Create a new tag using [git-extras](https://github.com/tj/git-extras/blob/main/Commands.md#git-release)
21
- `git release` command
22
- * For example: `git release v1.1.0.pre1`
23
- * These should be the only changes in the PR
24
- * Get the PR reviewed, approved and merged to main.
13
+ On a branch (or fork) of ruby_git, create a PR containing changes to (1) bump the
14
+ version number and (2) update the CHANGELOG.md, and (3) tag the release.
15
+
16
+ * Bump the version number
17
+ * Version number is in lib/ruby_git/version.rb
18
+ * Follow [Semantic Versioning](https://semver.org) guidelines
19
+ * `bundle exec bump --no-commit patch` # backwards compatible bug fixes
20
+ * `bundle exec bump --no-commit minor` # backwards compatible new functionality
21
+ * `bundle exec bump --no-commit major` # incompatible API changes
22
+
23
+ * Update CHANGELOG.md
24
+ * `bundle exec rake changelog`
25
+
26
+ * Stage the changes to be committed
27
+ * `git add lib/ruby_git/version.rb CHANGELOG.md`
28
+
29
+ * Commit, tag, and push changes to the repository
30
+ * ```git release `ruby -I lib -r ruby_git -e 'puts RubyGit::VERSION'` ```
31
+
32
+ * Create a PR with these changes, have it reviewed and approved, and merged to main.
25
33
 
26
34
  ## Create a GitHub release
27
35
 
@@ -30,14 +38,8 @@ select `Draft a new release`
30
38
 
31
39
  * Select the tag corresponding to the version being released `v1.1.0.pre1`
32
40
  * The Target should be `main`
33
- * For the release description, use the output of [changelog-rs](https://github.com/perlun/changelog-rs)
34
- * Since the release has not been created yet, you will need to supply
35
- `changeling-rs` with the current release tag and the tag the new release
36
- is being created from
37
- * For example: `changelog-rs . v1.0.0 v1.1.0.pre1`
38
- * Copy the output, omitting the tag header `## v1.1.0.pre1` and paste into
39
- the release description
40
- * The release description can be edited later if needed
41
+ * For the release description, copy the relevant section from the CHANGELOG.md
42
+ * The release description can be edited later.
41
43
  * Select the appropriate value for `This is a pre-release`
42
44
  * Since `v1.1.0.pre1` is a pre-release, check `This is a pre-release`
43
45
 
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- task default: %i[spec bundle:audit rubocop yardstick verify_measurements yard build]
3
+ task default: %i[spec bundle:audit rubocop yardstick:audit yardstick:coverage yard build]
4
4
 
5
5
  # Bundler Audit
6
6
 
@@ -20,13 +20,7 @@ require 'bump/tasks'
20
20
 
21
21
  require 'rspec/core/rake_task'
22
22
 
23
- RSpec::Core::RakeTask.new do |t|
24
- t.rspec_opts = %w[
25
- --require spec_helper.rb
26
- --color
27
- --format documentation
28
- ]
29
- end
23
+ RSpec::Core::RakeTask.new
30
24
 
31
25
  CLEAN << 'coverage'
32
26
  CLEAN << '.rspec_status'
@@ -55,14 +49,30 @@ end
55
49
  CLEAN << '.yardoc'
56
50
  CLEAN << 'doc'
57
51
 
58
- # yardstick
52
+ # Yardstick
53
+
54
+ desc 'Run yardstick to show missing YARD doc elements'
55
+ task :'yardstick:audit' do
56
+ sh "yardstick 'lib/**/*.rb'"
57
+ end
58
+
59
+ # Yardstick coverage
59
60
 
60
61
  require 'yardstick/rake/verify'
61
- Yardstick::Rake::Verify.new do |verify|
62
+
63
+ Yardstick::Rake::Verify.new(:'yardstick:coverage') do |verify|
62
64
  verify.threshold = 100
63
65
  end
64
66
 
65
- desc 'Run yardstick to check yard docs'
66
- task :yardstick do
67
- sh "yardstick 'lib/**/*.rb'"
67
+ # Changelog
68
+
69
+ require 'github_changelog_generator/task'
70
+
71
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
72
+ config.header = '# Change Log'
73
+ config.user = 'jcouball'
74
+ config.project = 'ruby_git'
75
+ config.future_release = "v#{RubyGit::VERSION}"
76
+ config.release_url = 'https://github.com/jcouball/ruby_git/releases/tag/%s'
77
+ config.author = true
68
78
  end
@@ -1,7 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'ruby_git/version'
4
+ require 'ruby_git/file_helpers'
5
+ require 'ruby_git/git_binary'
4
6
 
7
+ # RubyGit is an object-oriented wrapper for the `git` command line tool for
8
+ # working with Worktrees and Repositories. It tries to make more sense out
9
+ # of the Git command line.
10
+ #
11
+ # @api public
12
+ #
5
13
  module RubyGit
6
- class Error < StandardError; end
14
+ # Return information about the git binary used by this library
15
+ #
16
+ # Use this object to set the path to the git binary to use or to see the
17
+ # path being used.
18
+ #
19
+ # @example Setting the git binary path
20
+ # RubyGit.git.path = '/usr/local/bin/git'
21
+ #
22
+ # @return [RubyGit::GitBinary]
23
+ #
24
+ def self.git
25
+ (@git ||= RubyGit::GitBinary.new)
26
+ end
7
27
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyGit
4
+ # A namespace for several file utility methods that I wish were part of FileUtils.
5
+ #
6
+ # @api public
7
+ #
8
+ module FileHelpers
9
+ # Cross platform way to find an executable file within a list of paths
10
+ #
11
+ # Works for both Linux/Unix and Windows.
12
+ #
13
+ # @example Searching over the PATH for a command
14
+ # path = FileUtils.which('git')
15
+ #
16
+ # @example Overriding the default PATH
17
+ # path = FileUtils.which('git', ['/usr/bin', '/usr/local/bin'])
18
+ #
19
+ # @param [String] cmd The basename of the executable file to search for
20
+ # @param [Array<String>] paths The list of directories to search for basename in
21
+ # @param [Array<String>] exts The list of extensions that indicate that a file is executable
22
+ #
23
+ # `exts` is for Windows. Other platforms should accept the default.
24
+ #
25
+ # @return [Pathname,nil] The path to the first executable file found on the path or
26
+ # nil an executable file was not found.
27
+ #
28
+ def self.which(
29
+ cmd,
30
+ paths: ENV['PATH'].split(File::PATH_SEPARATOR),
31
+ exts: (ENV['PATHEXT']&.split(';') || [''])
32
+ )
33
+ raise 'PATH is not set' unless ENV.keys.include?('PATH')
34
+
35
+ paths
36
+ .product(exts)
37
+ .map { |path, ext| Pathname.new(File.join(path, "#{cmd}#{ext}")) }
38
+ .reject { |path| path.directory? || !path.executable? }
39
+ .find { |exe_path| !exe_path.directory? && exe_path.executable? }
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyGit
4
+ # Sets and tracks the path to a git executable and reports the version
5
+ #
6
+ # @api public
7
+ #
8
+ class GitBinary
9
+ # Return a new GitBinary object
10
+ #
11
+ # @example
12
+ # GitBinary.new
13
+ #
14
+ def initialize
15
+ @path = nil
16
+ end
17
+
18
+ # Sets the path to the git binary
19
+ #
20
+ # The given path must point to an executable file or a RuntimeError is raised.
21
+ #
22
+ # @example Setting the path to the git binary
23
+ # git.path = '/usr/local/bin/git'
24
+ #
25
+ # @param [String] path the path to a git executable
26
+ #
27
+ # @return [Pathname]
28
+ #
29
+ # @raise [RuntimeError] A RuntimeError is raised when the path does not refer
30
+ # to an existing executable file.
31
+ #
32
+ def path=(path)
33
+ new_path = Pathname.new(path)
34
+ raise "'#{new_path}' does not exist." unless new_path.exist?
35
+ raise "'#{new_path}' is not a file." unless new_path.file?
36
+ raise "'#{new_path}' is not executable." unless new_path.executable?
37
+
38
+ @path = new_path
39
+ end
40
+
41
+ # Retrieve the path to the git binary
42
+ #
43
+ # @example Get the git found on the PATH
44
+ # git = RubyGit::GitBinary.new
45
+ # path = git.path
46
+ #
47
+ # @return [Pathname] the path to the git binary
48
+ #
49
+ # @raise [RuntimeError] if path was not set via `path=` and either PATH is not set
50
+ # or git was not found on the path.
51
+ #
52
+ def path
53
+ @path || (@path = self.class.default_path)
54
+ end
55
+
56
+ # Get the default path to to a git binary by searching the PATH
57
+ #
58
+ # @example Find the pathname to `super_git`
59
+ # git = RubyGit::GitBinary.new
60
+ # git.path = git.default_path(basename: 'super_git')
61
+ #
62
+ # @param [String] basename The basename of the git command
63
+ #
64
+ # @return [Pathname] the path to the git binary found in the path
65
+ #
66
+ # @raise [RuntimeError] if either PATH is not set or an executable file
67
+ # `basename` was not found on the path.
68
+ #
69
+ def self.default_path(basename: 'git')
70
+ RubyGit::FileHelpers.which(basename) || raise("Could not find '#{basename}' in the PATH.")
71
+ end
72
+
73
+ # The version of git referred to by the path
74
+ #
75
+ # @example for version 2.28.0
76
+ # git = RubyGit::GitBinary.new
77
+ # puts git.version #=> [2,28,0]
78
+ #
79
+ # @return [Array<Integer>] an array of integers representing the version.
80
+ #
81
+ # @raise [RuntimeError] if path was not set via `path=` and either PATH is not set
82
+ # or git was not found on the path.
83
+ #
84
+ def version
85
+ output = `#{path} --version`
86
+ version = output[/\d+\.\d+(\.\d+)+/]
87
+ version.split('.').collect(&:to_i)
88
+ end
89
+ end
90
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyGit
4
- VERSION = '0.1.1'
4
+ # The ruby_git gem version
5
+ #
6
+ VERSION = '0.1.2'
5
7
  end
@@ -18,7 +18,12 @@ Gem::Specification.new do |spec|
18
18
  DESCRIPTION
19
19
  spec.homepage = 'https://github.com/pages/jcouball/ruby_git/'
20
20
  spec.required_ruby_version = Gem::Requirement.new('>= 2.6.0')
21
- spec.requirements = ['git 2.18.0 or later']
21
+ spec.requirements = [
22
+ 'Git 2.18.0 or later',
23
+ 'Ruby 2.6 or later',
24
+ 'Only MRI Ruby and JRuby are officially supported.',
25
+ 'Mac, Linux, Unix, and Windows platforms are supported'
26
+ ]
22
27
 
23
28
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
24
29
 
@@ -37,6 +42,7 @@ Gem::Specification.new do |spec|
37
42
 
38
43
  spec.add_development_dependency 'bump', '~> 0.9'
39
44
  spec.add_development_dependency 'bundler-audit', '~> 0.7'
45
+ spec.add_development_dependency 'github_changelog_generator', '~> 1.15'
40
46
  spec.add_development_dependency 'rake', '~> 13.0'
41
47
  spec.add_development_dependency 'redcarpet', '~> 3.5'
42
48
  spec.add_development_dependency 'rspec', '~> 3.9'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_git
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Couball
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-18 00:00:00.000000000 Z
11
+ date: 2020-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bump
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: github_changelog_generator
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.15'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.15'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -148,6 +162,7 @@ extensions: []
148
162
  extra_rdoc_files: []
149
163
  files:
150
164
  - ".gitignore"
165
+ - ".rspec"
151
166
  - ".rubocop.yml"
152
167
  - ".travis.yml"
153
168
  - ".yardopts"
@@ -156,6 +171,7 @@ files:
156
171
  - Gemfile
157
172
  - ISSUE_TEMPLATE.md
158
173
  - LICENSE.md
174
+ - MAINTAINERS.md
159
175
  - PULL_REQUEST_TEMPLATE.md
160
176
  - README.md
161
177
  - RELEASING.md
@@ -163,6 +179,8 @@ files:
163
179
  - bin/console
164
180
  - bin/setup
165
181
  - lib/ruby_git.rb
182
+ - lib/ruby_git/file_helpers.rb
183
+ - lib/ruby_git/git_binary.rb
166
184
  - lib/ruby_git/version.rb
167
185
  - pre-commit
168
186
  - ruby_git.gemspec
@@ -189,7 +207,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
207
  - !ruby/object:Gem::Version
190
208
  version: '0'
191
209
  requirements:
192
- - git 2.18.0 or later
210
+ - Git 2.18.0 or later
211
+ - Ruby 2.6 or later
212
+ - Only MRI Ruby and JRuby are officially supported.
213
+ - Mac, Linux, Unix, and Windows platforms are supported
193
214
  rubygems_version: 3.1.2
194
215
  signing_key:
195
216
  specification_version: 4