phraseapp_updater 2.1.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.circleci/config.yml DELETED
@@ -1,98 +0,0 @@
1
- version: 2.1
2
-
3
- executors:
4
- ruby:
5
- parameters:
6
- ruby-version:
7
- type: string
8
- default: "2.6"
9
- gemfile:
10
- type: string
11
- default: "Gemfile"
12
- docker:
13
- - image: circleci/ruby:<< parameters.ruby-version >>
14
- environment:
15
- BUNDLE_JOBS: 3
16
- BUNDLE_RETRY: 3
17
- BUNDLE_PATH: vendor/bundle
18
- RAILS_ENV: test
19
- BUNDLE_GEMFILE: << parameters.gemfile >>
20
-
21
- jobs:
22
- test:
23
- parameters:
24
- ruby-version:
25
- type: string
26
- executor:
27
- name: ruby
28
- ruby-version: << parameters.ruby-version >>
29
- parallelism: 1
30
- steps:
31
- - checkout
32
-
33
- - run:
34
- # Remove the non-appraisal gemfile for safety: we never want to use it.
35
- name: Prepare bundler
36
- command: bundle -v
37
-
38
- - run:
39
- name: Compute a gemfile lock
40
- command: bundle lock && cp "${BUNDLE_GEMFILE}.lock" /tmp/gem-lock
41
-
42
- - restore_cache:
43
- keys:
44
- - phraseapp_updater-v2-<< parameters.ruby-version >>-{{ checksum "/tmp/gem-lock" }}
45
- - phraseapp_updater-v2
46
-
47
- - run:
48
- name: Bundle Install
49
- command: bundle check || bundle install
50
-
51
- - save_cache:
52
- key: phraseapp_updater-v2-<< parameters.ruby-version >>-{{ checksum "/tmp/gem-lock" }}
53
- paths:
54
- - vendor/bundle
55
-
56
- - run:
57
- name: Run rspec
58
- command: bundle exec rspec --profile 10 --format RspecJunitFormatter --out test_results/rspec.xml --format progress
59
-
60
- - store_test_results:
61
- path: test_results
62
-
63
- publish:
64
- executor: ruby
65
- steps:
66
- - checkout
67
- - run:
68
- name: Setup Rubygems
69
- command: |
70
- mkdir ~/.gem &&
71
- echo -e "---\r\n:rubygems_api_key: $RUBYGEMS_API_KEY" > ~/.gem/credentials &&
72
- chmod 0600 ~/.gem/credentials
73
- - run:
74
- name: Publish to Rubygems
75
- command: |
76
- gem build phraseapp_updater.gemspec
77
- gem push phraseapp_updater-*.gem
78
-
79
-
80
- workflows:
81
- version: 2.1
82
- build:
83
- jobs:
84
- - test:
85
- name: 'ruby 2.5'
86
- ruby-version: "2.5"
87
- - test:
88
- name: 'ruby 2.6'
89
- ruby-version: "2.6"
90
- - publish:
91
- requires:
92
- - 'ruby 2.5'
93
- - 'ruby 2.6'
94
- filters:
95
- branches:
96
- only: master
97
- tags:
98
- ignore: /.*/
data/.envrc DELETED
@@ -1 +0,0 @@
1
- eval "$(lorri direnv)"
data/.gitignore DELETED
@@ -1,9 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --format documentation
2
- --color
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.3.3
5
- before_install: gem install bundler -v 1.12.5
@@ -1,50 +0,0 @@
1
- # Contributor Code of Conduct
2
-
3
- As contributors and maintainers of this project, and in the interest of
4
- fostering an open and welcoming community, we pledge to respect all people who
5
- contribute through reporting issues, posting feature requests, updating
6
- documentation, submitting pull requests or patches, and other activities.
7
-
8
- We are committed to making participation in this project a harassment-free
9
- experience for everyone, regardless of level of experience, gender, gender
10
- identity and expression, sexual orientation, disability, personal appearance,
11
- body size, race, ethnicity, age, religion, or nationality.
12
-
13
- Examples of unacceptable behavior by participants include:
14
-
15
- * The use of sexualized language or imagery
16
- * Personal attacks
17
- * Trolling or insulting/derogatory comments
18
- * Public or private harassment
19
- * Publishing other's private information, such as physical or electronic
20
- addresses, without explicit permission
21
- * Other unethical or unprofessional conduct
22
-
23
- Project maintainers have the right and responsibility to remove, edit, or
24
- reject comments, commits, code, wiki edits, issues, and other contributions
25
- that are not aligned to this Code of Conduct, or to ban temporarily or
26
- permanently any contributor for other behaviors that they deem inappropriate,
27
- threatening, offensive, or harmful.
28
-
29
- By adopting this Code of Conduct, project maintainers commit themselves to
30
- fairly and consistently applying these principles to every aspect of managing
31
- this project. Project maintainers who do not follow or enforce the Code of
32
- Conduct may be permanently removed from the project team.
33
-
34
- This code of conduct applies both within project spaces and in public spaces
35
- when an individual is representing the project or its community.
36
-
37
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
- reported by contacting a project maintainer at kev@bibo.com.ph. All
39
- complaints will be reviewed and investigated and will result in a response that
40
- is deemed necessary and appropriate to the circumstances. Maintainers are
41
- obligated to maintain confidentiality with regard to the reporter of an
42
- incident.
43
-
44
- This Code of Conduct is adapted from the [Contributor Covenant][homepage],
45
- version 1.3.0, available at
46
- [http://contributor-covenant.org/version/1/3/0/][version]
47
-
48
- [homepage]: http://contributor-covenant.org
49
- [version]: http://contributor-covenant.org/version/1/3/0/
50
-
data/Gemfile DELETED
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in phraseapp_updater.gemspec
4
- gemspec
5
- gem 'byebug'
6
- gem 'rspec_junit_formatter'
7
-
8
- gem 'irb', require: false
data/README.markdown DELETED
@@ -1,177 +0,0 @@
1
- # PhraseAppUpdater
2
-
3
- [![Build Status](https://travis-ci.org/iknow/phraseapp_updater.svg?branch=master)](https://travis-ci.org/iknow/phraseapp_updater)
4
-
5
- **Version** 2.0.0
6
-
7
- This is a tool for managing synchronization between locale data in
8
- [PhraseApp](https://phraseapp.com) and committed in your project. It can perform
9
- JSON-aware three-way merges with respect to a common ancestor, and maintains a
10
- record of the common ancestor on PhraseApp using tags.
11
-
12
- Our workflow considers localization data stored on PhraseApp to be a working
13
- copy for a given branch. We expect developers working on the code and
14
- translators working on PhraseApp to both be able to make changes and have them
15
- integrated.
16
-
17
- PhraseApp provides [APIs](https://phraseapp.com/docs/api/v2/) and a [Ruby
18
- gem](https://github.com/phrase/phraseapp-ruby) for accessing them, but the API
19
- only allows either a) completely overwriting PhraseApp's data with local data or
20
- b) reapplying PhraseApp's data on top of the local data. Neither of these cases
21
- is appropriate for integrating changes made on both sides.
22
-
23
- What we want instead is a three way merge where the committed data wins on
24
- conflict. Non-conflicting changes on PhraseApp are preserved, while changes to
25
- the same key on both sides take the committed data. The result of the merge is
26
- then applied to both sides, keeping them up to date with each other.
27
-
28
- This is especially important when removing keys. Imagine we have the
29
- following, no-longer useful key:
30
-
31
- ```json
32
- unused:
33
- one: An unused
34
- ```
35
-
36
- On PhraseApp, we've added another plural form:
37
-
38
-
39
- ```json
40
- unused:
41
- one: An unused
42
- zero: No unused's
43
- ```
44
-
45
- And in our feature branch, we remove it. The result we want is that the key
46
- completely disappears, instead of getting a result like either of the above.
47
-
48
- ## Installation
49
-
50
- This gem provides a command line interface for performing the
51
- merge and uploading the result to PhraseApp. To use it, install the gem:
52
-
53
- `gem install phraseapp_updater`
54
-
55
- You may also use this gem programatically from your own application.
56
-
57
- Add this line to your application's Gemfile:
58
-
59
- ```ruby
60
- gem 'phraseapp_updater'
61
- ```
62
-
63
- And then execute:
64
-
65
- $ bundle
66
-
67
- Or install it yourself as:
68
-
69
- $ gem install phraseapp_updater
70
-
71
- ## Usage
72
-
73
- CLI
74
- ---
75
-
76
- **Setup**
77
-
78
- `phraseapp_updater setup` creates and initializes a PhraseApp project
79
- corresponding to your branch. It must be provided with the current git revision
80
- of the branch and the path to the locale files.
81
-
82
- ```
83
- phraseapp_updater setup --phraseapp_project_name=<yourbranch> --parent_commit=<yourhash> --phraseapp_api_key=<yourkey> --file-format=json <path_to_locales>
84
- ```
85
-
86
- **Synchronize**
87
-
88
- `phraseapp_updater synchronize` synchronizes a git remote branch with its
89
- corresponding PhraseApp project, incorporating changes from each side into the
90
- other. If both sides were changed, a three-way merge is performed. The result is
91
- uploaded to PhraseApp and committed and pushed to the git remote as appropriate.
92
-
93
- The option `--no_commit` may be provided to restrict changes to the PhraseApp
94
- side. If specified, then in the case that the branch was modified, the merge
95
- result will be uploaded to PhraseApp and the common ancestor updated to the
96
- branch head.
97
-
98
- ```
99
- phraseapp_updater synchronize <checkout_path> --prefix=config/locales --phraseapp_project_id=<yourid> --phraseapp_api_key=<yourkey> --file-format=json
100
- ```
101
-
102
- **Download**
103
-
104
- `phraseapp_updater download` downloads and normalizes locale files from
105
- PhraseApp, saving them to the specified location. The revision of the recorded
106
- common ancestor is printed to standard out.
107
-
108
- ```
109
- phraseapp_updater download --phraseapp_project_id=<yourid> --phraseapp_api_key=<yourkey> --file-format=json <target_path>
110
- ```
111
-
112
- **Upload**
113
-
114
- `phraseapp_updater upload` uploads normalized locale files from your branch to
115
- PhraseApp and resets the recorded common ancestor to the specified revision.
116
-
117
- ```
118
- phraseapp_updater upload --phraseapp_project_id=<yourid> --phraseapp_api_key=<yourkey> --file-format=json <path_to_locales>
119
- ```
120
-
121
- **Update Parent Commit**
122
- `phraseapp_updater update_parent_commit` records a new common ancestor on
123
- PhraseApp without changing the locales.
124
-
125
- ```
126
- phraseapp_updater update_parent_commit --phraseapp_project_id=<yourid> --phraseapp_api_key=<yourkey> --parent_commit=<yournewhash>
127
- ```
128
-
129
- **Merge**
130
-
131
- `phraseapp_updater merge` performs a content-aware three-way merge between
132
- locale files in three directories: `ancestor_path`, `our_path`, and
133
- `their_path`. In the case of conflicts, the changes from `our_path` are
134
- accepted. The results are normalized and written to the path specified with
135
- `to`.
136
-
137
- ```
138
- phraseapp_updater merge ancestor_path our_path their_path --to target_path --file-format=json
139
- ```
140
-
141
-
142
- **Diff**
143
-
144
- Performs a content-aware diff between locale files in two directories. Returns
145
- with exit status 1 or 0 to signal differences or no differences respectively
146
-
147
- ```
148
- phraseapp_updater diff path1 path2 --file-format=json
149
- ```
150
-
151
- ## Future Improvements
152
-
153
- If you'd like to contribute, these would be very helpful!
154
-
155
- * We'd like to use "unverified" translations on PhraseApp as the equivalent of
156
- an unstaged working copy. For this to work, we need to be able to recover
157
- previous translations at the same key. While PhraseApp doesn't itself keep
158
- this history, we could do this by restoring the absent keys from the diff
159
- between verified and unverified download from the common ancestor.
160
- * Expose the changed files on the command line.
161
- * Checking if PhraseApp files changed during execution before upload, to reduce the race condition window.
162
- * More specs for the API and shell.
163
-
164
- ## Development
165
-
166
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
167
-
168
- To install this gem onto your local machine, run `bundle exec rake install`. When everything is working, make a pull request.
169
-
170
- ## Contributing
171
-
172
- Bug reports and pull requests are welcome on GitHub at https://github.com/iknow/phraseapp_updater. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
173
-
174
- ## License
175
-
176
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
177
-
data/Rakefile DELETED
@@ -1,7 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task :default => :spec
7
-
data/nix/gem/Gemfile DELETED
@@ -1,24 +0,0 @@
1
- source "https://rubygems.org/"
2
-
3
- gem "byebug", "11.0.1"
4
- gem "coderay", "1.1.2"
5
- gem "deep_merge", "1.2.1"
6
- gem "diff-lcs", "1.3"
7
- gem "hashdiff", "0.4.0"
8
- gem "io-console", "0.5.4"
9
- gem "irb", "1.2.1"
10
- gem "method_source", "0.9.2"
11
- gem "multi_json", "1.14.1"
12
- gem "oj", "2.18.5"
13
- gem "parallel", "1.19.1"
14
- gem "phraseapp-ruby", "1.6.0"
15
- gem "pry", "0.12.2"
16
- gem "rake", "10.5.0"
17
- gem "reline", "0.1.2"
18
- gem "rspec", "3.8.0"
19
- gem "rspec-core", "3.8.0"
20
- gem "rspec-expectations", "3.8.3"
21
- gem "rspec-mocks", "3.8.0"
22
- gem "rspec-support", "3.8.0"
23
- gem "rspec_junit_formatter", "0.4.1"
24
- gem "thor", "0.20.3"
data/nix/gem/Gemfile.lock DELETED
@@ -1,68 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- byebug (11.0.1)
5
- coderay (1.1.2)
6
- deep_merge (1.2.1)
7
- diff-lcs (1.3)
8
- hashdiff (0.4.0)
9
- io-console (0.5.4)
10
- irb (1.2.1)
11
- reline (>= 0.0.1)
12
- method_source (0.9.2)
13
- multi_json (1.14.1)
14
- oj (2.18.5)
15
- parallel (1.19.1)
16
- phraseapp-ruby (1.6.0)
17
- pry (0.12.2)
18
- coderay (~> 1.1.0)
19
- method_source (~> 0.9.0)
20
- rake (10.5.0)
21
- reline (0.1.2)
22
- io-console (~> 0.5)
23
- rspec (3.8.0)
24
- rspec-core (~> 3.8.0)
25
- rspec-expectations (~> 3.8.0)
26
- rspec-mocks (~> 3.8.0)
27
- rspec-core (3.8.0)
28
- rspec-support (~> 3.8.0)
29
- rspec-expectations (3.8.3)
30
- diff-lcs (>= 1.2.0, < 2.0)
31
- rspec-support (~> 3.8.0)
32
- rspec-mocks (3.8.0)
33
- diff-lcs (>= 1.2.0, < 2.0)
34
- rspec-support (~> 3.8.0)
35
- rspec-support (3.8.0)
36
- rspec_junit_formatter (0.4.1)
37
- rspec-core (>= 2, < 4, != 2.12.0)
38
- thor (0.20.3)
39
-
40
- PLATFORMS
41
- ruby
42
-
43
- DEPENDENCIES
44
- byebug (= 11.0.1)
45
- coderay (= 1.1.2)
46
- deep_merge (= 1.2.1)
47
- diff-lcs (= 1.3)
48
- hashdiff (= 0.4.0)
49
- io-console (= 0.5.4)
50
- irb (= 1.2.1)
51
- method_source (= 0.9.2)
52
- multi_json (= 1.14.1)
53
- oj (= 2.18.5)
54
- parallel (= 1.19.1)
55
- phraseapp-ruby (= 1.6.0)
56
- pry (= 0.12.2)
57
- rake (= 10.5.0)
58
- reline (= 0.1.2)
59
- rspec (= 3.8.0)
60
- rspec-core (= 3.8.0)
61
- rspec-expectations (= 3.8.3)
62
- rspec-mocks (= 3.8.0)
63
- rspec-support (= 3.8.0)
64
- rspec_junit_formatter (= 0.4.1)
65
- thor (= 0.20.3)
66
-
67
- BUNDLED WITH
68
- 1.17.3
data/nix/gem/gemset.nix DELETED
@@ -1,230 +0,0 @@
1
- {
2
- byebug = {
3
- groups = ["default"];
4
- platforms = [];
5
- source = {
6
- remotes = ["https://rubygems.org"];
7
- sha256 = "1mmkls9n56l4gx2k0dnyianwz36z2zgpxli5bpsbr7jbw7hn2x6j";
8
- type = "gem";
9
- };
10
- version = "11.0.1";
11
- };
12
- coderay = {
13
- groups = ["default"];
14
- platforms = [];
15
- source = {
16
- remotes = ["https://rubygems.org"];
17
- sha256 = "15vav4bhcc2x3jmi3izb11l4d9f3xv8hp2fszb7iqmpsccv1pz4y";
18
- type = "gem";
19
- };
20
- version = "1.1.2";
21
- };
22
- deep_merge = {
23
- groups = ["default"];
24
- platforms = [];
25
- source = {
26
- remotes = ["https://rubygems.org"];
27
- sha256 = "1q3picw7zx1xdkybmrnhmk2hycxzaa0jv4gqrby1s90dy5n7fmsb";
28
- type = "gem";
29
- };
30
- version = "1.2.1";
31
- };
32
- diff-lcs = {
33
- groups = ["default"];
34
- platforms = [];
35
- source = {
36
- remotes = ["https://rubygems.org"];
37
- sha256 = "18w22bjz424gzafv6nzv98h0aqkwz3d9xhm7cbr1wfbyas8zayza";
38
- type = "gem";
39
- };
40
- version = "1.3";
41
- };
42
- hashdiff = {
43
- groups = ["default"];
44
- platforms = [];
45
- source = {
46
- remotes = ["https://rubygems.org"];
47
- sha256 = "1ncwxv7jbm3jj9phv6dd514463bkjwggxk10n2z100wf4cjcicrk";
48
- type = "gem";
49
- };
50
- version = "0.4.0";
51
- };
52
- io-console = {
53
- groups = ["default"];
54
- platforms = [];
55
- source = {
56
- remotes = ["https://rubygems.org"];
57
- sha256 = "109yzpv9kslwra2mxnjsg3r6mwxkbqmxihj266qdvccapghi05wg";
58
- type = "gem";
59
- };
60
- version = "0.5.4";
61
- };
62
- irb = {
63
- dependencies = ["reline"];
64
- groups = ["default"];
65
- platforms = [];
66
- source = {
67
- remotes = ["https://rubygems.org"];
68
- sha256 = "1r1y8i46qd5izdszzzn5jxvwvq00m89rk0hm8cs8f21p7nlwmh5w";
69
- type = "gem";
70
- };
71
- version = "1.2.1";
72
- };
73
- method_source = {
74
- groups = ["default"];
75
- platforms = [];
76
- source = {
77
- remotes = ["https://rubygems.org"];
78
- sha256 = "1pviwzvdqd90gn6y7illcdd9adapw8fczml933p5vl739dkvl3lq";
79
- type = "gem";
80
- };
81
- version = "0.9.2";
82
- };
83
- multi_json = {
84
- groups = ["default"];
85
- platforms = [];
86
- source = {
87
- remotes = ["https://rubygems.org"];
88
- sha256 = "0xy54mjf7xg41l8qrg1bqri75agdqmxap9z466fjismc1rn2jwfr";
89
- type = "gem";
90
- };
91
- version = "1.14.1";
92
- };
93
- oj = {
94
- groups = ["default"];
95
- platforms = [];
96
- source = {
97
- remotes = ["https://rubygems.org"];
98
- sha256 = "1jli4mi1xpmm8564pc09bfvv7znzqghidwa3zfw21r365ihmbv2p";
99
- type = "gem";
100
- };
101
- version = "2.18.5";
102
- };
103
- parallel = {
104
- groups = ["default"];
105
- platforms = [];
106
- source = {
107
- remotes = ["https://rubygems.org"];
108
- sha256 = "12jijkap4akzdv11lm08dglsc8jmc87xcgq6947i1s3qb69f4zn2";
109
- type = "gem";
110
- };
111
- version = "1.19.1";
112
- };
113
- phraseapp-ruby = {
114
- groups = ["default"];
115
- platforms = [];
116
- source = {
117
- remotes = ["https://rubygems.org"];
118
- sha256 = "14n2hhwjn32xk0qk6rprs3awnrddhnd4zckyd0a4j8lv8k648pnn";
119
- type = "gem";
120
- };
121
- version = "1.6.0";
122
- };
123
- pry = {
124
- dependencies = ["coderay" "method_source"];
125
- groups = ["default"];
126
- platforms = [];
127
- source = {
128
- remotes = ["https://rubygems.org"];
129
- sha256 = "00rm71x0r1jdycwbs83lf9l6p494m99asakbvqxh8rz7zwnlzg69";
130
- type = "gem";
131
- };
132
- version = "0.12.2";
133
- };
134
- rake = {
135
- groups = ["default"];
136
- platforms = [];
137
- source = {
138
- remotes = ["https://rubygems.org"];
139
- sha256 = "0jcabbgnjc788chx31sihc5pgbqnlc1c75wakmqlbjdm8jns2m9b";
140
- type = "gem";
141
- };
142
- version = "10.5.0";
143
- };
144
- reline = {
145
- dependencies = ["io-console"];
146
- groups = ["default"];
147
- platforms = [];
148
- source = {
149
- remotes = ["https://rubygems.org"];
150
- sha256 = "0908ijrngc3wkn5iny7d0kxkp74w6ixk2nwzzngplplfla1vkp8x";
151
- type = "gem";
152
- };
153
- version = "0.1.2";
154
- };
155
- rspec = {
156
- dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"];
157
- groups = ["default"];
158
- platforms = [];
159
- source = {
160
- remotes = ["https://rubygems.org"];
161
- sha256 = "15ppasvb9qrscwlyjz67ppw1lnxiqnkzx5vkx1bd8x5n3dhikxc3";
162
- type = "gem";
163
- };
164
- version = "3.8.0";
165
- };
166
- rspec-core = {
167
- dependencies = ["rspec-support"];
168
- groups = ["default"];
169
- platforms = [];
170
- source = {
171
- remotes = ["https://rubygems.org"];
172
- sha256 = "1p1s5bnbqp3sxk67y0fh0x884jjym527r0vgmhbm81w7aq6b7l4p";
173
- type = "gem";
174
- };
175
- version = "3.8.0";
176
- };
177
- rspec-expectations = {
178
- dependencies = ["diff-lcs" "rspec-support"];
179
- groups = ["default"];
180
- platforms = [];
181
- source = {
182
- remotes = ["https://rubygems.org"];
183
- sha256 = "1c4gs5ybf7km0qshdm92p38zvg32n1j2kr5fgs2icacz7xf2y6fy";
184
- type = "gem";
185
- };
186
- version = "3.8.3";
187
- };
188
- rspec-mocks = {
189
- dependencies = ["diff-lcs" "rspec-support"];
190
- groups = ["default"];
191
- platforms = [];
192
- source = {
193
- remotes = ["https://rubygems.org"];
194
- sha256 = "06y508cjqycb4yfhxmb3nxn0v9xqf17qbd46l1dh4xhncinr4fyp";
195
- type = "gem";
196
- };
197
- version = "3.8.0";
198
- };
199
- rspec-support = {
200
- groups = ["default"];
201
- platforms = [];
202
- source = {
203
- remotes = ["https://rubygems.org"];
204
- sha256 = "0p3m7drixrlhvj2zpc38b11x145bvm311x6f33jjcxmvcm0wq609";
205
- type = "gem";
206
- };
207
- version = "3.8.0";
208
- };
209
- rspec_junit_formatter = {
210
- dependencies = ["rspec-core"];
211
- groups = ["default"];
212
- platforms = [];
213
- source = {
214
- remotes = ["https://rubygems.org"];
215
- sha256 = "1aynmrgnv26pkprrajvp7advb8nbh0x4pkwk6jwq8qmwzarzk21p";
216
- type = "gem";
217
- };
218
- version = "0.4.1";
219
- };
220
- thor = {
221
- groups = ["default"];
222
- platforms = [];
223
- source = {
224
- remotes = ["https://rubygems.org"];
225
- sha256 = "1yhrnp9x8qcy5vc7g438amd5j9sw83ih7c30dr6g6slgw9zj3g29";
226
- type = "gem";
227
- };
228
- version = "0.20.3";
229
- };
230
- }