crowdin-api 1.4.0 → 1.6.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/.github/workflows/build-and-publish.yml +5 -2
- data/.github/workflows/docs.yml +33 -0
- data/.github/workflows/lint-pr-title.yml +18 -0
- data/.github/workflows/test-and-lint.yml +5 -2
- data/.rubocop.yml +3 -0
- data/.rubocop_todo.yml +1 -1
- data/CONTRIBUTING.md +4 -1
- data/Gemfile +3 -0
- data/README.md +9 -29
- data/lib/crowdin-api/api_resources/bundles.rb +72 -0
- data/lib/crowdin-api/api_resources/glossaries.rb +65 -0
- data/lib/crowdin-api/api_resources/projects.rb +27 -0
- data/lib/crowdin-api/api_resources/reports.rb +64 -0
- data/lib/crowdin-api/api_resources/source_files.rb +64 -0
- data/lib/crowdin-api/api_resources/storages.rb +12 -0
- data/lib/crowdin-api/api_resources/string_translations.rb +16 -0
- data/lib/crowdin-api/api_resources/translation_memory.rb +16 -0
- data/lib/crowdin-api/client/client.rb +1 -1
- data/lib/crowdin-api/client/version.rb +1 -1
- data/lib/crowdin-api/core/fetch_all_extensions.rb +0 -5
- data/spec/api_resources/bundles_spec.rb +32 -1
- data/spec/api_resources/glossaries_spec.rb +182 -118
- data/spec/api_resources/reports_spec.rb +50 -0
- data/spec/api_resources/string_translations_spec.rb +19 -0
- data/spec/api_resources/translation_memory_spec.rb +21 -0
- data/spec/unit/client_spec.rb +12 -0
- metadata +4 -2
@@ -1,167 +1,231 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
describe Crowdin::ApiResources::Glossaries do
|
4
|
-
describe '
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
expect(list_glossaries).to eq(200)
|
10
|
-
end
|
3
|
+
describe Crowdin::ApiResources::Glossaries, 'Default endpoints' do
|
4
|
+
describe '#list_glossaries' do
|
5
|
+
it 'when request are valid', :default do
|
6
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/glossaries")
|
7
|
+
list_glossaries = @crowdin.list_glossaries
|
8
|
+
expect(list_glossaries).to eq(200)
|
11
9
|
end
|
10
|
+
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
12
|
+
describe '#add_glossary' do
|
13
|
+
it 'when request are valid', :default do
|
14
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/glossaries")
|
15
|
+
add_glossary = @crowdin.add_glossary
|
16
|
+
expect(add_glossary).to eq(200)
|
19
17
|
end
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
|
20
|
+
describe '#get_glossary' do
|
21
|
+
let(:glossary_id) { 1 }
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
23
|
+
it 'when request are valid', :default do
|
24
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}")
|
25
|
+
get_glossary = @crowdin.get_glossary(glossary_id)
|
26
|
+
expect(get_glossary).to eq(200)
|
29
27
|
end
|
28
|
+
end
|
30
29
|
|
31
|
-
|
32
|
-
|
30
|
+
describe '#delete_glossary' do
|
31
|
+
let(:glossary_id) { 1 }
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
33
|
+
it 'when request are valid', :default do
|
34
|
+
stub_request(:delete, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}")
|
35
|
+
delete_glossary = @crowdin.delete_glossary(glossary_id)
|
36
|
+
expect(delete_glossary).to eq(200)
|
39
37
|
end
|
38
|
+
end
|
40
39
|
|
41
|
-
|
42
|
-
|
40
|
+
describe '#edit_glossary' do
|
41
|
+
let(:glossary_id) { 1 }
|
43
42
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
43
|
+
it 'when request are valid', :default do
|
44
|
+
stub_request(:patch, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}")
|
45
|
+
edit_glossary = @crowdin.edit_glossary(glossary_id)
|
46
|
+
expect(edit_glossary).to eq(200)
|
49
47
|
end
|
48
|
+
end
|
50
49
|
|
51
|
-
|
52
|
-
|
50
|
+
describe '#export_glossary' do
|
51
|
+
let(:glossary_id) { 1 }
|
53
52
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
53
|
+
it 'when request are valid', :default do
|
54
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/exports")
|
55
|
+
export_glossary = @crowdin.export_glossary({}, glossary_id)
|
56
|
+
expect(export_glossary).to eq(200)
|
59
57
|
end
|
58
|
+
end
|
60
59
|
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
describe '#check_glossary_export_status' do
|
61
|
+
let(:glossary_id) { 1 }
|
62
|
+
let(:export_id) { 1 }
|
64
63
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
64
|
+
it 'when request are valid', :default do
|
65
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/exports/#{export_id}")
|
66
|
+
check_glossary_export_status = @crowdin.check_glossary_export_status(glossary_id, export_id)
|
67
|
+
expect(check_glossary_export_status).to eq(200)
|
70
68
|
end
|
69
|
+
end
|
71
70
|
|
72
|
-
|
73
|
-
|
74
|
-
|
71
|
+
describe '#download_glossary' do
|
72
|
+
let(:glossary_id) { 1 }
|
73
|
+
let(:export_id) { 1 }
|
75
74
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
75
|
+
it 'when request are valid', :default do
|
76
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/exports/#{export_id}/download")
|
77
|
+
download_glossary = @crowdin.download_glossary(glossary_id, export_id)
|
78
|
+
expect(download_glossary).to eq(200)
|
81
79
|
end
|
80
|
+
end
|
82
81
|
|
83
|
-
|
84
|
-
|
82
|
+
describe '#import_glossary' do
|
83
|
+
let(:glossary_id) { 1 }
|
85
84
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
end
|
85
|
+
it 'when request are valid', :default do
|
86
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/imports")
|
87
|
+
import_glossary = @crowdin.import_glossary(glossary_id)
|
88
|
+
expect(import_glossary).to eq(200)
|
91
89
|
end
|
90
|
+
end
|
92
91
|
|
93
|
-
|
94
|
-
|
95
|
-
|
92
|
+
describe '#check_glossary_import_status' do
|
93
|
+
let(:glossary_id) { 1 }
|
94
|
+
let(:import_id) { 1 }
|
96
95
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
end
|
96
|
+
it 'when request are valid', :default do
|
97
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/imports/#{import_id}")
|
98
|
+
check_glossary_import_status = @crowdin.check_glossary_import_status(glossary_id, import_id)
|
99
|
+
expect(check_glossary_import_status).to eq(200)
|
102
100
|
end
|
101
|
+
end
|
103
102
|
|
104
|
-
|
105
|
-
|
103
|
+
describe '#clear_glossary' do
|
104
|
+
let(:glossary_id) { 1 }
|
106
105
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
end
|
106
|
+
it 'when request are valid', :default do
|
107
|
+
stub_request(:delete, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/terms")
|
108
|
+
clear_glossary = @crowdin.clear_glossary(glossary_id)
|
109
|
+
expect(clear_glossary).to eq(200)
|
112
110
|
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe '#search_glossaries_concordance' do
|
114
|
+
let(:project_id) { 1 }
|
113
115
|
|
114
|
-
|
115
|
-
|
116
|
+
it 'returns 200 when request is valid', :default do
|
117
|
+
query = { source_language_id: 'en', target_language_id: 'ar', expression: 'Hello world!' }
|
118
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/glossaries/concordance")
|
119
|
+
search_glossaries_concordance = @crowdin.search_glossaries_concordance(project_id, query)
|
120
|
+
expect(search_glossaries_concordance).to eq(200)
|
121
|
+
end
|
116
122
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
123
|
+
it 'raises ArgumentError when request is missing required query parameter', :default do
|
124
|
+
query = { source_language_id: 'en', target_language_id: 'ar' }
|
125
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/glossaries/concordance")
|
126
|
+
expect do
|
127
|
+
@crowdin.search_glossaries_concordance(project_id, query)
|
128
|
+
end.to raise_error(ArgumentError, ':expression is required')
|
122
129
|
end
|
130
|
+
end
|
131
|
+
end
|
123
132
|
|
124
|
-
|
125
|
-
|
133
|
+
describe Crowdin::ApiResources::Glossaries, 'Concept endpoints' do
|
134
|
+
describe '#list_concepts' do
|
135
|
+
let(:glossary_id) { 1 }
|
126
136
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
end
|
137
|
+
it 'when request are valid', :default do
|
138
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/concepts")
|
139
|
+
concepts = @crowdin.list_concepts(glossary_id)
|
140
|
+
expect(concepts).to eq(200)
|
132
141
|
end
|
142
|
+
end
|
133
143
|
|
134
|
-
|
135
|
-
|
136
|
-
|
144
|
+
describe '#get_concept' do
|
145
|
+
let(:glossary_id) { 1 }
|
146
|
+
let(:concept_id) { 1 }
|
137
147
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
end
|
148
|
+
it 'when request are valid', :default do
|
149
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/concepts/#{concept_id}")
|
150
|
+
concept = @crowdin.get_concept(glossary_id, concept_id)
|
151
|
+
expect(concept).to eq(200)
|
143
152
|
end
|
153
|
+
end
|
144
154
|
|
145
|
-
|
146
|
-
|
147
|
-
|
155
|
+
describe '#update_concept' do
|
156
|
+
let(:glossary_id) { 1 }
|
157
|
+
let(:concept_id) { 1 }
|
148
158
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
end
|
159
|
+
it 'when request are valid', :default do
|
160
|
+
stub_request(:put, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/concepts/#{concept_id}")
|
161
|
+
concept = @crowdin.update_concept(glossary_id, concept_id)
|
162
|
+
expect(concept).to eq(200)
|
154
163
|
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe '#update_concept' do
|
167
|
+
let(:glossary_id) { 1 }
|
168
|
+
let(:concept_id) { 1 }
|
169
|
+
|
170
|
+
it 'when request are valid', :default do
|
171
|
+
stub_request(:delete, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/concepts/#{concept_id}")
|
172
|
+
concept = @crowdin.delete_concept(glossary_id, concept_id)
|
173
|
+
expect(concept).to eq(200)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe Crowdin::ApiResources::Glossaries, 'Term endpoints' do
|
179
|
+
describe '#list_terms' do
|
180
|
+
let(:glossary_id) { 1 }
|
181
|
+
|
182
|
+
it 'when request are valid', :default do
|
183
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/terms")
|
184
|
+
list_terms = @crowdin.list_terms(glossary_id)
|
185
|
+
expect(list_terms).to eq(200)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe '#add_term' do
|
190
|
+
let(:glossary_id) { 1 }
|
191
|
+
|
192
|
+
it 'when request are valid', :default do
|
193
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/terms")
|
194
|
+
add_term = @crowdin.add_term(glossary_id)
|
195
|
+
expect(add_term).to eq(200)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
describe '#get_term' do
|
200
|
+
let(:glossary_id) { 1 }
|
201
|
+
let(:term_id) { 1 }
|
202
|
+
|
203
|
+
it 'when request are valid', :default do
|
204
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/terms/#{term_id}")
|
205
|
+
get_term = @crowdin.get_term(glossary_id, term_id)
|
206
|
+
expect(get_term).to eq(200)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe '#delete_term' do
|
211
|
+
let(:glossary_id) { 1 }
|
212
|
+
let(:term_id) { 1 }
|
213
|
+
|
214
|
+
it 'when request are valid', :default do
|
215
|
+
stub_request(:delete, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/terms/#{term_id}")
|
216
|
+
delete_term = @crowdin.delete_term(glossary_id, term_id)
|
217
|
+
expect(delete_term).to eq(200)
|
218
|
+
end
|
219
|
+
end
|
155
220
|
|
156
|
-
|
157
|
-
|
158
|
-
|
221
|
+
describe '#edit_term' do
|
222
|
+
let(:glossary_id) { 1 }
|
223
|
+
let(:term_id) { 1 }
|
159
224
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
end
|
225
|
+
it 'when request are valid', :default do
|
226
|
+
stub_request(:patch, "https://api.crowdin.com/#{target_api_url}/glossaries/#{glossary_id}/terms/#{term_id}")
|
227
|
+
edit_term = @crowdin.edit_term(glossary_id, term_id)
|
228
|
+
expect(edit_term).to eq(200)
|
165
229
|
end
|
166
230
|
end
|
167
231
|
end
|
@@ -92,4 +92,54 @@ describe Crowdin::ApiResources::Reports do
|
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
95
|
+
|
96
|
+
describe 'Setting Templates endpoints' do
|
97
|
+
describe 'List Report Settings templates' do
|
98
|
+
it 'when request are valid', :default do
|
99
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/reports/settings-templates")
|
100
|
+
settings_templates = @crowdin.list_report_settings_templates({}, project_id)
|
101
|
+
expect(settings_templates).to eq(200)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe 'Add Report Settings template' do
|
106
|
+
it 'when request are valid', :default do
|
107
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/reports/settings-templates")
|
108
|
+
settings_templates = @crowdin.add_report_settings_template(
|
109
|
+
{ name: '', currency: '', unit: '', mode: '', config: '' }, project_id
|
110
|
+
)
|
111
|
+
expect(settings_templates).to eq(200)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe 'Get Report Settings template' do
|
116
|
+
let(:template_id) { 1 }
|
117
|
+
|
118
|
+
it 'when request are valid', :default do
|
119
|
+
stub_request(:get, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/reports/settings-templates/#{template_id}")
|
120
|
+
settings_templates = @crowdin.get_report_settings_template(template_id, project_id)
|
121
|
+
expect(settings_templates).to eq(200)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'Get Report Settings template' do
|
126
|
+
let(:template_id) { 1 }
|
127
|
+
|
128
|
+
it 'when request are valid', :default do
|
129
|
+
stub_request(:patch, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/reports/settings-templates/#{template_id}")
|
130
|
+
settings_templates = @crowdin.edit_report_settings_template({}, template_id, project_id)
|
131
|
+
expect(settings_templates).to eq(200)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe 'Get Report Settings template' do
|
136
|
+
let(:template_id) { 1 }
|
137
|
+
|
138
|
+
it 'when request are valid', :default do
|
139
|
+
stub_request(:delete, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/reports/settings-templates/#{template_id}")
|
140
|
+
settings_templates = @crowdin.delete_report_settings_template(template_id, project_id)
|
141
|
+
expect(settings_templates).to eq(200)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
95
145
|
end
|
@@ -137,5 +137,24 @@ describe Crowdin::ApiResources::StringTranslations do
|
|
137
137
|
expect(cancel_vote).to eq(200)
|
138
138
|
end
|
139
139
|
end
|
140
|
+
|
141
|
+
describe '#add_translation_alignment' do
|
142
|
+
let(:project_id) { 1 }
|
143
|
+
|
144
|
+
it 'returns 200 when request is valid', :default do
|
145
|
+
query = { source_language_id: 'en', target_language_id: 'ar', text: 'Hello world!' }
|
146
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/translations/alignment")
|
147
|
+
add_translation_alignment = @crowdin.add_translation_alignment(project_id, query)
|
148
|
+
expect(add_translation_alignment).to eq(200)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'raises ArgumentError when request is missing required query parameter', :default do
|
152
|
+
query = { source_language_id: 'en', target_language_id: 'ar' }
|
153
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/translations/alignment")
|
154
|
+
expect do
|
155
|
+
@crowdin.add_translation_alignment(project_id, query)
|
156
|
+
end.to raise_error(ArgumentError, ':text is required')
|
157
|
+
end
|
158
|
+
end
|
140
159
|
end
|
141
160
|
end
|
@@ -110,5 +110,26 @@ describe Crowdin::ApiResources::TranslationMemory do
|
|
110
110
|
expect(check_tm_import_status).to eq(200)
|
111
111
|
end
|
112
112
|
end
|
113
|
+
|
114
|
+
describe '#search_tms_concordance' do
|
115
|
+
let(:project_id) { 1 }
|
116
|
+
|
117
|
+
it 'returns 200 when request is valid', :default do
|
118
|
+
query = { source_language_id: 'en', target_language_id: 'ar', expression: 'Hello world!',
|
119
|
+
auto_substitution: true, min_relevant: 60 }
|
120
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/tms/concordance")
|
121
|
+
search_tms_concordance = @crowdin.search_tms_concordance(project_id, query)
|
122
|
+
expect(search_tms_concordance).to eq(200)
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'raises ArgumentError when request is missing required query parameter', :default do
|
126
|
+
query = { source_language_id: 'en', target_language_id: 'ar', expression: 'Hello world!',
|
127
|
+
auto_substitution: true }
|
128
|
+
stub_request(:post, "https://api.crowdin.com/#{target_api_url}/projects/#{project_id}/tms/concordance")
|
129
|
+
expect do
|
130
|
+
@crowdin.search_tms_concordance(project_id, query)
|
131
|
+
end.to raise_error(ArgumentError, ':min_relevant is required')
|
132
|
+
end
|
133
|
+
end
|
113
134
|
end
|
114
135
|
end
|
data/spec/unit/client_spec.rb
CHANGED
@@ -82,4 +82,16 @@ describe 'Crowdin Client' do
|
|
82
82
|
expect(@crowdin.config.base_url).to eq("https://#{full_organization_domain}")
|
83
83
|
end
|
84
84
|
end
|
85
|
+
|
86
|
+
describe 'Crowdin Client fetch_all' do
|
87
|
+
it 'should raise error if fetch_all is called for unsupported methods' do
|
88
|
+
expect { @crowdin.fetch_all(:add_bundle).to raise_error(Crowdin::Errors::FetchAllProcessingError) }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe 'Crowdin Client fetch_all' do
|
93
|
+
it 'should raise error if fetch_all is called for unsupported methods' do
|
94
|
+
expect { @crowdin.fetch_all(:export_bundle).to raise_error(Crowdin::Errors::FetchAllProcessingError) }
|
95
|
+
end
|
96
|
+
end
|
85
97
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crowdin-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Crowdin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: open-uri
|
@@ -170,6 +170,8 @@ extensions: []
|
|
170
170
|
extra_rdoc_files: []
|
171
171
|
files:
|
172
172
|
- ".github/workflows/build-and-publish.yml"
|
173
|
+
- ".github/workflows/docs.yml"
|
174
|
+
- ".github/workflows/lint-pr-title.yml"
|
173
175
|
- ".github/workflows/test-and-lint.yml"
|
174
176
|
- ".gitignore"
|
175
177
|
- ".rspec"
|