foreman_templates 7.0.5 → 9.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/app/controllers/api/v2/template_controller.rb +8 -2
  3. data/app/controllers/concerns/foreman/controller/parameters/template_params.rb +22 -2
  4. data/app/controllers/ui_template_syncs_controller.rb +1 -1
  5. data/app/models/setting/template_sync.rb +12 -2
  6. data/app/services/foreman_templates/export_result.rb +20 -29
  7. data/app/services/foreman_templates/parse_result.rb +1 -0
  8. data/app/services/foreman_templates/template_exporter.rb +52 -39
  9. data/app/services/foreman_templates/template_importer.rb +20 -4
  10. data/app/views/template_syncs/index.html.erb +6 -2
  11. data/app/views/ui_template_syncs/template_export_result.rabl +4 -4
  12. data/db/migrate/20180627134929_change_lock_setting.rb +5 -0
  13. data/lib/foreman_templates/engine.rb +6 -0
  14. data/lib/foreman_templates/version.rb +1 -1
  15. data/package.json +15 -21
  16. data/webpack/__mocks__/foremanReact/components/Layout/LayoutSelectors.js +4 -0
  17. data/webpack/__mocks__/foremanReact/components/common/forms/ForemanForm.js +2 -0
  18. data/webpack/components/NewTemplateSync/__fixtures__/templateSyncSettings.fixtures.js +4 -4
  19. data/webpack/components/NewTemplateSync/__tests__/__snapshots__/NewTemplateSync.test.js.snap +2 -2
  20. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncForm.js +89 -53
  21. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncFormSelectors.js +10 -13
  22. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/NewTemplateSyncFormSelectors.test.js +1 -19
  23. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/__snapshots__/NewTemplateSyncFormSelectors.test.js.snap +7 -36
  24. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/index.js +7 -16
  25. data/webpack/components/NewTemplateSync/components/SyncSettingField.js +5 -11
  26. data/webpack/components/NewTemplateSync/components/SyncSettingFields.js +8 -25
  27. data/webpack/components/NewTemplateSync/components/TextButtonField/index.js +27 -20
  28. data/webpack/components/NewTemplateSync/components/__tests__/SyncSettingField.test.js +2 -1
  29. data/webpack/components/NewTemplateSync/components/__tests__/SyncSettingFields.test.js +1 -0
  30. data/webpack/components/NewTemplateSync/components/__tests__/TextButtonField.test.js +4 -4
  31. data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/SyncSettingField.test.js.snap +18 -27
  32. data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/SyncSettingFields.test.js.snap +5 -3
  33. data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/TextButtonField.test.js.snap +8 -91
  34. data/webpack/components/TemplateSyncResult/__fixtures__/templateSyncResult.fixtures.js +2 -2
  35. data/webpack/components/TemplateSyncResult/__tests__/__snapshots__/TemplateSyncResult.test.js.snap +3 -1
  36. data/webpack/components/TemplateSyncResult/__tests__/__snapshots__/TemplateSyncResultReducer.test.js.snap +3 -1
  37. data/webpack/components/TemplateSyncResult/components/SyncResultList.js +2 -2
  38. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/__snapshots__/helpers.test.js.snap +37 -0
  39. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/helpers.js +21 -11
  40. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/helpers.test.js +21 -0
  41. data/webpack/components/TemplateSyncResult/components/__tests__/__snapshots__/SyncResultList.test.js.snap +8 -6
  42. data/webpack/components/TemplateSyncResult/components/__tests__/__snapshots__/SyncedTemplate.test.js.snap +39 -15
  43. data/webpack/testSetup.js +2 -1
  44. metadata +8 -8
  45. data/webpack/__mocks__/foremanReact/components/common/forms/Form.js +0 -2
  46. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncFormConstants.js +0 -1
  47. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/NewTemplateSyncForm.test.js +0 -42
  48. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/__snapshots__/NewTemplateSyncForm.test.js.snap +0 -186
