@opentrons/shared-data 0.0.1-alpha.20 → 0.0.1-alpha.21
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.
- package/package.json +1 -1
- package/js/__tests__/__snapshots__/pipettes.test.ts.snap +0 -5969
- package/js/__tests__/deckSchemas.test.ts +0 -87
- package/js/__tests__/errors.test.js +0 -21
- package/js/__tests__/getAreSlotsAdjacent.test.ts +0 -128
- package/js/__tests__/getWellNamePerMultiTip.test.ts +0 -162
- package/js/__tests__/labwareDefQuirks.test.ts +0 -37
- package/js/__tests__/labwareDefSchemaV1.test.ts +0 -82
- package/js/__tests__/labwareDefSchemaV2.test.ts +0 -298
- package/js/__tests__/moduleAccessors.test.ts +0 -50
- package/js/__tests__/moduleSpecsSchema.test.ts +0 -77
- package/js/__tests__/pipetteSchemaV2.test.ts +0 -107
- package/js/__tests__/pipetteSpecSchemas.test.ts +0 -48
- package/js/__tests__/pipettes.test.ts +0 -58
- package/js/__tests__/protocolSchemaV4.test.ts +0 -137
- package/js/__tests__/protocolSchemaV5.test.ts +0 -137
- package/js/__tests__/protocolSchemaV6.test.ts +0 -132
- package/js/__tests__/protocolSchemaV7.test.ts +0 -64
- package/js/__tests__/protocolValidation.test.ts +0 -83
- package/js/__tests__/sortWells.test.ts +0 -40
- package/js/__tests__/splitWellsOnColumn.test.ts +0 -21
- package/js/__tests__/validateErrors.test.js +0 -34
- package/js/constants.ts +0 -338
- package/js/cypressUtils.ts +0 -35
- package/js/errors.ts +0 -33
- package/js/fixtures.ts +0 -161
- package/js/getLabware.ts +0 -154
- package/js/gripper.ts +0 -29
- package/js/helpers/__tests__/getAdapterName.test.ts +0 -31
- package/js/helpers/__tests__/getDeckDefFromLoadedLabware.test.ts +0 -12
- package/js/helpers/__tests__/getVectorDifference.test.ts +0 -25
- package/js/helpers/__tests__/getVectorSum.test.ts +0 -21
- package/js/helpers/__tests__/labwareInference.test.ts +0 -84
- package/js/helpers/__tests__/orderWells.test.ts +0 -87
- package/js/helpers/__tests__/parseProtocolData.test.ts +0 -165
- package/js/helpers/__tests__/volume.test.ts +0 -108
- package/js/helpers/__tests__/wellSets.test.ts +0 -352
- package/js/helpers/get96Channel384WellPlateWells.ts +0 -44
- package/js/helpers/getAddressableAreasInProtocol.ts +0 -59
- package/js/helpers/getLoadedLabwareDefinitionsByUri.ts +0 -30
- package/js/helpers/getModuleVizDims.ts +0 -118
- package/js/helpers/getOccludedSlotCountForModule.ts +0 -13
- package/js/helpers/getVectorDifference.ts +0 -12
- package/js/helpers/getVectorSum.ts +0 -12
- package/js/helpers/getWellNamePerMultiTip.ts +0 -86
- package/js/helpers/getWellTotalVolume.ts +0 -16
- package/js/helpers/index.ts +0 -347
- package/js/helpers/labwareInference.ts +0 -92
- package/js/helpers/orderWells.ts +0 -69
- package/js/helpers/parseProtocolData.ts +0 -141
- package/js/helpers/volume.ts +0 -35
- package/js/helpers/wellIsRect.ts +0 -6
- package/js/helpers/wellSets.ts +0 -155
- package/js/index.ts +0 -14
- package/js/labwareTools/__tests__/__snapshots__/createIrregularLabware.test.ts.snap +0 -3
- package/js/labwareTools/__tests__/__snapshots__/createLabware.test.ts.snap +0 -3
- package/js/labwareTools/__tests__/createDefaultDisplayName.test.ts +0 -111
- package/js/labwareTools/__tests__/createIrregularLabware.test.ts +0 -226
- package/js/labwareTools/__tests__/createLabware.test.ts +0 -147
- package/js/labwareTools/index.ts +0 -452
- package/js/modules.ts +0 -97
- package/js/pipettes.ts +0 -89
- package/js/protocols.ts +0 -290
- package/js/schema.ts +0 -80
- package/js/scripts/generateDeckLayersFromSVG.js +0 -46
- package/js/titleCase.ts +0 -30
- package/js/types.ts +0 -600
- package/python/.coveragerc +0 -4
- package/python/.flake8 +0 -32
- package/python/Config.in +0 -10
- package/python/Makefile +0 -134
- package/python/Pipfile +0 -28
- package/python/Pipfile.lock +0 -645
- package/python/buildroot.mk +0 -30
- package/python/mypy.ini +0 -41
- package/python/opentrons_shared_data/__init__.py +0 -17
- package/python/opentrons_shared_data/_version.py +0 -20
- package/python/opentrons_shared_data/command/__init__.py +0 -52
- package/python/opentrons_shared_data/deck/__init__.py +0 -96
- package/python/opentrons_shared_data/deck/dev_types.py +0 -180
- package/python/opentrons_shared_data/errors/__init__.py +0 -30
- package/python/opentrons_shared_data/errors/categories.py +0 -60
- package/python/opentrons_shared_data/errors/codes.py +0 -108
- package/python/opentrons_shared_data/errors/exceptions.py +0 -915
- package/python/opentrons_shared_data/gripper/__init__.py +0 -63
- package/python/opentrons_shared_data/gripper/constants.py +0 -6
- package/python/opentrons_shared_data/gripper/gripper_definition.py +0 -101
- package/python/opentrons_shared_data/labware/__init__.py +0 -22
- package/python/opentrons_shared_data/labware/constants.py +0 -7
- package/python/opentrons_shared_data/labware/dev_types.py +0 -140
- package/python/opentrons_shared_data/labware/labware_definition.py +0 -328
- package/python/opentrons_shared_data/load.py +0 -57
- package/python/opentrons_shared_data/module/__init__.py +0 -74
- package/python/opentrons_shared_data/module/dev_types.py +0 -141
- package/python/opentrons_shared_data/pipette/__init__.py +0 -107
- package/python/opentrons_shared_data/pipette/dev_types.py +0 -177
- package/python/opentrons_shared_data/pipette/file_operation_helpers.py +0 -37
- package/python/opentrons_shared_data/pipette/load_data.py +0 -261
- package/python/opentrons_shared_data/pipette/model_constants.py +0 -123
- package/python/opentrons_shared_data/pipette/mutable_configurations.py +0 -431
- package/python/opentrons_shared_data/pipette/pipette_definition.py +0 -503
- package/python/opentrons_shared_data/pipette/pipette_load_name_conversions.py +0 -240
- package/python/opentrons_shared_data/pipette/scripts/__init__.py +0 -0
- package/python/opentrons_shared_data/pipette/scripts/build_json_script.py +0 -469
- package/python/opentrons_shared_data/pipette/scripts/update_configuration_files.py +0 -450
- package/python/opentrons_shared_data/pipette/types.py +0 -193
- package/python/opentrons_shared_data/protocol/__init__.py +0 -13
- package/python/opentrons_shared_data/protocol/constants.py +0 -98
- package/python/opentrons_shared_data/protocol/dev_types.py +0 -436
- package/python/opentrons_shared_data/protocol/models/__init__.py +0 -48
- package/python/opentrons_shared_data/protocol/models/protocol_schema_v6.py +0 -145
- package/python/opentrons_shared_data/protocol/models/protocol_schema_v7.py +0 -95
- package/python/opentrons_shared_data/protocol/models/protocol_schema_v8.py +0 -110
- package/python/opentrons_shared_data/protocol/models/shared_models.py +0 -111
- package/python/opentrons_shared_data/py.typed +0 -0
- package/python/opentrons_shared_data/robot/__init__.py +0 -33
- package/python/opentrons_shared_data/robot/dev_types.py +0 -37
- package/python/pytest.ini +0 -2
- package/python/setup.cfg +0 -5
- package/python/setup.py +0 -179
- package/python/tests/__init__.py +0 -1
- package/python/tests/conftest.py +0 -0
- package/python/tests/deck/__init__.py +0 -0
- package/python/tests/deck/test_list_names.py +0 -12
- package/python/tests/deck/test_position.py +0 -113
- package/python/tests/deck/test_typechecks.py +0 -28
- package/python/tests/errors/__init__.py +0 -1
- package/python/tests/errors/test_error_completeness.py +0 -19
- package/python/tests/errors/test_exceptions.py +0 -74
- package/python/tests/gripper/__init__.py +0 -0
- package/python/tests/gripper/test_definition.py +0 -30
- package/python/tests/gripper/test_load.py +0 -16
- package/python/tests/labware/__init__.py +0 -13
- package/python/tests/labware/test_typechecks.py +0 -21
- package/python/tests/module/__init__.py +0 -20
- package/python/tests/module/test_load.py +0 -49
- package/python/tests/module/test_typechecks.py +0 -34
- package/python/tests/pipette/__init__.py +0 -0
- package/python/tests/pipette/test_load_data.py +0 -103
- package/python/tests/pipette/test_mutable_configurations.py +0 -266
- package/python/tests/pipette/test_pipette_definition.py +0 -183
- package/python/tests/pipette/test_pipette_load_name_conversions.py +0 -222
- package/python/tests/pipette/test_typechecks.py +0 -50
- package/python/tests/pipette/test_validate_schema.py +0 -37
- package/python/tests/protocol/__init__.py +0 -15
- package/python/tests/protocol/test_protocol_schema_v6.py +0 -107
- package/python/tests/protocol/test_protocol_schema_v7.py +0 -34
- package/python/tests/protocol/test_protocol_schema_v8.py +0 -20
- package/python/tests/protocol/test_typechecks.py +0 -36
- package/python/tests/robot/__init__.py +0 -0
- package/python/tests/robot/test_typechecks.py +0 -20
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
import path from 'path'
|
|
2
|
-
import glob from 'glob'
|
|
3
|
-
import Ajv from 'ajv'
|
|
4
|
-
|
|
5
|
-
import schema from '../../labware/schemas/2.json'
|
|
6
|
-
import type { LabwareDefinition2, LabwareWell } from '../types'
|
|
7
|
-
|
|
8
|
-
const definitionsDir = path.join(__dirname, '../../labware/definitions/2')
|
|
9
|
-
const fixturesDir = path.join(__dirname, '../../labware/fixtures/2')
|
|
10
|
-
const globPattern = '**/*.json'
|
|
11
|
-
|
|
12
|
-
// JSON Schema definition & setup
|
|
13
|
-
const ajv = new Ajv({ allErrors: true, jsonPointers: true })
|
|
14
|
-
const validate = ajv.compile(schema)
|
|
15
|
-
|
|
16
|
-
const generateStandardWellNames = (
|
|
17
|
-
rowCount: number,
|
|
18
|
-
columnCount: number
|
|
19
|
-
): Set<string> => {
|
|
20
|
-
const result = new Set<string>()
|
|
21
|
-
|
|
22
|
-
for (let column = 0; column < columnCount; column++) {
|
|
23
|
-
for (let row = 0; row < rowCount; row++) {
|
|
24
|
-
const columnName = (column + 1).toString()
|
|
25
|
-
const rowName = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[row]
|
|
26
|
-
result.add(rowName + columnName)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return result
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const standard24WellNames = generateStandardWellNames(4, 6)
|
|
34
|
-
const standard96WellNames = generateStandardWellNames(8, 12)
|
|
35
|
-
const standard384WellNames = generateStandardWellNames(16, 24)
|
|
36
|
-
|
|
37
|
-
// Wells whose tops lie above the labware's zDimension.
|
|
38
|
-
// These are known bugs in the labware definition. See Jira RSS-202.
|
|
39
|
-
const expectedWellsHigherThanZDimension: Record<string, Set<string>> = {
|
|
40
|
-
'geb_96_tiprack_10ul/1.json': standard96WellNames,
|
|
41
|
-
'opentrons_24_aluminumblock_generic_2ml_screwcap/1.json': standard24WellNames,
|
|
42
|
-
'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/1.json': standard24WellNames,
|
|
43
|
-
'opentrons_96_aluminumblock_generic_pcr_strip_200ul/1.json': standard96WellNames,
|
|
44
|
-
'opentrons_96_filtertiprack_200ul/1.json': standard96WellNames,
|
|
45
|
-
'opentrons_96_tiprack_300ul/1.json': standard96WellNames,
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Wells whose tops do not lie exactly at the labware's zDimension.
|
|
49
|
-
//
|
|
50
|
-
// There are legitimate reasons for this to happen, but it can also be a dangerous bug
|
|
51
|
-
// in the labware definition. So if it happens, it needs to be justified here.
|
|
52
|
-
const expectedWellsNotMatchingZDimension: Record<string, Set<string>> = {
|
|
53
|
-
...expectedWellsHigherThanZDimension,
|
|
54
|
-
|
|
55
|
-
// These height mismatches are legitimate.
|
|
56
|
-
// These tube racks simultaneously hold tubes of different heights.
|
|
57
|
-
// The labware's zDimension should match the height of the taller tubes,
|
|
58
|
-
// not the shorter tubes listed here.
|
|
59
|
-
'opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/1.json': new Set([
|
|
60
|
-
'A3',
|
|
61
|
-
'B3',
|
|
62
|
-
'A4',
|
|
63
|
-
'B4',
|
|
64
|
-
]),
|
|
65
|
-
'opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic/1.json': new Set([
|
|
66
|
-
'A3',
|
|
67
|
-
'B3',
|
|
68
|
-
'A4',
|
|
69
|
-
'B4',
|
|
70
|
-
]),
|
|
71
|
-
'opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/1.json': new Set([
|
|
72
|
-
'A3',
|
|
73
|
-
'B3',
|
|
74
|
-
'A4',
|
|
75
|
-
'B4',
|
|
76
|
-
]),
|
|
77
|
-
|
|
78
|
-
// These height mismatches are legitimate. The zDimension should match the taller side.
|
|
79
|
-
'opentrons_calibrationblock_short_side_left/1.json': new Set(['A1']),
|
|
80
|
-
'opentrons_calibrationblock_short_side_right/1.json': new Set(['A2']),
|
|
81
|
-
|
|
82
|
-
// These height mismatches need to be investigated. See Jira RSS-202.
|
|
83
|
-
// Each one should either be explained here or marked as a known bug.
|
|
84
|
-
'nest_1_reservoir_195ml/1.json': new Set(['A1']),
|
|
85
|
-
'nest_1_reservoir_195ml/2.json': new Set(['A1']),
|
|
86
|
-
'opentrons_40_aluminumblock_eppendorf_24x2ml_safelock_snapcap_generic_16x0.2ml_pcr_strip/1.json': new Set(
|
|
87
|
-
[
|
|
88
|
-
'A3',
|
|
89
|
-
'B3',
|
|
90
|
-
'C3',
|
|
91
|
-
'D3',
|
|
92
|
-
'A4',
|
|
93
|
-
'B4',
|
|
94
|
-
'C4',
|
|
95
|
-
'D4',
|
|
96
|
-
'A5',
|
|
97
|
-
'B5',
|
|
98
|
-
'C5',
|
|
99
|
-
'D5',
|
|
100
|
-
'A6',
|
|
101
|
-
'B6',
|
|
102
|
-
'C6',
|
|
103
|
-
'D6',
|
|
104
|
-
'A7',
|
|
105
|
-
'B7',
|
|
106
|
-
'C7',
|
|
107
|
-
'D7',
|
|
108
|
-
'A8',
|
|
109
|
-
'B8',
|
|
110
|
-
'C8',
|
|
111
|
-
'D8',
|
|
112
|
-
]
|
|
113
|
-
),
|
|
114
|
-
'opentrons_96_flat_bottom_adapter_nest_wellplate_200ul_flat/1.json': standard96WellNames,
|
|
115
|
-
'opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/1.json': standard96WellNames,
|
|
116
|
-
'opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat/1.json': standard384WellNames,
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const filterWells = (
|
|
120
|
-
labwareDef: LabwareDefinition2,
|
|
121
|
-
predicate: (wellDef: LabwareWell) => boolean
|
|
122
|
-
): Set<string> => {
|
|
123
|
-
return new Set(
|
|
124
|
-
Object.entries(labwareDef.wells)
|
|
125
|
-
.filter(([wellName, wellDef]) => predicate(wellDef))
|
|
126
|
-
.map(([wellName, wellDef]) => wellName)
|
|
127
|
-
)
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const getWellsNotMatchingZDimension = (
|
|
131
|
-
labwareDef: LabwareDefinition2
|
|
132
|
-
): Set<string> => {
|
|
133
|
-
return filterWells(labwareDef, wellDef => {
|
|
134
|
-
const absDifference = Math.abs(
|
|
135
|
-
wellDef.depth + wellDef.z - labwareDef.dimensions.zDimension
|
|
136
|
-
)
|
|
137
|
-
return absDifference > 0.000001 // Tolerate floating point rounding errors.
|
|
138
|
-
})
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const getWellsHigherThanZDimension = (
|
|
142
|
-
labwareDef: LabwareDefinition2
|
|
143
|
-
): Set<string> => {
|
|
144
|
-
return filterWells(labwareDef, wellDef => {
|
|
145
|
-
const difference =
|
|
146
|
-
wellDef.depth + wellDef.z - labwareDef.dimensions.zDimension
|
|
147
|
-
return difference > 0.000001 // Tolerate floating point rounding errors.
|
|
148
|
-
})
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const expectGroupsFollowConvention = (
|
|
152
|
-
labwareDef: LabwareDefinition2,
|
|
153
|
-
filename: string
|
|
154
|
-
): void => {
|
|
155
|
-
test(`${filename} should not contain "groups.brand.brand" that matches the top-level "brand.brand"`, () => {
|
|
156
|
-
const topLevelBrand = labwareDef.brand
|
|
157
|
-
|
|
158
|
-
labwareDef.groups.forEach(group => {
|
|
159
|
-
expect(group.brand?.brand).not.toEqual(topLevelBrand)
|
|
160
|
-
})
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
test(`${filename} should not specify certain fields in 'groups' if it is a reservoir or wellPlate`, () => {
|
|
164
|
-
const { displayCategory } = labwareDef.metadata
|
|
165
|
-
const noGroupsMetadataAllowed =
|
|
166
|
-
displayCategory === 'reservoir' || displayCategory === 'wellPlate'
|
|
167
|
-
|
|
168
|
-
if (noGroupsMetadataAllowed) {
|
|
169
|
-
labwareDef.groups.forEach(group => {
|
|
170
|
-
/* eslint-disable jest/no-conditional-expect */
|
|
171
|
-
expect(group.brand).toBe(undefined)
|
|
172
|
-
expect(group.metadata.displayName).toBe(undefined)
|
|
173
|
-
expect(group.metadata.displayCategory).toBe(undefined)
|
|
174
|
-
})
|
|
175
|
-
}
|
|
176
|
-
})
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
test('fail on bad labware', () => {
|
|
180
|
-
const badDef = {
|
|
181
|
-
metadata: { name: 'bad' },
|
|
182
|
-
ordering: ['A1'],
|
|
183
|
-
// array of strings not array of arrays
|
|
184
|
-
wells: {},
|
|
185
|
-
}
|
|
186
|
-
const valid = validate(badDef)
|
|
187
|
-
const validationErrors = validate.errors
|
|
188
|
-
|
|
189
|
-
expect(
|
|
190
|
-
validationErrors?.find(err => err.dataPath === '/ordering/0')
|
|
191
|
-
).toMatchObject({
|
|
192
|
-
message: 'should be array',
|
|
193
|
-
})
|
|
194
|
-
expect(valid).toBe(false)
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
describe('test schemas of all opentrons definitions', () => {
|
|
198
|
-
const labwarePaths = glob.sync(globPattern, { cwd: definitionsDir })
|
|
199
|
-
|
|
200
|
-
beforeAll(() => {
|
|
201
|
-
// Make sure definitions path didn't break, which would give you false positives
|
|
202
|
-
expect(labwarePaths.length).toBeGreaterThan(0)
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
labwarePaths.forEach(labwarePath => {
|
|
206
|
-
const filename = path.parse(labwarePath).base
|
|
207
|
-
const fullLabwarePath = path.join(definitionsDir, labwarePath)
|
|
208
|
-
const labwareDef = require(fullLabwarePath) as LabwareDefinition2
|
|
209
|
-
|
|
210
|
-
it(`${filename} validates against schema`, () => {
|
|
211
|
-
const valid = validate(labwareDef)
|
|
212
|
-
const validationErrors = validate.errors
|
|
213
|
-
expect(validationErrors).toBe(null)
|
|
214
|
-
expect(valid).toBe(true)
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
it(`file name matches version: ${labwarePath}`, () => {
|
|
218
|
-
expect(`${labwareDef.version}`).toEqual(path.basename(filename, '.json'))
|
|
219
|
-
})
|
|
220
|
-
|
|
221
|
-
it(`parent dir matches loadName: ${labwarePath}`, () => {
|
|
222
|
-
expect(labwareDef.parameters.loadName).toEqual(
|
|
223
|
-
path.basename(path.dirname(labwarePath))
|
|
224
|
-
)
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
it(`namespace is "opentrons": ${labwarePath}`, () => {
|
|
228
|
-
expect(labwareDef.namespace).toEqual('opentrons')
|
|
229
|
-
})
|
|
230
|
-
|
|
231
|
-
if (labwareDef.parameters.loadName !== 'nest_96_wellplate_2ml_deep') {
|
|
232
|
-
// TODO(IL, 2020-06-22): make nest_96_wellplate_2ml_deep confirm to groups convention
|
|
233
|
-
expectGroupsFollowConvention(labwareDef, labwarePath)
|
|
234
|
-
}
|
|
235
|
-
})
|
|
236
|
-
})
|
|
237
|
-
|
|
238
|
-
describe('test that the dimensions in all opentrons definitions make sense', () => {
|
|
239
|
-
const labwarePaths = glob.sync('**/*.json', { cwd: definitionsDir })
|
|
240
|
-
|
|
241
|
-
beforeAll(() => {
|
|
242
|
-
// Make sure definitions path didn't break, which would give you false positives
|
|
243
|
-
expect(labwarePaths.length).toBeGreaterThan(0)
|
|
244
|
-
})
|
|
245
|
-
|
|
246
|
-
describe.each(labwarePaths)('%s', labwarePath => {
|
|
247
|
-
const fullLabwarePath = path.join(definitionsDir, labwarePath)
|
|
248
|
-
const labwareDef = require(fullLabwarePath) as LabwareDefinition2
|
|
249
|
-
|
|
250
|
-
const expectedWellsNotMatching =
|
|
251
|
-
expectedWellsNotMatchingZDimension[labwarePath] ?? new Set()
|
|
252
|
-
it(`has the expected ${expectedWellsNotMatching.size} wells not matching the labware's zDimension`, () => {
|
|
253
|
-
const wellsNotMatching = getWellsNotMatchingZDimension(labwareDef)
|
|
254
|
-
expect(wellsNotMatching).toEqual(expectedWellsNotMatching)
|
|
255
|
-
})
|
|
256
|
-
|
|
257
|
-
const expectedWellsHigher =
|
|
258
|
-
expectedWellsHigherThanZDimension[labwarePath] ?? new Set()
|
|
259
|
-
it(`has the expected ${expectedWellsHigher.size} wells above the labware's zDimension`, () => {
|
|
260
|
-
const wellsHigher = getWellsHigherThanZDimension(labwareDef)
|
|
261
|
-
expect(wellsHigher).toEqual(expectedWellsHigher)
|
|
262
|
-
})
|
|
263
|
-
})
|
|
264
|
-
})
|
|
265
|
-
|
|
266
|
-
describe('test schemas of all v2 labware fixtures', () => {
|
|
267
|
-
const labwarePaths = glob.sync(globPattern, { cwd: fixturesDir })
|
|
268
|
-
|
|
269
|
-
beforeAll(() => {
|
|
270
|
-
// Make sure fixtures path didn't break, which would give you false positives
|
|
271
|
-
expect(labwarePaths.length).toBeGreaterThan(0)
|
|
272
|
-
})
|
|
273
|
-
|
|
274
|
-
labwarePaths.forEach(labwarePath => {
|
|
275
|
-
const filename = path.parse(labwarePath).base
|
|
276
|
-
const fullLabwarePath = path.join(fixturesDir, labwarePath)
|
|
277
|
-
const labwareDef = require(fullLabwarePath) as LabwareDefinition2
|
|
278
|
-
|
|
279
|
-
it(`${filename} validates against schema`, () => {
|
|
280
|
-
const valid = validate(labwareDef)
|
|
281
|
-
const validationErrors = validate.errors
|
|
282
|
-
expect(validationErrors).toBe(null)
|
|
283
|
-
expect(valid).toBe(true)
|
|
284
|
-
})
|
|
285
|
-
|
|
286
|
-
it(`fixture file name matches loadName: ${labwarePath}`, () => {
|
|
287
|
-
expect(labwareDef.parameters.loadName).toEqual(
|
|
288
|
-
path.basename(filename, '.json')
|
|
289
|
-
)
|
|
290
|
-
})
|
|
291
|
-
|
|
292
|
-
it(`namespace is "fixture": ${labwarePath}`, () => {
|
|
293
|
-
expect(labwareDef.namespace).toEqual('fixture')
|
|
294
|
-
})
|
|
295
|
-
|
|
296
|
-
expectGroupsFollowConvention(labwareDef, filename)
|
|
297
|
-
})
|
|
298
|
-
})
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getModuleDef2,
|
|
3
|
-
getModuleType,
|
|
4
|
-
getModuleDisplayName,
|
|
5
|
-
normalizeModuleModel,
|
|
6
|
-
} from '../modules'
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
MODULE_MODELS,
|
|
10
|
-
MODULE_TYPES,
|
|
11
|
-
TEMPDECK,
|
|
12
|
-
MAGDECK,
|
|
13
|
-
THERMOCYCLER,
|
|
14
|
-
MAGNETIC_MODULE_V1,
|
|
15
|
-
TEMPERATURE_MODULE_V1,
|
|
16
|
-
THERMOCYCLER_MODULE_V1,
|
|
17
|
-
} from '../constants'
|
|
18
|
-
|
|
19
|
-
describe('all valid models work', () => {
|
|
20
|
-
MODULE_MODELS.forEach(model => {
|
|
21
|
-
const loadedDef = getModuleDef2(model)
|
|
22
|
-
|
|
23
|
-
it('ensure valid models load', () => {
|
|
24
|
-
expect(loadedDef).not.toBeNull()
|
|
25
|
-
expect(loadedDef?.model).toEqual(model)
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('valid models have valid module types', () => {
|
|
29
|
-
expect(getModuleType(model)).toEqual(loadedDef.moduleType)
|
|
30
|
-
expect(MODULE_TYPES).toContain(getModuleType(model))
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('valid modules have display names that match the def', () => {
|
|
34
|
-
expect(getModuleDisplayName(model)).toEqual(loadedDef.displayName)
|
|
35
|
-
})
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
describe('legacy models work too', () => {
|
|
40
|
-
const legacyEquivs = [
|
|
41
|
-
[TEMPDECK, TEMPERATURE_MODULE_V1],
|
|
42
|
-
[MAGDECK, MAGNETIC_MODULE_V1],
|
|
43
|
-
[THERMOCYCLER, THERMOCYCLER_MODULE_V1],
|
|
44
|
-
] as const
|
|
45
|
-
|
|
46
|
-
legacyEquivs.forEach(([legacy, modern]) => {
|
|
47
|
-
const fromLegacy = normalizeModuleModel(legacy)
|
|
48
|
-
expect(fromLegacy).toEqual(modern)
|
|
49
|
-
})
|
|
50
|
-
})
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import Ajv from 'ajv'
|
|
2
|
-
import moduleSpecsSchemaV1 from '../../module/schemas/1.json'
|
|
3
|
-
import moduleSpecsV1 from '../../module/definitions/1.json'
|
|
4
|
-
import moduleSpecsSchemaV2 from '../../module/schemas/2.json'
|
|
5
|
-
import moduleSpecsSchemaV3 from '../../module/schemas/3.json'
|
|
6
|
-
import path from 'path'
|
|
7
|
-
import glob from 'glob'
|
|
8
|
-
|
|
9
|
-
const ajv = new Ajv({ allErrors: true, jsonPointers: true })
|
|
10
|
-
const validateModuleSpecsV1 = ajv.compile(moduleSpecsSchemaV1)
|
|
11
|
-
const validateModuleSpecsV2 = ajv.compile(moduleSpecsSchemaV2)
|
|
12
|
-
const validateModuleSpecsV3 = ajv.compile(moduleSpecsSchemaV3)
|
|
13
|
-
|
|
14
|
-
const V2_DEFS_GLOB_PATTERN = '../../module/definitions/2/*.json'
|
|
15
|
-
const V3_DEFS_GLOB_PATTERN = '../../module/definitions/3/*.json'
|
|
16
|
-
|
|
17
|
-
const GLOB_OPTIONS = { cwd: __dirname, absolute: true }
|
|
18
|
-
|
|
19
|
-
const V2_MODULE_PATHS = glob.sync(V2_DEFS_GLOB_PATTERN, GLOB_OPTIONS)
|
|
20
|
-
const V3_MODULE_PATHS = glob.sync(V3_DEFS_GLOB_PATTERN, GLOB_OPTIONS)
|
|
21
|
-
|
|
22
|
-
describe('validate all module specs with schema', () => {
|
|
23
|
-
beforeAll(() => {
|
|
24
|
-
expect(V2_MODULE_PATHS).not.toHaveLength(0)
|
|
25
|
-
expect(V3_MODULE_PATHS).not.toHaveLength(0)
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('ensure V1 module specs match the V1 JSON schema', () => {
|
|
29
|
-
const valid = validateModuleSpecsV1(moduleSpecsV1)
|
|
30
|
-
const validationErrors = validateModuleSpecsV1.errors
|
|
31
|
-
|
|
32
|
-
expect(validationErrors).toBe(null)
|
|
33
|
-
expect(valid).toBe(true)
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
V2_MODULE_PATHS.forEach(modulePath => {
|
|
37
|
-
const filename = path.parse(modulePath).name
|
|
38
|
-
const moduleDef = require(modulePath)
|
|
39
|
-
|
|
40
|
-
it(`${filename} validates against schema`, () => {
|
|
41
|
-
const valid = validateModuleSpecsV2(moduleDef)
|
|
42
|
-
const validationErrors = validateModuleSpecsV2.errors
|
|
43
|
-
|
|
44
|
-
expect(validationErrors).toBe(null)
|
|
45
|
-
expect(valid).toBe(true)
|
|
46
|
-
})
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
V3_MODULE_PATHS.forEach(modulePath => {
|
|
50
|
-
const filename = path.parse(modulePath).name
|
|
51
|
-
const moduleDef = require(modulePath)
|
|
52
|
-
|
|
53
|
-
it(`validates ${filename} against schema`, () => {
|
|
54
|
-
const valid = validateModuleSpecsV3(moduleDef)
|
|
55
|
-
const validationErrors = validateModuleSpecsV3.errors
|
|
56
|
-
|
|
57
|
-
expect(validationErrors).toBe(null)
|
|
58
|
-
expect(valid).toBe(true)
|
|
59
|
-
})
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it('validate each module specs model matches its filename', () => {
|
|
63
|
-
V2_MODULE_PATHS.forEach(modulePath => {
|
|
64
|
-
const filename = path.parse(modulePath).name
|
|
65
|
-
const moduleDef = require(modulePath)
|
|
66
|
-
|
|
67
|
-
expect(moduleDef.model).toEqual(filename)
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
V3_MODULE_PATHS.forEach(modulePath => {
|
|
71
|
-
const filename = path.parse(modulePath).name
|
|
72
|
-
const moduleDef = require(modulePath)
|
|
73
|
-
|
|
74
|
-
expect(moduleDef.model).toEqual(filename)
|
|
75
|
-
})
|
|
76
|
-
})
|
|
77
|
-
})
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import Ajv from 'ajv'
|
|
2
|
-
import glob from 'glob'
|
|
3
|
-
import path from 'path'
|
|
4
|
-
|
|
5
|
-
import liquidSpecsSchema from '../../pipette/schemas/2/pipetteLiquidPropertiesSchema.json'
|
|
6
|
-
import geometrySpecsSchema from '../../pipette/schemas/2/pipetteGeometrySchema.json'
|
|
7
|
-
import generalSpecsSchema from '../../pipette/schemas/2/pipettePropertiesSchema.json'
|
|
8
|
-
|
|
9
|
-
const allGeometryDefinitions = path.join(
|
|
10
|
-
__dirname,
|
|
11
|
-
'../../pipette/definitions/2/geometry/**/**/*.json'
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
const allGeneralDefinitions = path.join(
|
|
15
|
-
__dirname,
|
|
16
|
-
'../../pipette/definitions/2/general/**/**/*.json'
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
const allLiquidDefinitions = path.join(
|
|
20
|
-
__dirname,
|
|
21
|
-
'../../pipette/definitions/2/liquid/**/**/*.json'
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
const ajv = new Ajv({ allErrors: true, jsonPointers: true })
|
|
25
|
-
|
|
26
|
-
const validateLiquidSpecs = ajv.compile(liquidSpecsSchema)
|
|
27
|
-
const validateGeometrySpecs = ajv.compile(geometrySpecsSchema)
|
|
28
|
-
const validateGeneralSpecs = ajv.compile(generalSpecsSchema)
|
|
29
|
-
|
|
30
|
-
describe('test schema against all liquid specs definitions', () => {
|
|
31
|
-
const liquidPaths = glob.sync(allLiquidDefinitions)
|
|
32
|
-
// Make sure definitions path didn't break, which would give you false positives
|
|
33
|
-
expect(liquidPaths.length).toBeGreaterThan(0)
|
|
34
|
-
|
|
35
|
-
liquidPaths.forEach(liquidPath => {
|
|
36
|
-
const liquidDef = require(liquidPath)
|
|
37
|
-
|
|
38
|
-
it(`${liquidPath} validates against schema`, () => {
|
|
39
|
-
const valid = validateLiquidSpecs(liquidDef)
|
|
40
|
-
const validationErrors = validateLiquidSpecs.errors
|
|
41
|
-
expect(validationErrors).toBe(null)
|
|
42
|
-
expect(valid).toBe(true)
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it(`parent dir matches a liquid class: ${liquidPath}`, () => {
|
|
46
|
-
expect(['default', 'lowVolumeDefault']).toContain(
|
|
47
|
-
path.basename(path.dirname(liquidPath))
|
|
48
|
-
)
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it(`second parent dir matches pipette model: ${liquidPath}`, () => {
|
|
52
|
-
expect(['p10', 'p20', 'p50', 'p300', 'p1000']).toContain(
|
|
53
|
-
path.basename(path.dirname(path.dirname(liquidPath)))
|
|
54
|
-
)
|
|
55
|
-
})
|
|
56
|
-
})
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
describe('test schema against all geometry specs definitions', () => {
|
|
60
|
-
const geometryPaths = glob.sync(allGeometryDefinitions)
|
|
61
|
-
// Make sure definitions path didn't break, which would give you false positives
|
|
62
|
-
expect(geometryPaths.length).toBeGreaterThan(0)
|
|
63
|
-
geometryPaths.forEach(geometryPath => {
|
|
64
|
-
const geometryDef = require(geometryPath)
|
|
65
|
-
const geometryParentDir = path.dirname(geometryPath)
|
|
66
|
-
|
|
67
|
-
it(`${geometryPath} validates against schema`, () => {
|
|
68
|
-
const valid = validateGeometrySpecs(geometryDef)
|
|
69
|
-
const validationErrors = validateGeometrySpecs.errors
|
|
70
|
-
expect(validationErrors).toBe(null)
|
|
71
|
-
expect(valid).toBe(true)
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
it(`parent dir matches pipette model: ${geometryPath}`, () => {
|
|
75
|
-
expect(['p10', 'p20', 'p50', 'p300', 'p1000']).toContain(
|
|
76
|
-
path.basename(path.dirname(geometryPath))
|
|
77
|
-
)
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
it(`parent directory contains a gltf file: ${geometryPath}`, () => {
|
|
81
|
-
const gltf_file = glob.sync(path.join(geometryParentDir, '*.gltf'))
|
|
82
|
-
expect(gltf_file.length).toBeGreaterThan(0)
|
|
83
|
-
expect(gltf_file).toBeDefined()
|
|
84
|
-
})
|
|
85
|
-
})
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
describe('test schema against all general specs definitions', () => {
|
|
89
|
-
const generalPaths = glob.sync(allGeneralDefinitions)
|
|
90
|
-
expect(generalPaths.length).toBeGreaterThan(0)
|
|
91
|
-
|
|
92
|
-
generalPaths.forEach(generalPath => {
|
|
93
|
-
it(`${generalPath} validates against schema`, () => {
|
|
94
|
-
const generalDef = require(generalPath)
|
|
95
|
-
const valid = validateGeneralSpecs(generalDef)
|
|
96
|
-
const validationErrors = validateGeneralSpecs.errors
|
|
97
|
-
expect(validationErrors).toBe(null)
|
|
98
|
-
expect(valid).toBe(true)
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
it(`parent dir matches pipette model: ${generalPath}`, () => {
|
|
102
|
-
expect(['p10', 'p20', 'p50', 'p300', 'p1000']).toContain(
|
|
103
|
-
path.basename(path.dirname(generalPath))
|
|
104
|
-
)
|
|
105
|
-
})
|
|
106
|
-
})
|
|
107
|
-
})
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import Ajv from 'ajv'
|
|
2
|
-
import nameSpecsSchema from '../../pipette/schemas/1/pipetteNameSpecsSchema.json'
|
|
3
|
-
import modelSpecsSchema from '../../pipette/schemas/1/pipetteModelSpecsSchema.json'
|
|
4
|
-
import pipetteNameSpecs from '../../pipette/definitions/1/pipetteNameSpecs.json'
|
|
5
|
-
import pipetteModelSpecs from '../../pipette/definitions/1/pipetteModelSpecs.json'
|
|
6
|
-
|
|
7
|
-
const ajv = new Ajv({ allErrors: true, jsonPointers: true })
|
|
8
|
-
|
|
9
|
-
const validateNameSpecs = ajv.compile(nameSpecsSchema)
|
|
10
|
-
const validateModelSpecs = ajv.compile(modelSpecsSchema)
|
|
11
|
-
|
|
12
|
-
describe('validate pipette specs with JSON schemas', () => {
|
|
13
|
-
it('ensure all pipette *NAME* specs match name JSON schema', () => {
|
|
14
|
-
const valid = validateNameSpecs(pipetteNameSpecs)
|
|
15
|
-
const validationErrors = validateNameSpecs.errors
|
|
16
|
-
|
|
17
|
-
if (validationErrors) {
|
|
18
|
-
console.log(JSON.stringify(validationErrors, null, 4))
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
expect(validationErrors).toBe(null)
|
|
22
|
-
expect(valid).toBe(true)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('ensure all pipette *MODEL* specs match model JSON schema', () => {
|
|
26
|
-
const valid = validateModelSpecs(pipetteModelSpecs)
|
|
27
|
-
const validationErrors = validateModelSpecs.errors
|
|
28
|
-
|
|
29
|
-
if (validationErrors) {
|
|
30
|
-
console.log(JSON.stringify(validationErrors, null, 4))
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
expect(validationErrors).toBe(null)
|
|
34
|
-
expect(valid).toBe(true)
|
|
35
|
-
})
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
describe('model -> name referencing', () => {
|
|
39
|
-
it('ensure all pipette model specs reference a valid pipette name', () => {
|
|
40
|
-
const modelConfigs = Object.values(pipetteModelSpecs.config)
|
|
41
|
-
const nameKeys = Object.keys(pipetteNameSpecs)
|
|
42
|
-
|
|
43
|
-
modelConfigs.forEach(config => {
|
|
44
|
-
const nameForVersion = config.name
|
|
45
|
-
expect(nameKeys).toContain(nameForVersion)
|
|
46
|
-
})
|
|
47
|
-
})
|
|
48
|
-
})
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
// tests for pipette info accessors in `shared-data/js/pipettes.js`
|
|
2
|
-
import { getPipetteNameSpecs, getPipetteModelSpecs } from '../pipettes'
|
|
3
|
-
|
|
4
|
-
const PIPETTE_NAMES = [
|
|
5
|
-
'p10_single',
|
|
6
|
-
'p50_single',
|
|
7
|
-
'p300_single',
|
|
8
|
-
'p1000_single',
|
|
9
|
-
'p10_multi',
|
|
10
|
-
'p50_multi',
|
|
11
|
-
'p300_multi',
|
|
12
|
-
] as const
|
|
13
|
-
|
|
14
|
-
const PIPETTE_MODELS = [
|
|
15
|
-
'p10_single_v1',
|
|
16
|
-
'p10_single_v1.3',
|
|
17
|
-
'p10_single_v1.4',
|
|
18
|
-
'p10_single_v1.5',
|
|
19
|
-
'p10_multi_v1',
|
|
20
|
-
'p10_multi_v1.3',
|
|
21
|
-
'p10_multi_v1.4',
|
|
22
|
-
'p10_multi_v1.5',
|
|
23
|
-
'p50_single_v1',
|
|
24
|
-
'p50_single_v1.3',
|
|
25
|
-
'p50_single_v1.4',
|
|
26
|
-
'p50_multi_v1',
|
|
27
|
-
'p50_multi_v1.3',
|
|
28
|
-
'p50_multi_v1.4',
|
|
29
|
-
'p50_multi_v1.5',
|
|
30
|
-
'p300_single_v1',
|
|
31
|
-
'p300_single_v1.3',
|
|
32
|
-
'p300_single_v1.4',
|
|
33
|
-
'p300_single_v1.5',
|
|
34
|
-
'p300_multi_v1',
|
|
35
|
-
'p300_multi_v1.3',
|
|
36
|
-
'p300_multi_v1.4',
|
|
37
|
-
'p300_multi_v1.5',
|
|
38
|
-
'p1000_single_v1',
|
|
39
|
-
'p1000_single_v1.3',
|
|
40
|
-
'p1000_single_v1.4',
|
|
41
|
-
'p1000_single_v1.5',
|
|
42
|
-
] as const
|
|
43
|
-
|
|
44
|
-
describe('pipette data accessors', () => {
|
|
45
|
-
describe('getPipetteNameSpecs', () => {
|
|
46
|
-
PIPETTE_NAMES.forEach(name =>
|
|
47
|
-
it(`name ${name} snapshot`, () =>
|
|
48
|
-
expect(getPipetteNameSpecs(name)).toMatchSnapshot())
|
|
49
|
-
)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
describe('getPipetteModelSpecs', () => {
|
|
53
|
-
PIPETTE_MODELS.forEach(model =>
|
|
54
|
-
it(`model ${model} snapshot`, () =>
|
|
55
|
-
expect(getPipetteModelSpecs(model)).toMatchSnapshot())
|
|
56
|
-
)
|
|
57
|
-
})
|
|
58
|
-
})
|