foreman-tasks 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +12 -12
  3. data/.rubocop_todo.yml +34 -116
  4. data/app/controllers/foreman_tasks/api/recurring_logics_controller.rb +20 -1
  5. data/app/controllers/foreman_tasks/api/tasks_controller.rb +29 -9
  6. data/app/controllers/foreman_tasks/concerns/hosts_controller_extension.rb +1 -1
  7. data/app/controllers/foreman_tasks/recurring_logics_controller.rb +19 -0
  8. data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +1 -3
  9. data/app/lib/actions/helpers/humanizer.rb +1 -3
  10. data/app/lib/actions/proxy_action.rb +33 -12
  11. data/app/models/foreman_tasks/concerns/action_triggering.rb +1 -1
  12. data/app/models/foreman_tasks/recurring_logic.rb +1 -0
  13. data/app/models/foreman_tasks/remote_task.rb +1 -0
  14. data/app/models/foreman_tasks/task.rb +4 -0
  15. data/app/models/foreman_tasks/task/dynflow_task.rb +1 -1
  16. data/app/models/foreman_tasks/task/search.rb +11 -1
  17. data/app/services/foreman_tasks/troubleshooting_help_generator.rb +0 -4
  18. data/app/views/foreman_tasks/api/recurring_logics/base.json.rabl +2 -1
  19. data/app/views/foreman_tasks/api/tasks/details.json.rabl +1 -0
  20. data/app/views/foreman_tasks/api/tasks/show.json.rabl +1 -1
  21. data/app/views/foreman_tasks/recurring_logics/index.html.erb +30 -0
  22. data/app/views/foreman_tasks/tasks/show.html.erb +3 -0
  23. data/config/routes.rb +7 -0
  24. data/foreman-tasks.gemspec +4 -6
  25. data/lib/foreman_tasks/dynflow/console_authorizer.rb +2 -2
  26. data/lib/foreman_tasks/engine.rb +15 -13
  27. data/lib/foreman_tasks/tasks/cleanup.rake +1 -1
  28. data/lib/foreman_tasks/tasks/export_tasks.rake +2 -2
  29. data/lib/foreman_tasks/test_extensions.rb +1 -1
  30. data/lib/foreman_tasks/version.rb +1 -1
  31. data/locale/action_names.rb +1 -1
  32. data/package.json +1 -2
  33. data/script/rails +2 -2
  34. data/test/factories/task_factory.rb +34 -2
  35. data/test/foreman_tasks_test_helper.rb +4 -0
  36. data/test/unit/actions/action_with_sub_plans_test.rb +1 -1
  37. data/test/unit/task_test.rb +160 -74
  38. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +4 -0
  39. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskInfo.js +3 -12
  40. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +1 -0
  41. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +3 -1
  42. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskInfo.test.js.snap +2 -6
  43. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +4 -1
  44. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +1 -0
  45. data/webpack/ForemanTasks/Components/TaskDetails/index.js +2 -0
  46. data/webpack/ForemanTasks/Components/TasksTable/SubTasksPage.js +3 -1
  47. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +87 -21
  48. data/webpack/ForemanTasks/Components/TasksTable/TasksTableConstants.js +7 -7
  49. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +31 -22
  50. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +2 -1
  51. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableActions.test.js +44 -46
  52. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +3 -1
  53. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +2 -1
  54. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableActions.test.js.snap +61 -5
  55. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +6 -2
  56. metadata +10 -10
@@ -1,15 +1,12 @@
1
1
  import { getControllerSearchProps } from 'foremanReact/constants';
2
2
 
3
3
  export const TASKS_TABLE_ID = 'TASKS_TABLE';
4
- export const TASKS_CONTROLLER = 'tasks';
5
- export const TASKS_SUCCESS = 'TASKS_SUCCESS';
6
- export const TASKS_REQUEST = 'TASKS_REQUEST';
7
- export const TASKS_FAILURE = 'TASKS_FAILURE';
8
4
  export const SELECT_ROWS = 'SELECT_ROWS';
9
5
  export const UNSELECT_ROWS = 'UNSELECT_ROWS';
10
6
  export const UNSELECT_ALL_ROWS = 'UNSELECT_ALL_ROWS';
11
- export const CANCEL = 'CANCEL';
12
- export const RESUME = 'RESUME';
7
+ export const TASKS_RESUME_REQUEST = 'TASKS_RESUME_REQUEST';
8
+ export const TASKS_RESUME_SUCCESS = 'TASKS_RESUME_SUCCESS';
9
+ export const TASKS_RESUME_FAILURE = 'TASKS_RESUME_FAILURE';
13
10
 