@@ -24,7 +24,7 @@ export const exportTemplates = [
24
24
  export const noName = {
25
25
  name: null,
26
26
  templateFile: 'random_template.erb',
27
- additionalErrors: 'No "name" found in metadata',
27
+ additionalErrors: ['No "name" found in metadata'],
28
28
  errors: null,
29
29
  };
30
30
 
@@ -55,7 +55,7 @@ export const filteredOut = {
55
55
  name: 'CoreOS default',
56
56
  templateFile: 'coreos_default.erb',
57
57
  additionalErrors: null,
58
- additionalInfo: 'Skipping, this template was filtered out.',
58
+ additionalInfo: ['Skipping, this template was filtered out.'],
59
59
  errors: {},
60
60
  snippet: false,
61
61
  locked: false,
@@ -55,7 +55,9 @@ exports[`TemplateSyncResult should render import result 1`] = `
55
55
  templates={
56
56
  Array [
57
57
  Object {
58
- "additionalErrors": "No \\"name\\" found in metadata",
58
+ "additionalErrors": Array [
59
+ "No \\"name\\" found in metadata",
60
+ ],
59
61
  "errors": null,
60
62
  "name": null,
61
63
  "templateFile": "random_template.erb",
@@ -33,7 +33,9 @@ Object {
33
33
  "resultAction": "import",
34
34
  "templates": Array [
35
35
  Object {
36
- "additionalErrors": "No \\"name\\" found in metadata",
36
+ "additionalErrors": Array [
37
+ "No \\"name\\" found in metadata",
38
+ ],
37
39
  "errors": null,
38
40
  "name": null,
39
41
  "templateFile": "random_template.erb",
@@ -11,10 +11,10 @@ import ListViewHeader from './ListViewHeader';
11
11
  const SyncResultList = ({ pagination, pageChange, templates, editPaths }) => (
12
12
  <ListView>
13
13
  <ListViewHeader />
14
- {templatesPage(templates, pagination).map(template => (
14
+ {templatesPage(templates, pagination).map((template, idx) => (
15
15
  <SyncedTemplate
16
16
  template={template}
17
- key={template.name}
17
+ key={idx}
18
18
  editPath={editPaths[template.className]}
19
19
  />
20
20
  ))}
@@ -0,0 +1,37 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`expandableContent should return additional error 1`] = `
4
+ <ul>
5
+ <li>
6
+ These are additional errors
7
+ </li>
8
+ </ul>
9
+ `;
10
+
11
+ exports[`expandableContent should return additional info 1`] = `
12
+ <ul>
13
+ <li>
14
+ This is additional info
15
+ </li>
16
+ </ul>
17
+ `;
18
+
19
+ exports[`expandableContent should return attribute errors 1`] = `
20
+ <ul>
21
+ <li>
22
+ could not be processed
23
+ </li>
24
+ <li>
25
+ name: can't be blank
26
+ </li>
27
+ <li>
28
+ name: has invalid format
29
+ </li>
30
+ </ul>
31
+ `;
32
+
33
+ exports[`expandableContent should return no errors 1`] = `
34
+ <span>
35
+ There were no errors.
36
+ </span>
37
+ `;
@@ -7,8 +7,8 @@ import EmptyInfoItem from './EmptyInfoItem';
7
7
  import StringInfoItem from './StringInfoItem';
8
8
  import LinkInfoItem from './LinkInfoItem';
9
9
 
10
- export const itemIteratorId = (template, attr) =>
11
- `${template.templateFile}-${attr}`;
10
+ export const itemIteratorId = (template, ...rest) =>
11
+ `${template.templateFile}-${rest.join('-')}`;
12
12
 
13
13
  export const additionalInfo = (template, editPath) => {
14
14
  const infoAttrs = [
@@ -72,7 +72,12 @@ export const additionalInfo = (template, editPath) => {
72
72
  );
73
73
  case 'name':
74
74
  return (
75
- <LinkInfoItem template={template} editPath={editPath} attr={attr} />
75
+ <LinkInfoItem
76
+ template={template}
77
+ editPath={editPath}
78
+ attr={attr}
79
+ key={key}
80
+ />
76
81
  );
77
82
  default:
78
83
  return '';
@@ -91,11 +96,16 @@ export const itemLeftContentIcon = template => {
91
96
 
92
97
  export const expandableContent = template => {
93
98
  if (Object.keys(aggregatedMessages(template)).length !== 0) {
94
- const res = Object.keys(aggregatedMessages(template)).map(key => (
95
- <li key={itemIteratorId(template, key)}>
96
- {formatError(key, aggregatedMessages(template)[key])}
97
- </li>
98
- ));
99
+ const msgs = aggregatedMessages(template);
100
+
101
+ const res = Object.keys(msgs).map(key => {
102
+ const errorMsgs = aggregatedMessages(template)[key];
103
+ return errorMsgs.map((errValue, idx) => (
104
+ <li key={itemIteratorId(template, key, idx)}>
105
+ {formatError(key, errValue)}
106
+ </li>
107
+ ));
108
+ });
99
109
  return <ul>{res}</ul>;
100
110
  }
101
111
  return <span>There were no errors.</span>;
@@ -104,7 +114,7 @@ export const expandableContent = template => {
104
114
  const aggregatedErrors = template => {
105
115
  const err = { ...template.errors } || {};
106
116
  if (template.additionalErrors) {
107
- err.additional = template.additionalErrors;
117
+ err.additional = [template.additionalErrors];
108
118
  }
109
119
 
110
120
  return err;
@@ -113,14 +123,14 @@ const aggregatedErrors = template => {
113
123
  const aggregatedMessages = template => {
114
124
  const errors = aggregatedErrors(template);
115
125
  if (template.additionalInfo) {
116
- errors.info = template.additionalInfo;
126
+ errors.info = [template.additionalInfo];
117
127
  }
118
128
  return errors;
119
129
  };
120
130
 
121
131
  const formatError = (key, value) => {
122
132
  const omitKeys = ['base', 'additional', 'info'];
123
- if (omitKeys.reduce((memo, item) => memo || key === item, false)) {
133
+ if (omitKeys.includes(key)) {
124
134
  return value;
125
135
  }
126
136
 
@@ -0,0 +1,21 @@
1
+ import { testSelectorsSnapshotWithFixtures } from 'react-redux-test-utils';
2
+
3
+ import { expandableContent } from './helpers';
4
+
5
+ const fixtures = {
6
+ 'should return no errors': () => expandableContent({}),
7
+ 'should return additional info': () =>
8
+ expandableContent({ additionalInfo: 'This is additional info' }),
9
+ 'should return additional error': () =>
10
+ expandableContent({ additionalErrors: 'These are additional errors' }),
11
+ 'should return attribute errors': () =>
12
+ expandableContent({
13
+ errors: {
14
+ base: ['could not be processed'],
15
+ name: ["can't be blank", 'has invalid format'],
16
+ },
17
+ }),
18
+ };
19
+
20
+ describe('expandableContent', () =>
21
+ testSelectorsSnapshotWithFixtures(fixtures));
@@ -7,10 +7,12 @@ exports[`SyncResultList should render 1`] = `
7
7
  <ListViewHeader />
8
8
  <SyncedTemplate
9
9
  editPath=""
10
- key="null"
10
+ key="0"
11
11
  template={
12
12
  Object {
13
- "additionalErrors": "No \\"name\\" found in metadata",
13
+ "additionalErrors": Array [
14
+ "No \\"name\\" found in metadata",
15
+ ],
14
16
  "errors": null,
15
17
  "name": null,
16
18
  "templateFile": "random_template.erb",
@@ -19,7 +21,7 @@ exports[`SyncResultList should render 1`] = `
19
21
  />
20
22
  <SyncedTemplate
21
23
  editPath=""
22
- key="EPEL"
24
+ key="1"
23
25
  template={
24
26
  Object {
25
27
  "additionalErrors": null,
@@ -40,7 +42,7 @@ exports[`SyncResultList should render 1`] = `
40
42
  />
41
43
  <SyncedTemplate
42
44
  editPath=""
43
- key="CoreOS default"
45
+ key="2"
44
46
  template={
45
47
  Object {
46
48
  "additionalErrors": null,
@@ -56,7 +58,7 @@ exports[`SyncResultList should render 1`] = `
56
58
  />
57
59
  <SyncedTemplate
58
60
  editPath=""
59
- key="null"
61
+ key="3"
60
62
  template={
61
63
  Object {
62
64
  "additionalErrors": "No \\"model\\" found in metadata",
@@ -68,7 +70,7 @@ exports[`SyncResultList should render 1`] = `
68
70
  />
69
71
  <SyncedTemplate
70
72
  editPath=""
71
- key="Kickstart fake"
73
+ key="4"
72
74
  template={
73
75
  Object {
74
76
  "additionalErrors": null,
@@ -11,7 +11,9 @@ exports[`SyncedTemplate should render skipped template 1`] = `
11
11
  template={
12
12
  Object {
13
13
  "additionalErrors": null,
14
- "additionalInfo": "Skipping, this template was filtered out.",
14
+ "additionalInfo": Array [
15
+ "Skipping, this template was filtered out.",
16
+ ],
15
17
  "className": "Ptable",
16
18
  "errors": Object {},
17
19
  "humanizedClassName": "Ptable",
@@ -27,7 +29,9 @@ exports[`SyncedTemplate should render skipped template 1`] = `
27
29
  template={
28
30
  Object {
29
31
  "additionalErrors": null,
30
- "additionalInfo": "Skipping, this template was filtered out.",
32
+ "additionalInfo": Array [
33
+ "Skipping, this template was filtered out.",
34
+ ],
31
35
  "className": "Ptable",
32
36
  "errors": Object {},
33
37
  "humanizedClassName": "Ptable",
@@ -43,7 +47,9 @@ exports[`SyncedTemplate should render skipped template 1`] = `
43
47
  template={
44
48
  Object {
45
49
  "additionalErrors": null,
46
- "additionalInfo": "Skipping, this template was filtered out.",
50
+ "additionalInfo": Array [
51
+ "Skipping, this template was filtered out.",
52
+ ],
47
53
  "className": "Ptable",
48
54
  "errors": Object {},
49
55
  "humanizedClassName": "Ptable",
@@ -61,7 +67,9 @@ exports[`SyncedTemplate should render skipped template 1`] = `
61
67
  template={
62
68
  Object {
63
69
  "additionalErrors": null,
64
- "additionalInfo": "Skipping, this template was filtered out.",
70
+ "additionalInfo": Array [
71
+ "Skipping, this template was filtered out.",
72
+ ],
65
73
  "className": "Ptable",
66
74
  "errors": Object {},
67
75
  "humanizedClassName": "Ptable",
@@ -78,7 +86,9 @@ exports[`SyncedTemplate should render skipped template 1`] = `
78
86
  template={
79
87
  Object {
80
88
  "additionalErrors": null,
81
- "additionalInfo": "Skipping, this template was filtered out.",
89
+ "additionalInfo": Array [
90
+ "Skipping, this template was filtered out.",
91
+ ],
82
92
  "className": "Ptable",
83
93
  "errors": Object {},
84
94
  "humanizedClassName": "Ptable",
@@ -96,7 +106,9 @@ exports[`SyncedTemplate should render skipped template 1`] = `
96
106
  template={
97
107
  Object {
98
108
  "additionalErrors": null,
99
- "additionalInfo": "Skipping, this template was filtered out.",
109
+ "additionalInfo": Array [
110
+ "Skipping, this template was filtered out.",
111
+ ],
100
112
  "className": "Ptable",
101
113
  "errors": Object {},
102
114
  "humanizedClassName": "Ptable",
@@ -132,7 +144,7 @@ exports[`SyncedTemplate should render skipped template 1`] = `
132
144
  >
133
145
  <ul>
134
146
  <li
135
- key="coreos_default.erb-info"
147
+ key="coreos_default.erb-info-0"
136
148
  >
137
149
  Skipping, this template was filtered out.
138
150
  </li>
@@ -149,7 +161,9 @@ exports[`SyncedTemplate should render template with invalid metadata 1`] = `
149
161
  attr="name"
150
162
  template={
151
163
  Object {
152
- "additionalErrors": "No \\"name\\" found in metadata",
164
+ "additionalErrors": Array [
165
+ "No \\"name\\" found in metadata",
166
+ ],
153
167
  "errors": null,
154
168
  "name": null,
155
169
  "templateFile": "random_template.erb",
@@ -160,7 +174,9 @@ exports[`SyncedTemplate should render template with invalid metadata 1`] = `
160
174
  attr="locked"
161
175
  template={
162
176
  Object {
163
- "additionalErrors": "No \\"name\\" found in metadata",
177
+ "additionalErrors": Array [
178
+ "No \\"name\\" found in metadata",
179
+ ],
164
180
  "errors": null,
165
181
  "name": null,
166
182
  "templateFile": "random_template.erb",
@@ -171,7 +187,9 @@ exports[`SyncedTemplate should render template with invalid metadata 1`] = `
171
187
  attr="snippet"
172
188
  template={
173
189
  Object {
174
- "additionalErrors": "No \\"name\\" found in metadata",
190
+ "additionalErrors": Array [
191
+ "No \\"name\\" found in metadata",
192
+ ],
175
193
  "errors": null,
176
194
  "name": null,
177
195
  "templateFile": "random_template.erb",
@@ -182,7 +200,9 @@ exports[`SyncedTemplate should render template with invalid metadata 1`] = `
182
200
  attr="humanizedClassName"
183
201
  template={
184
202
  Object {
185
- "additionalErrors": "No \\"name\\" found in metadata",
203
+ "additionalErrors": Array [
204
+ "No \\"name\\" found in metadata",
205
+ ],
186
206
  "errors": null,
187
207
  "name": null,
188
208
  "templateFile": "random_template.erb",
@@ -193,7 +213,9 @@ exports[`SyncedTemplate should render template with invalid metadata 1`] = `
193
213
  attr="kind"
194
214
  template={
195
215
  Object {
196
- "additionalErrors": "No \\"name\\" found in metadata",
216
+ "additionalErrors": Array [
217
+ "No \\"name\\" found in metadata",
218
+ ],
197
219
  "errors": null,
198
220
  "name": null,
199
221
  "templateFile": "random_template.erb",
@@ -206,7 +228,9 @@ exports[`SyncedTemplate should render template with invalid metadata 1`] = `
206
228
  mapAttr={[Function]}
207
229
  template={
208
230
  Object {
209
- "additionalErrors": "No \\"name\\" found in metadata",
231
+ "additionalErrors": Array [
232
+ "No \\"name\\" found in metadata",
233
+ ],
210
234
  "errors": null,
211
235
  "name": null,
212
236
  "templateFile": "random_template.erb",
@@ -238,7 +262,7 @@ exports[`SyncedTemplate should render template with invalid metadata 1`] = `
238
262
  >
239
263
  <ul>
240
264
  <li
241
- key="random_template.erb-additional"
265
+ key="random_template.erb-additional-0"
242
266
  >
243
267
  No "name" found in metadata
244
268
  </li>
@@ -409,7 +433,7 @@ exports[`SyncedTemplate should render template with validation errors 1`] = `
409
433
  >
410
434
  <ul>
411
435
  <li
412
- key="epel.erb-base"
436
+ key="epel.erb-base-0"
413
437
  >
414
438
  This template is locked
415
439
  </li>
@@ -1,4 +1,5 @@
1
- import 'babel-polyfill';
1
+ import 'core-js/shim';
2
+ import 'regenerator-runtime/runtime';
2
3
 
3
4
  import { configure } from 'enzyme';
4
5
  import Adapter from 'enzyme-adapter-react-16';
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_templates
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.5
4
+ version: 9.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Sutcliffe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-11 00:00:00.000000000 Z
11
+ date: 2020-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diffy
@@ -88,6 +88,7 @@ files:
88
88
  - app/views/ui_template_syncs/template_import_result.json.rabl
89
89
  - app/views/ui_template_syncs/template_import_results.json.rabl
90
90
  - config/routes.rb
91
+ - db/migrate/20180627134929_change_lock_setting.rb
91
92
  - lib/foreman_templates.rb
92
93
  - lib/foreman_templates/engine.rb
93
94
  - lib/foreman_templates/version.rb
@@ -96,9 +97,10 @@ files:
96
97
  - webpack/ForemanTemplates.js
97
98
  - webpack/Routes.js
98
99
  - webpack/__mocks__/foremanReact/common/helpers.js
100
+ - webpack/__mocks__/foremanReact/components/Layout/LayoutSelectors.js
99
101
  - webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js
100
102
  - webpack/__mocks__/foremanReact/components/common/forms/CommonForm.js
101
- - webpack/__mocks__/foremanReact/components/common/forms/Form.js
103
+ - webpack/__mocks__/foremanReact/components/common/forms/ForemanForm.js
102
104
  - webpack/__mocks__/foremanReact/components/common/forms/TextField.js
103
105
  - webpack/__mocks__/foremanReact/redux/actions/common/forms.js
104
106
  - webpack/__mocks__/foremanReact/routes/common/PageLayout/PageLayout.js
@@ -118,11 +120,8 @@ files:
118
120
  - webpack/components/NewTemplateSync/__tests__/__snapshots__/NewTemplateSyncSelectors.test.js.snap
119
121
  - webpack/components/NewTemplateSync/components/ButtonTooltip.js
120
122
  - webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncForm.js
121
- - webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncFormConstants.js
122
123
  - webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncFormSelectors.js
123
- - webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/NewTemplateSyncForm.test.js
124
124
  - webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/NewTemplateSyncFormSelectors.test.js
125
- - webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/__snapshots__/NewTemplateSyncForm.test.js.snap
126
125
  - webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/__snapshots__/NewTemplateSyncFormSelectors.test.js.snap
127
126
  - webpack/components/NewTemplateSync/components/NewTemplateSyncForm/index.js
128
127
  - webpack/components/NewTemplateSync/components/SyncSettingField.js
@@ -166,7 +165,9 @@ files:
166
165
  - webpack/components/TemplateSyncResult/components/SyncedTemplate/InfoItem.js
167
166
  - webpack/components/TemplateSyncResult/components/SyncedTemplate/LinkInfoItem.js
168
167
  - webpack/components/TemplateSyncResult/components/SyncedTemplate/StringInfoItem.js
168
+ - webpack/components/TemplateSyncResult/components/SyncedTemplate/__snapshots__/helpers.test.js.snap
169
169
  - webpack/components/TemplateSyncResult/components/SyncedTemplate/helpers.js
170
+ - webpack/components/TemplateSyncResult/components/SyncedTemplate/helpers.test.js
170
171
  - webpack/components/TemplateSyncResult/components/SyncedTemplate/index.js
171
172
  - webpack/components/TemplateSyncResult/components/__tests__/SyncResultList.test.js
172
173
  - webpack/components/TemplateSyncResult/components/__tests__/SyncedTemplate.test.js
@@ -197,8 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
198
  - !ruby/object:Gem::Version
198
199
  version: '0'
199
200
  requirements: []
200
- rubyforge_project:
201
- rubygems_version: 2.6.14
201
+ rubygems_version: 3.1.2
202
202
  signing_key:
203
203
  specification_version: 4
204
204
  summary: Template-syncing engine for Foreman