14
11
  export const CANCEL_CONFIRM_MODAL_ID = 'cancelConfirmModal';
15
12
  export const RESUME_CONFIRM_MODAL_ID = 'resumeConfirmModal';
@@ -17,4 +14,7 @@ export const CANCEL_SELECTED_CONFIRM_MODAL_ID = 'cancelSelectedConfirmModal';
17
14
  export const RESUME_SELECTED_CONFIRM_MODAL_ID = 'resumeSelectedConfirmModal';
18
15
  export const UPDATE_CLICKED = 'UPDATE_CLICKED';
19
16
 
20
- export const TASKS_SEARCH_PROPS = getControllerSearchProps('tasks');
17
+ export const TASKS_SEARCH_PROPS = {
18
+ ...getControllerSearchProps('tasks'),
19
+ controller: 'foreman_tasks/tasks'
20
+ };
@@ -14,8 +14,6 @@ import { resolveSearchQuery, addSearchToURL } from './TasksTableHelpers';
14
14
  import { ConfirmationModals } from './Components/ConfirmationModals';
15
15
  import {
16
16
  TASKS_SEARCH_PROPS,
17
- RESUME,
18
- CANCEL,
19
17
  CANCEL_SELECTED_CONFIRM_MODAL_ID,
20
18
  RESUME_SELECTED_CONFIRM_MODAL_ID,
21
19
  RESUME_CONFIRM_MODAL_ID,
@@ -24,23 +22,22 @@ import {
24
22
  import { ActionSelectButton } from './Components/ActionSelectButton';
25
23
  import './TasksTablePage.scss';
26
24
 
27
- const TasksTablePage = ({ getBreadcrumbs, history, clicked, ...props }) => {
25
+ const TasksTablePage = ({ getBreadcrumbs, history, clicked, createHeader, ...props }) => {
28
26
  const url = history.location.pathname + history.location.search;
29
27
  const uriQuery = getURIQuery(url);
30
28
  const onSearch = searchQuery => {
31
29
  resolveSearchQuery(searchQuery, history);
32
- props.getTableItems(url);
33
30
  };
34
31
 
35
- const getSelected = () => {
36
- const selected = props.results.filter(item =>
32
+ const getSelectedTasks = () => {
33
+ const selectedIDs = props.results.filter(item =>
37
34
  props.selectedRows.includes(item.id)
38
35
  );
39
- return selected.map(item => ({
36
+ return selectedIDs.map(item => ({
40
37
  name: item.action,
41
38
  id: item.id,
42
- isCancelleble: item.availableActions.cancellable,
43
- isResumeble: item.availableActions.resumable,
39
+ isCancellable: item.availableActions.cancellable,
40
+ isResumable: item.availableActions.resumable,
44
41
  }));
45
42
  };
46
43
 
@@ -55,30 +52,38 @@ const TasksTablePage = ({ getBreadcrumbs, history, clicked, ...props }) => {
55
52
  resumeModal: useForemanModal({ id: RESUME_CONFIRM_MODAL_ID }),
56
53
  };
57
54
 
55
+ const {
56
+ bulkCancel,
57
+ bulkResume,
58
+ cancelTask,
59
+ resumeTask,
60
+ parentTaskID,
61
+ } = props;
58
62
  const tasksActions = {
59
63
  cancelSelectedTasks: () => {
60
- props.actionSelected(CANCEL, getSelected(), url, props.parentTaskID);
64
+ bulkCancel({ selected: getSelectedTasks(), url, parentTaskID });
61
65
  },
62
66
  cancelTask: () => {
63
- props.cancelTask(
64
- clicked.taskId,
65
- clicked.taskName,
67
+ cancelTask({
68
+ taskId: clicked.taskId,
69
+ taskName: clicked.taskName,
66
70
  url,
67
- props.parentTaskID
68
- );
71
+ parentTaskID,
72
+ });
69
73
  },
70
74
  resumeSelectedTasks: () => {
71
- props.actionSelected(RESUME, getSelected(), url, props.parentTaskID);
75
+ bulkResume({ selected: getSelectedTasks(), url, parentTaskID });
72
76
  },
73
77
  resumeTask: () => {
74
- props.resumeTask(
75
- clicked.taskId,
76
- clicked.taskName,
78
+ resumeTask({
79
+ taskId: clicked.taskId,
80
+ taskName: clicked.taskName,
77
81
  url,
78
- props.parentTaskID
79
- );
82
+ parentTaskID,
83
+ });
80
84
  },
81
85
  };
86
+
82
87
  return (
83
88
  <div className="tasks-table-wrapper">
84
89
  <ConfirmationModals
@@ -90,6 +95,7 @@ const TasksTablePage = ({ getBreadcrumbs, history, clicked, ...props }) => {
90
95
  searchable
91
96
  searchProps={TASKS_SEARCH_PROPS}
92
97
  onSearch={onSearch}
98
+ header={createHeader(props.actionName)}
93
99
  breadcrumbOptions={getBreadcrumbs(props.actionName)}
94
100
  toastNotifications="foreman-tasks-cancel"
95
101
  toolbarButtons={
@@ -124,11 +130,13 @@ TasksTablePage.propTypes = {
124
130
  actionName: PropTypes.string,
125
131
  status: PropTypes.oneOf(Object.keys(STATUS)),
126
132
  history: PropTypes.object.isRequired,
127
- actionSelected: PropTypes.func.isRequired,
128
133
  cancelTask: PropTypes.func.isRequired,
129
134
  resumeTask: PropTypes.func.isRequired,
135
+ bulkCancel: PropTypes.func.isRequired,
136
+ bulkResume: PropTypes.func.isRequired,
130
137
  selectedRows: PropTypes.arrayOf(PropTypes.string),
131
138
  parentTaskID: PropTypes.string,
139
+ createHeader: PropTypes.func,
132
140
  clicked: PropTypes.shape({
133
141
  taskId: PropTypes.string,
134
142
  taskName: PropTypes.string,
@@ -142,6 +150,7 @@ TasksTablePage.defaultProps = {
142
150
  selectedRows: [],
143
151
  parentTaskID: null,
144
152
  clicked: {},
153
+ createHeader: () => __('Tasks'),
145
154
  };
146
155
 
147
156
  export default TasksTablePage;
@@ -6,7 +6,8 @@ export const minProps = {
6
6
  itemCount: 2,
7
7
  cancelTask: jest.fn(),
8
8
  resumeTask: jest.fn(),
9
- actionSelected: jest.fn(),
9
+ bulkCancel: jest.fn(),
10
+ bulkResume: jest.fn(),
10
11
  selectAllRows: jest.fn(),
11
12
  unselectAllRows: jest.fn(),
12
13
  selectRow: jest.fn(),
@@ -1,13 +1,14 @@
1
1
  import { testActionSnapshotWithFixtures } from '@theforeman/test';
2
2
  import API from 'foremanReact/API';
3
- import { TASKS_TABLE_ID, CANCEL, RESUME } from '../TasksTableConstants';
3
+ import { TASKS_TABLE_ID } from '../TasksTableConstants';
4
4
  import {
5
5
  getTableItems,
6
6
  cancelTask,
7
7
  cancelTaskRequest,
8
8
  resumeTask,
9
9
  resumeTaskRequest,
10
- actionSelected,
10
+ bulkCancel,
11
+ bulkResume,
11
12
  } from '../TasksTableActions';
12
13
 
13
14
  jest.mock('foremanReact/components/common/table', () => ({
@@ -18,10 +19,20 @@ jest.mock('foremanReact/API');
18
19
 
19
20
  API.post.mockImplementation(() => ({ data: 'some-data' }));
20
21
 
22
+ const taskInfo = {
23
+ taskId: 'some-id',
24
+ taskName: 'some-name',
25
+ };
26
+
27
+ const task = {
28
+ id: 'some-id',
29
+ name: 'some-name',
30
+ };
31
+
21
32
  const fixtures = {
22
- 'should cancelTask': () => cancelTask('some-id', 'some-name', 'some-url'),
33
+ 'should cancelTask': () => cancelTask({ ...taskInfo, url: 'some-url' }),
23
34
  'should cancelTaskRequest and succeed': () =>
24
- cancelTaskRequest('some-id', 'some-name', 'some-url'),
35
+ cancelTaskRequest('some-id', 'some-name'),
25
36
  'should cancelTaskRequest and fail': () => {
26
37
  API.post.mockImplementation(() =>
27
38
  Promise.reject(new Error('Network Error'))
@@ -29,60 +40,47 @@ const fixtures = {
29
40
  return cancelTaskRequest('some-id', 'some-name');
30
41
  },
31
42
 
32
- 'should resumeTask': () => resumeTask('some-id', 'some-name', 'some-url'),
43
+ 'should resumeTask': () => resumeTask({ ...taskInfo, url: 'some-url' }),
33
44
  'should resumeTaskRequest and succeed': () => {
34
45
  API.post.mockImplementation(() => ({ data: 'some-data' }));
35
- return resumeTaskRequest('some-id', 'some-name', 'some-url');
46
+ return resumeTaskRequest('some-id', 'some-name');
36
47
  },
37
48
  'should resumeTaskRequest and fail': () => {
38
49
  API.post.mockImplementation(() =>
39
50
  Promise.reject(new Error('Network Error'))
40
51
  );
41
- return resumeTaskRequest('some-id', 'some-name', 'some-url');
52
+ return resumeTaskRequest('some-id', 'some-name');
42
53
  },
43
- 'should actionSelected CANCEL not cancelleble': () => {
44
- const selected = [
45
- {
46
- id: '',
47
- name: '',
48
- isResumeble: false,
49
- isCancelleble: false,
50
- },
51
- ];
52
- return actionSelected(CANCEL, selected, 'some-url');
54
+ 'handles bulkResume requests that fail': () => {
55
+ const selected = [{ ...task, isResumable: true, isCancellable: false }];
56
+
57
+ API.post.mockImplementation(() =>
58
+ Promise.reject(new Error('Network Error'))
59
+ );
60
+ return bulkResume({ selected, url: 'some-url' });
53
61
  },
54
- 'should actionSelected CANCEL cancelleble': () => {
55
- const selected = [
56
- {
57
- id: '',
58
- name: '',
59
- isResumeble: false,
60
- isCancelleble: true,
62
+ 'handles resumable bulkResume requests': () => {
63
+ const selected = [{ ...task, isResumable: true, isCancellable: false }];
64
+
65
+ API.post.mockImplementation(() => ({
66
+ data: {
67
+ resumed: [{ action: 'I am resumed' }],
68
+ failed: [{ action: 'I am failed' }],
61
69
  },
62
- ];
63
- return actionSelected(CANCEL, selected, 'some-url');
70
+ }));
71
+ return bulkResume({ selected, url: 'some-url' });
64
72
  },
65
- 'should actionSelected RESUME not resumable': () => {
66
- const selected = [
67
- {
68
- id: '',
69
- name: '',
70
- isResumeble: false,
71
- isCancelleble: false,
72
- },
73
- ];
74
- return actionSelected(RESUME, selected, 'some-url');
73
+ 'handles bulkCancel requests': () => {
74
+ const selected = [{ ...task, isResumable: false, isCancellable: true }];
75
+ return bulkCancel({ selected, url: 'some-url' });
75
76
  },
76
- 'should actionSelected RESUME resumable': () => {
77
- const selected = [
78
- {
79
- id: '',
80
- name: '',
81
- isResumeble: true,
82
- isCancelleble: false,
83
- },
84
- ];
85
- return actionSelected(RESUME, selected, 'some-url');
77
+ 'handles bulkCancel requests that are not cancellable': () => {
78
+ const selected = [{ ...task, isResumable: false, isCancellable: false }];
79
+ return bulkCancel({ selected, url: 'some-url' });
80
+ },
81
+ 'handles bulkResume requests that are not resumable': () => {
82
+ const selected = [{ ...task, isResumable: false, isCancellable: false }];
83
+ return bulkResume({ selected, url: 'some-url' });
86
84
  },
87
85
  };
88
86
  describe('TasksTable actions', () => {
@@ -2,8 +2,10 @@
2
2
 
3
3
  exports[`SubTasksPage rendering render with minimal props 1`] = `
4
4
  <Connect(TasksTablePage)
5
- actionSelected={[MockFunction]}
5
+ bulkCancel={[MockFunction]}
6
+ bulkResume={[MockFunction]}
6
7
  cancelTask={[MockFunction]}
8
+ createHeader={[Function]}
7
9
  getBreadcrumbs={[MockFunction]}
8
10
  getTableItems={[MockFunction]}
9
11
  history={
@@ -2,7 +2,8 @@
2
2
 
3
3
  exports[`TasksIndexPage rendering render with minimal props 1`] = `
4
4
  <Connect(TasksTablePage)
5
- actionSelected={[MockFunction]}
5
+ bulkCancel={[MockFunction]}
6
+ bulkResume={[MockFunction]}
6
7
  cancelTask={[MockFunction]}
7
8
  getBreadcrumbs={[MockFunction]}
8
9
  getTableItems={[MockFunction]}
@@ -1,6 +1,6 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`TasksTable actions should actionSelected CANCEL cancelleble 1`] = `
3
+ exports[`TasksTable actions handles bulkCancel requests 1`] = `
4
4
  Array [
5
5
  Array [
6
6
  [Function],
@@ -14,7 +14,7 @@ Array [
14
14
  ]
15
15
  `;
16
16
 
17
- exports[`TasksTable actions should actionSelected CANCEL not cancelleble 1`] = `
17
+ exports[`TasksTable actions handles bulkCancel requests that are not cancellable 1`] = `
18
18
  Array [
19
19
  Array [
20
20
  Object {
@@ -30,7 +30,7 @@ Array [
30
30
  ]
31
31
  `;
32
32
 
33
- exports[`TasksTable actions should actionSelected RESUME not resumable 1`] = `
33
+ exports[`TasksTable actions handles bulkResume requests that are not resumable 1`] = `
34
34
  Array [
35
35
  Array [
36
36
  Object {
@@ -46,10 +46,66 @@ Array [
46
46
  ]
47
47
  `;
48
48
 
49
- exports[`TasksTable actions should actionSelected RESUME resumable 1`] = `
49
+ exports[`TasksTable actions handles bulkResume requests that fail 1`] = `
50
50
  Array [
51
51
  Array [
52
- [Function],
52
+ Object {
53
+ "type": "TASKS_RESUME_REQUEST",
54
+ },
55
+ ],
56
+ Array [
57
+ Object {
58
+ "error": [Error: Network Error],
59
+ "type": "TASKS_RESUME_FAILURE",
60
+ },
61
+ ],
62
+ Array [
63
+ Object {
64
+ "payload": Object {
65
+ "message": Object {
66
+ "message": "Cannot resume tasks at the moment Error: Network Error",
67
+ "type": "error",
68
+ },
69
+ },
70
+ "type": "TOASTS_ADD",
71
+ },
72
+ ],
73
+ ]
74
+ `;
75
+
76
+ exports[`TasksTable actions handles resumable bulkResume requests 1`] = `
77
+ Array [
78
+ Array [
79
+ Object {
80
+ "type": "TASKS_RESUME_REQUEST",
81
+ },
82
+ ],
83
+ Array [
84
+ Object {
85
+ "type": "TASKS_RESUME_SUCCESS",
86
+ },
87
+ ],
88
+ Array [
89
+ Object {
90
+ "payload": Object {
91
+ "message": Object {
92
+ "message": "I am resumed Task execution was resumed",
93
+ "type": "success",
94
+ },
95
+ },
96
+ "type": "TOASTS_ADD",
97
+ },
98
+ ],
99
+ Array [
100
+ Object {
101
+ "payload": Object {
102
+ "message": Object {
103
+ "message": "I am failed Task execution could not be resumed",
104
+ "type": "error",
105
+ },
106
+ },
107
+ "type": "TOASTS_ADD",
108
+ },
53
109
  ],
54
110
  Array [
55
111
  "TASKS_TABLE",
@@ -69,6 +69,7 @@ exports[`TasksTablePage rendering render with Breadcrubs 1`] = `
69
69
  ],
70
70
  }
71
71
  }
72
+ header="Tasks"
72
73
  onSearch={[Function]}
73
74
  searchProps={
74
75
  Object {
@@ -105,7 +106,8 @@ exports[`TasksTablePage rendering render with Breadcrubs 1`] = `
105
106
  >
106
107
  <TasksTable
107
108
  actionName=""
108
- actionSelected={[MockFunction]}
109
+ bulkCancel={[MockFunction]}
110
+ bulkResume={[MockFunction]}
109
111
  cancelTask={[MockFunction]}
110
112
  error={null}
111
113
  getTableItems={[MockFunction]}
@@ -225,6 +227,7 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
225
227
  parentTaskID={null}
226
228
  />
227
229
  }
230
+ header="Tasks"
228
231
  onSearch={[Function]}
229
232
  searchProps={
230
233
  Object {
@@ -261,7 +264,8 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
261
264
  >
262
265
  <TasksTable
263
266
  actionName=""
264
- actionSelected={[MockFunction]}
267
+ bulkCancel={[MockFunction]}
268
+ bulkResume={[MockFunction]}
265
269
  cancelTask={[MockFunction]}
266
270
  error={null}
267
271
  getTableItems={[MockFunction]}
metadata CHANGED
@@ -1,45 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman-tasks
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Nečas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-16 00:00:00.000000000 Z
11
+ date: 2020-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: foreman-tasks-core
14
+ name: dynflow
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 1.2.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 1.2.3
27
27
  - !ruby/object:Gem::Dependency
28
- name: dynflow
28
+ name: foreman-tasks-core
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.2.3
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.2.3
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: sinatra
42
+ name: get_process_mem
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.1.4
69
69
  - !ruby/object:Gem::Dependency
70
- name: get_process_mem
70
+ name: sinatra
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="