diff --git a/.gitignore b/.gitignore
index e47af66..04da35e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@ template/Gemfile.lock
grape-starter.md
tmp
api/
+.vscode
diff --git a/.rubocop.yml b/.rubocop.yml
index c587b5d..98450e7 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -12,7 +12,7 @@ AllCops:
- '**/template/api/**'
- grape-starter.gemspec
- template/spec/spec-helper.rb
- - api/**/*
+ # - api/**/*
UseCache: true
NewCops: enable
TargetRubyVersion: 3.2
@@ -26,6 +26,9 @@ Layout/IndentationWidth:
Layout/LineLength:
Max: 120
+Lint/MissingSuper:
+ Enabled: false
+
Metrics/BlockLength:
Exclude:
- 'spec/**/*'
@@ -33,6 +36,9 @@ Metrics/BlockLength:
Metrics/AbcSize:
Max: 20
+Metrics/ClassLength:
+ Max: 120
+
Metrics/MethodLength:
Max: 20
diff --git a/lib/starter/importer/namespace.rb b/lib/starter/importer/namespace.rb
index 2f92593..4733f85 100644
--- a/lib/starter/importer/namespace.rb
+++ b/lib/starter/importer/namespace.rb
@@ -30,7 +30,7 @@ class #{@naming.klass_name} < Grape::API
private
def namespace
- naming.version_klass ? "'#{naming.origin}'" : ":#{naming.resource.downcase}"
+ @namespace ||= naming.version_klass ? "'#{naming.origin}'" : ":#{naming.resource.downcase}"
end
def endpoints
diff --git a/lib/starter/importer/nested_params.rb b/lib/starter/importer/nested_params.rb
new file mode 100644
index 0000000..17ec5dc
--- /dev/null
+++ b/lib/starter/importer/nested_params.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: false
+
+module Starter
+ module Importer
+ class NestedParams < Parameter
+ def initialize(name:, definition:)
+ @name = name
+ @definition = definition
+ end
+ end
+ end
+end
diff --git a/lib/starter/importer/parameter.rb b/lib/starter/importer/parameter.rb
index c7a4e61..5b89d09 100644
--- a/lib/starter/importer/parameter.rb
+++ b/lib/starter/importer/parameter.rb
@@ -1,3 +1,4 @@
+# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
# frozen_string_literal: false
module Starter
@@ -5,34 +6,37 @@ module Importer
class Parameter
class Error < StandardError; end
- attr_accessor :kind, :name, :definition
+ attr_accessor :kind, :name, :definition, :nested
def initialize(definition:, components: {})
+ @nested = []
@kind = validate_parameters(definition:, components:)
prepare_attributes(definition:, components:)
end
def to_s
- entry = definition['required'] ? 'requires' : 'optional'
- entry << " :#{name}"
- entry << ", type: #{definition['schema']['type'].capitalize}"
+ return serialized_object if nested.present?
- doc = documentation
- entry << ", #{doc}" if doc
+ serialized
+ end
- entry
+ def nested?
+ @nested.present?
end
private
+ # initialize helper
+ #
def validate_parameters(definition:, components:)
return :direct if definition.key?('name')
return :ref if definition.key?('$ref') && components.key?('parameters')
+ return :body if definition.key?('content')
raise Error, 'no valid combination given'
end
- def prepare_attributes(definition:, components:)
+ def prepare_attributes(definition:, components:) # rubocop:disable Metrics/MethodLength
case kind
when :direct
@name = definition['name']
@@ -45,26 +49,113 @@ def prepare_attributes(definition:, components:)
if (value = @definition.dig('schema', '$ref').presence)
@definition['schema'] = components.dig(*value.split('/')[2..])
end
+ when :body
+ definition['in'] = 'body'
+ schema = definition['content'].values.first['schema']
+ if schema.key?('$ref')
+ path = schema['$ref'].split('/')[2..]
+
+ @name, @definition = handle_body(definition:, properties: components.dig(*path))
+ @name ||= path.last
+ else
+ @name, @definition = handle_body(definition:, properties: schema)
+ @name = nested.map(&:name).join('_') if @name.nil? && nested?
+ end
end
end
- def documentation
- tmp = {}
- tmp['desc'] = definition['description'] if definition.key?('description')
- tmp['in'] = definition['in'] if definition.key?('in')
-
- return nil if tmp.empty?
-
- documentation = 'documentation:'
- documentation.tap do |doc|
- doc << ' { '
- content = tmp.map { |k, v| "#{k}: '#{v}'" }
- doc << content.join(', ')
- doc << ' }'
+ def handle_body(definition:, properties:)
+ if simple_object?(properties:)
+ name = properties['properties'].keys.first
+ type = properties.dig('properties', name, 'type') || 'array'
+ subtype = properties.dig('properties', name, 'items', 'type')
+ definition['type'] = subtype.nil? ? type : "#{type}[#{subtype}]"
+
+ properties.dig('properties', name).except('type').each {|k,v| definition[k] = v }
+ definition['type'] = 'file' if definition['format'].presence == 'binary'
+
+ [name, definition]
+ elsif object?(definition:, properties:) # a nested object -> JSON
+ definition['type'] = properties['type'].presence || 'JSON'
+ return [nil, definition] if properties.nil? || properties['properties'].nil?
+
+ properties['properties'].each do |name, definition|
+ definition['required'] = properties['required']&.include?(name) || false
+ @nested << NestedParams.new(name:, definition:)
+ end
+ [nil, definition]
+ else # others
+ [nil, definition.merge(properties)]
+ end
+ end
+
+ # handle_body helper, check/find/define types
+ #
+ def object?(definition:, properties:)
+ definition['content'].keys.first.include?('application/json')
+ end
+
+ def simple_object?(properties:)
+ properties.key?('properties') &&
+ properties['properties'].length == 1
+ end
+
+ # to_s helper
+ #
+ def serialized_object
+ definition.tap do |foo|
+ foo['type'] = foo['type'] == 'object' ? 'JSON' : foo['type']
+ end
+
+ parent = NestedParams.new(name: name, definition: definition)
+
+ entry = "#{parent} do\n"
+ nested.each { |n| entry << " #{n}\n" }
+ entry << ' end'
+ end
+
+ def serialized
+ type = definition['type'] || definition['schema']['type']
+ type.scan(/\w+/).each { |x| type.match?('JSON') ? type : type.sub!(x, x.capitalize) }
+
+ if type == 'Array' && definition.key?('items')
+ sub = definition.dig('items', 'type').to_s.capitalize
+ type = "#{type}[#{sub}]"
end
- documentation
+ entry = definition['required'] ? 'requires' : 'optional'
+ entry << " :#{name}"
+ entry << ", type: #{type}"
+ doc = documentation
+ entry << ", #{doc}" if doc
+
+ entry
+ end
+
+ def documentation
+ @documentation ||= begin
+ tmp = {}
+ tmp['desc'] = definition['description'] if definition.key?('description')
+ tmp['in'] = definition['in'] if definition.key?('in')
+
+ if definition.key?('format')
+ tmp['format'] = definition['format']
+ tmp['type'] = 'File' if definition['format'] == 'binary'
+ end
+
+ return nil if tmp.empty?
+
+ documentation = 'documentation:'
+ documentation.tap do |doc|
+ doc << ' { '
+ content = tmp.map { |k, v| "#{k}: '#{v}'" }
+ doc << content.join(', ')
+ doc << ' }'
+ end
+ end
end
end
end
end
+
+# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
diff --git a/lib/starter/importer/specification.rb b/lib/starter/importer/specification.rb
index 87fd8d5..ad56211 100644
--- a/lib/starter/importer/specification.rb
+++ b/lib/starter/importer/specification.rb
@@ -47,7 +47,7 @@ def segmentize(path)
[rest.shift, rest.empty? ? '/' : "/#{rest.join('/')}"]
end
- def prepare_verbs(spec)
+ def prepare_verbs(spec) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
path_params = nil
spec.each_with_object({}) do |(verb, content), memo|
if verb == 'parameters'
@@ -56,9 +56,9 @@ def prepare_verbs(spec)
end
memo[verb] = content
- next unless content.key?('parameters') || path_params
+ next unless content.key?('parameters') || content.key?('requestBody') || path_params
- parameters = content['parameters'] || path_params
+ parameters = ((content['parameters'] || path_params || []) + [content['requestBody']]).compact
memo[verb]['parameters'] = parameters.each_with_object({}) do |definition, para|
parameter = Parameter.new(definition:, components:)
diff --git a/spec/fixtures/pmm.json b/spec/fixtures/pmm.json
new file mode 100644
index 0000000..75b8603
--- /dev/null
+++ b/spec/fixtures/pmm.json
@@ -0,0 +1,4086 @@
+{
+ "openapi": "3.0.1",
+ "info": {
+ "title": "PMM",
+ "description": "Provides accesses to PMM",
+ "contact": {
+ "name": "Peter Scholz",
+ "email": "le-fnord@outlook.de"
+ },
+ "version": "0.2.0"
+ },
+ "servers": [
+ {
+ "url": "//localhost:3000/"
+ }
+ ],
+ "tags": [
+ {
+ "name": "Reporting",
+ "description": "Operations about Reportings"
+ },
+ {
+ "name": "Predictions",
+ "description": "Operations about Predictions"
+ },
+ {
+ "name": "PredictionWorkspace",
+ "description": "Operations about PredictionWorkspaces"
+ },
+ {
+ "name": "Calibrations",
+ "description": "Operations about Calibrations"
+ },
+ {
+ "name": "CalibrationWorkspace",
+ "description": "Operations about CalibrationWorkspaces"
+ },
+ {
+ "name": "Galaxy",
+ "description": "Operations about Galaxies"
+ },
+ {
+ "name": "MarkerData",
+ "description": "Operations about MarkerData"
+ },
+ {
+ "name": "Importer",
+ "description": "Operations about Importers"
+ },
+ {
+ "name": "Carts",
+ "description": "Operations about Carts"
+ },
+ {
+ "name": "Health",
+ "description": "Operations about Healths"
+ },
+ {
+ "name": "MessageRecipients",
+ "description": "Operations about MessageRecipients"
+ },
+ {
+ "name": "Owners",
+ "description": "Operations about Owners"
+ },
+ {
+ "name": "Ownership",
+ "description": "Operations about Ownerships"
+ }
+ ],
+ "paths": {
+ "/api/v1/reporting/stats": {
+ "get": {
+ "tags": [
+ "Reporting"
+ ],
+ "summary": "Statistics",
+ "description": "GET request, to get some statistics about your Predictions and Calibrations",
+ "operationId": "getApiV1ReportingStats",
+ "responses": {
+ "200": {
+ "description": "Statistics",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Statistics"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions": {
+ "delete": {
+ "tags": [
+ "Predictions"
+ ],
+ "summary": "Delete Prediction(s)",
+ "description": "DELETE request, to delete Prediction(s) identified by ID(s)",
+ "operationId": "deleteApiV1Predictions",
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "required": [
+ "ids"
+ ],
+ "properties": {
+ "ids": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "items deleted",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/csvexport": {
+ "get": {
+ "tags": [
+ "Predictions"
+ ],
+ "summary": "Export Predictions as CSV",
+ "description": "Get request, to export predictions as CSV",
+ "operationId": "getApiV1PredictionsCsvexport",
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "required": [
+ "ids"
+ ],
+ "properties": {
+ "ids": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Export Predictions as CSV",
+ "content": {
+ "text/csv": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "text/csv": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/filter": {
+ "post": {
+ "tags": [
+ "Predictions"
+ ],
+ "summary": "Filter Predictions",
+ "description": "Get request, to filter predictions",
+ "operationId": "postApiV1PredictionsFilter",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1PredictionsFilter"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "standard response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_Prediction"
+ }
+ }
+ }
+ }
+ },
+ "206": {
+ "description": "paged response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/PagedPredictions"
+ }
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Items count exceeded!",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1PredictionsFilter"
+ }
+ },
+ "/api/v1/predictions/search-values": {
+ "get": {
+ "tags": [
+ "Predictions"
+ ],
+ "summary": "Search Values",
+ "description": "GET request, to get all Attribute-Values for whicht the User is authorized.",
+ "operationId": "getApiV1PredictionsSearchValues",
+ "responses": {
+ "200": {
+ "description": "Search Values",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_AttributeValues"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/creating": {
+ "post": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Creating Prediction",
+ "description": "POST request, to create a Prediction",
+ "operationId": "postApiV1PredictionsCreating",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1PredictionsCreating"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "Prediction created ... 👐",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_PredictionWorkspace"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Validation Eror",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1PredictionsCreating"
+ }
+ },
+ "/api/v1/predictions/workspace-search-values": {
+ "get": {
+ "tags": [
+ "Predictions"
+ ],
+ "summary": "Workspace Search Values",
+ "description": "GET request, to get all Attribute-Values for whicht the User is authorized.",
+ "operationId": "getApiV1PredictionsWorkspaceSearchValues",
+ "responses": {
+ "200": {
+ "description": "Workspace Search Values",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_AttributeValues"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/workspace": {
+ "post": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Workspace for Predictions",
+ "description": "POST request, to get your Prediction Workspace",
+ "operationId": "postApiV1PredictionsWorkspace",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1PredictionsWorkspace"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "get all Predictions to work on ... 🗂",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_PredictionWorkspace"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1PredictionsWorkspace"
+ }
+ },
+ "/api/v1/predictions/{id}/files": {
+ "get": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Get a List of prediction files",
+ "description": "GET request, to list all files associated with the prediction",
+ "operationId": "getApiV1PredictionsIdFiles",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get a List of prediction files",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_File"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/{id}/reconfiguring": {
+ "put": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Reconfigure finished workflow",
+ "description": "PUT request, to reconfigure the finished workflow",
+ "operationId": "putApiV1PredictionsIdReconfiguring",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Workflow moved to created state to be reconfiguration... 👍",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_PredictionWorkspace"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/{id}/unapproving": {
+ "put": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Unapprove",
+ "description": "PUT request, to unapprove a approved a prediction",
+ "operationId": "putApiV1PredictionsIdUnapproving",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Prediction unapproved ... 👎",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_PredictionWorkspace"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/{id}/approving": {
+ "put": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Approve",
+ "description": "PUT request, to approve a prediction",
+ "operationId": "putApiV1PredictionsIdApproving",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Prediction approved ... 👌",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_PredictionWorkspace"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/{id}/starting": {
+ "put": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Starting Workflow",
+ "description": "PUT request, to start the GLX workflow",
+ "operationId": "putApiV1PredictionsIdStarting",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "202": {
+ "description": "GLX Workflow started ... 👍",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/{id}/workflow/parameters": {
+ "put": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Set Workflow Parameters",
+ "description": "PUT request, to set Workflow Parameters.",
+ "operationId": "putApiV1PredictionsIdWorkflowParameters",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/putApiV1PredictionsIdWorkflowParameters"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Workflow Parameter set ... 👌",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "putApiV1PredictionsIdWorkflowParameters"
+ }
+ },
+ "/api/v1/predictions/{id}/check-compare": {
+ "get": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Check for finished comparation of markers",
+ "description": "GET request to check for finished comparation, returns 204 if comparation is still in progress",
+ "operationId": "getApiV1PredictionsIdCheckCompare",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Check for finished comparation of markers",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/{id}/compare": {
+ "get": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Comparing Markers",
+ "description": "GET request, to compare Markers",
+ "operationId": "getApiV1PredictionsIdCompare",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Markers compared ... 🤲",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_PredictionWorkspace"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/predictions/{id}/genotypes": {
+ "put": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Assign Genotypelist",
+ "description": "PUT request, to assign a Genotypelist",
+ "operationId": "putApiV1PredictionsIdGenotypes",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/putApiV1PredictionsIdGenotypes"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Genotypelist assigned ... 🤝",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_PredictionWorkspace"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "putApiV1PredictionsIdGenotypes"
+ }
+ },
+ "/api/v1/predictions/{id}/calibrations": {
+ "put": {
+ "tags": [
+ "PredictionWorkspace"
+ ],
+ "summary": "Assign Calibrations",
+ "description": "PUT request, to assign Calibrations",
+ "operationId": "putApiV1PredictionsIdCalibrations",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Prediction ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "required": [
+ "ids"
+ ],
+ "properties": {
+ "ids": {
+ "type": "array",
+ "description": "The Calibration IDs to assign to.",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Calibration(s) assigned ... 👏",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_PredictionWorkspace"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/calibrations": {
+ "delete": {
+ "tags": [
+ "Calibrations"
+ ],
+ "summary": "Delete Calibration(s)",
+ "description": "DELETE request, to delete Calibration(s) identified by ID(s)",
+ "operationId": "deleteApiV1Calibrations",
+ "parameters": [
+ {
+ "name": "ids",
+ "in": "query",
+ "required": true,
+ "style": "form",
+ "explode": false,
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "items deleted",
+ "content": {}
+ },
+ "403": {
+ "description": "Forbidden",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/calibrations/csvexport": {
+ "get": {
+ "tags": [
+ "Calibrations"
+ ],
+ "summary": "Export Calibrations as CSV",
+ "description": "Get request, to export calibrationss as CSV",
+ "operationId": "getApiV1CalibrationsCsvexport",
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "required": [
+ "ids"
+ ],
+ "properties": {
+ "ids": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Export Calibrations as CSV",
+ "content": {
+ "text/csv": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "text/csv": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/calibrations/filter": {
+ "post": {
+ "tags": [
+ "Calibrations"
+ ],
+ "summary": "Filter Calibrations",
+ "description": "GET request, to filter calibrations",
+ "operationId": "postApiV1CalibrationsFilter",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1CalibrationsFilter"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "short response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CalibrationShort"
+ }
+ }
+ }
+ }
+ },
+ "202": {
+ "description": "long response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Calibration"
+ }
+ }
+ }
+ }
+ },
+ "206": {
+ "description": "paged response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/PagedCalibrations"
+ }
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Items count exceeded!",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1CalibrationsFilter"
+ }
+ },
+ "/api/v1/calibrations/search-values": {
+ "get": {
+ "tags": [
+ "Calibrations"
+ ],
+ "summary": "Search Values",
+ "description": "GET request, to get all available values for all attributes you can searching for",
+ "operationId": "getApiV1CalibrationsSearchValues",
+ "parameters": [
+ {
+ "name": "crop",
+ "in": "query",
+ "description": "Get Search Values for specific Crop.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Search Values",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_AttributeValues"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/calibrations/creating": {
+ "post": {
+ "tags": [
+ "CalibrationWorkspace"
+ ],
+ "summary": "Creating Calibration",
+ "description": "POST request, to create a Calibration",
+ "operationId": "postApiV1CalibrationsCreating",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1CalibrationsCreating"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Calibration edited ... 👐",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CalibrationWorkspace"
+ }
+ }
+ }
+ },
+ "201": {
+ "description": "Calibration created ... 👐",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CalibrationWorkspace"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1CalibrationsCreating"
+ }
+ },
+ "/api/v1/calibrations/workspace-search-values": {
+ "get": {
+ "tags": [
+ "Calibrations"
+ ],
+ "summary": "Workspace Search Values",
+ "description": "GET request, to get all Attribute-Values for which the User is authorized.",
+ "operationId": "getApiV1CalibrationsWorkspaceSearchValues",
+ "responses": {
+ "200": {
+ "description": "Workspace Search Values",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_AttributeValues"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/calibrations/workspace": {
+ "post": {
+ "tags": [
+ "CalibrationWorkspace"
+ ],
+ "summary": "Workspace for Calibrations",
+ "description": "POST request, to get your Calibration Workspace",
+ "operationId": "postApiV1CalibrationsWorkspace",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1CalibrationsWorkspace"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Workspace for Calibrations",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CalibrationWorkspace"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1CalibrationsWorkspace"
+ }
+ },
+ "/api/v1/calibrations/{id}/reconfiguring": {
+ "put": {
+ "tags": [
+ "CalibrationWorkspace"
+ ],
+ "summary": "Reconfigure finished workflow",
+ "description": "PUT request, to reconfigure the finished workflow",
+ "operationId": "putApiV1CalibrationsIdReconfiguring",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Calibration ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Workflow moved to created state to be reconfiguration... 👍",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CalibrationWorkspace"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/calibrations/{id}/starting": {
+ "put": {
+ "tags": [
+ "CalibrationWorkspace"
+ ],
+ "summary": "Starting Workflow",
+ "description": "PUT request, to start the GLX workflow",
+ "operationId": "putApiV1CalibrationsIdStarting",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Calibration ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "202": {
+ "description": "GLX Workflow started ... 👍",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {}
+ }
+ }
+ }
+ },
+ "/api/v1/calibrations/{id}/phenotypes": {
+ "put": {
+ "tags": [
+ "CalibrationWorkspace"
+ ],
+ "summary": "Add Phenotypes",
+ "description": "PUT request, to upload the phenotype file.",
+ "operationId": "putApiV1CalibrationsIdPhenotypes",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Calibration ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "required": [
+ "phenotype_file"
+ ],
+ "properties": {
+ "phenotype_file": {
+ "type": "string",
+ "description": "The phenotypes file.",
+ "format": "binary"
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Phenotype File uploaded ... 👌",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CalibrationWorkspace"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {}
+ }
+ }
+ }
+ },
+ "/api/v1/calibrations/{id}/workflow/files": {
+ "post": {
+ "tags": [
+ "CalibrationWorkspace"
+ ],
+ "summary": "Add additional files",
+ "description": "Post request, to upload additional files used by the workflow",
+ "operationId": "postApiV1CalibrationsIdWorkflowFiles",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Calibration ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "required": [
+ "file",
+ "key"
+ ],
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The Key, set as name, to find the file later."
+ },
+ "file": {
+ "type": "string",
+ "description": "An additional File.",
+ "format": "binary"
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Additional File uploaded ... 👌",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {}
+ }
+ }
+ }
+ },
+ "/api/v1/calibrations/{id}/workflow/parameters": {
+ "put": {
+ "tags": [
+ "CalibrationWorkspace"
+ ],
+ "summary": "Set Workflow Parameters",
+ "description": "PUT request, to set Workflow Parameters.",
+ "operationId": "putApiV1CalibrationsIdWorkflowParameters",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Calibration ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/putApiV1CalibrationsIdWorkflowParameters"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Workflow Parameter set ... 👌",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CalibrationWorkspace"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "putApiV1CalibrationsIdWorkflowParameters"
+ }
+ },
+ "/api/v1/calibrations/{uuid}": {
+ "get": {
+ "tags": [
+ "Calibrations"
+ ],
+ "summary": "Edit Calibration",
+ "description": "GET request, to get attributes of Calibration for editing",
+ "operationId": "getApiV1CalibrationsUuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "The Calibration UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Edit Calibration",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_Parameters"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ },
+ "put": {
+ "tags": [
+ "Calibrations"
+ ],
+ "summary": "Update Calibration",
+ "description": "PUT request, to update Calibration",
+ "operationId": "putApiV1CalibrationsUuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "The Calibration UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/putApiV1CalibrationsUuid"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Calibration updated",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "putApiV1CalibrationsUuid"
+ }
+ },
+ "/api/v1/galaxy/workflows/{workflow_id}/parameters/{kind}/{uuid}": {
+ "get": {
+ "tags": [
+ "Galaxy"
+ ],
+ "summary": "Workflow Parameters",
+ "description": "GET request, to get parameter for a specific workflow",
+ "operationId": "getApiV1GalaxyWorkflowsWorkflowIdParametersKindUuid",
+ "parameters": [
+ {
+ "name": "workflow_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "kind",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "prediction",
+ "calibration"
+ ]
+ }
+ },
+ {
+ "name": "uuid",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "UUID"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Workflow Parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_Parameters"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/galaxy/workflows/{kind}/{crop}": {
+ "get": {
+ "tags": [
+ "Galaxy"
+ ],
+ "summary": "Workflows",
+ "description": "GET request, to get all Workflows, also shared one",
+ "operationId": "getApiV1GalaxyWorkflowsKindCrop",
+ "parameters": [
+ {
+ "name": "kind",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "prediction",
+ "calibration"
+ ]
+ }
+ },
+ {
+ "name": "crop",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Workflows",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Workflows"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/marker_db/genotypesets": {
+ "get": {
+ "tags": [
+ "MarkerData"
+ ],
+ "summary": "Get Genotypeset",
+ "description": "GET request, to get GenotypeLists from MarkerDB",
+ "operationId": "getApiV1MarkerDbGenotypesets",
+ "parameters": [
+ {
+ "name": "crop",
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get Genotypeset",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/GenotypeShort"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/marker_db/crops": {
+ "get": {
+ "tags": [
+ "MarkerData"
+ ],
+ "summary": "Get available Crops",
+ "description": "GET request, to get all availabel Crops",
+ "operationId": "getApiV1MarkerDbCrops",
+ "responses": {
+ "200": {
+ "description": "Get available Crops",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_List"
+ },
+ "example": {
+ "list": [
+ "MA",
+ "ZR"
+ ]
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/import/predictions": {
+ "post": {
+ "tags": [
+ "Importer"
+ ],
+ "summary": "Import Predictions",
+ "description": "POST request, to import Predictions",
+ "operationId": "postApiV1ImportPredictions",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "required": [
+ "file"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "Import Predictions",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "deprecated": true
+ }
+ },
+ "/api/v1/import/calibrations": {
+ "post": {
+ "tags": [
+ "Importer"
+ ],
+ "summary": "Import Calibrations",
+ "description": "POST request, to import Calibrations",
+ "operationId": "postApiV1ImportCalibrations",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "required": [
+ "file"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "Import Calibrations",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Information"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/import/listing": {
+ "post": {
+ "tags": [
+ "Importer"
+ ],
+ "summary": "Import Listing",
+ "description": "POST request, to import Lists for Markers, Phenotypes and Genotypes",
+ "operationId": "postApiV1ImportListing",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1ImportListing"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "Import Listing",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/GenotypeShort"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1ImportListing"
+ }
+ },
+ "/api/v1/carts/create": {
+ "post": {
+ "tags": [
+ "Carts"
+ ],
+ "summary": "Crate new cart",
+ "description": "POST request, to create a new cart",
+ "operationId": "postApiV1CartsCreate",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1CartsCreate"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "cart craeted",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1CartsCreate"
+ }
+ },
+ "/api/v1/carts/{crop}": {
+ "get": {
+ "tags": [
+ "Carts"
+ ],
+ "summary": "Getting accessible carts for a crop",
+ "description": "GET request, to get carts for a crop",
+ "operationId": "getApiV1CartsCrop",
+ "parameters": [
+ {
+ "name": "crop",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "get all carts for a crop ... 🗂",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_Cart"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/carts": {
+ "get": {
+ "tags": [
+ "Carts"
+ ],
+ "summary": "Getting accessible carts",
+ "description": "GET request, to get all carts a user can see",
+ "operationId": "getApiV1Carts",
+ "responses": {
+ "200": {
+ "description": "get all carts ... 🗂",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_Cart"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/carts/{id}": {
+ "put": {
+ "tags": [
+ "Carts"
+ ],
+ "summary": "Update cart",
+ "description": "PUT request, to update a cart",
+ "operationId": "putApiV1CartsId",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Cart ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/putApiV1CartsId"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Cart updated",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "putApiV1CartsId"
+ },
+ "delete": {
+ "tags": [
+ "Carts"
+ ],
+ "summary": "Remove cart",
+ "description": "DELETE request, to remove a cart",
+ "operationId": "deleteApiV1CartsId",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Cart ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "items deleted",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/carts/{id}/{calibration_id}": {
+ "delete": {
+ "tags": [
+ "Carts"
+ ],
+ "summary": "Remove calibration from Cart",
+ "description": "DELETE request, to remove calibration from a cart",
+ "operationId": "deleteApiV1CartsIdCalibrationId",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The Cart ID",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ {
+ "name": "calibration_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "items deleted",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/health": {
+ "get": {
+ "tags": [
+ "Health"
+ ],
+ "summary": "Serve Health information",
+ "description": "Get request, to check for application health",
+ "operationId": "getApiV1Health",
+ "responses": {
+ "200": {
+ "description": "Serve Health information",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Health"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/message_recipients/{id}": {
+ "put": {
+ "tags": [
+ "MessageRecipients"
+ ],
+ "summary": "Change Message Recipients Crops",
+ "description": "PUT request, to change crops of recipient",
+ "operationId": "putApiV1MessageRecipientsId",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "required": [
+ "crops"
+ ],
+ "properties": {
+ "crops": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "crops changed",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Owner"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "MessageRecipients"
+ ],
+ "summary": "Remove Message Recipient",
+ "description": "DELETE request, to remove a new recipient",
+ "operationId": "deleteApiV1MessageRecipientsId",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "items deleted",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/message_recipients/create": {
+ "post": {
+ "tags": [
+ "MessageRecipients"
+ ],
+ "summary": "Create Message Recipient",
+ "description": "POST request, to create a new recipient",
+ "operationId": "postApiV1MessageRecipientsCreate",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1MessageRecipientsCreate"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "Recipient created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Owner"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1MessageRecipientsCreate"
+ }
+ },
+ "/api/v1/message_recipients/send": {
+ "post": {
+ "tags": [
+ "MessageRecipients"
+ ],
+ "summary": "Send Message to Recipients",
+ "description": "POST request, to send a notification to the given recipients",
+ "operationId": "postApiV1MessageRecipientsSend",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/postApiV1MessageRecipientsSend"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "all recipients notified",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "postApiV1MessageRecipientsSend"
+ }
+ },
+ "/api/v1/message_recipients/{crop}": {
+ "get": {
+ "tags": [
+ "MessageRecipients"
+ ],
+ "summary": "Getting Message Recipients for a crop",
+ "description": "GET request, to get all message recipients",
+ "operationId": "getApiV1MessageRecipientsCrop",
+ "parameters": [
+ {
+ "name": "crop",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "get all message recipients ... 🗂",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_Owner"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/message_recipients": {
+ "get": {
+ "tags": [
+ "MessageRecipients"
+ ],
+ "summary": "Getting Message Recipients",
+ "description": "GET request, to get all message recipients",
+ "operationId": "getApiV1MessageRecipients",
+ "responses": {
+ "200": {
+ "description": "get all message recipients ... 🗂",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_Owner"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/owners/{id}": {
+ "patch": {
+ "tags": [
+ "Owners"
+ ],
+ "summary": "Change Role or Crops",
+ "description": "PATCH request, to change role of Owner and assign crops",
+ "operationId": "patchApiV1OwnersId",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "the ID of the Owner to change",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "role": {
+ "type": "string"
+ },
+ "crops": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Owner updated",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/owners/roles": {
+ "get": {
+ "tags": [
+ "Owners"
+ ],
+ "summary": "List all Roles",
+ "description": "GET request, to get all roles as Array[Strings]",
+ "operationId": "getApiV1OwnersRoles",
+ "responses": {
+ "200": {
+ "description": "List all Roles",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_List"
+ },
+ "example": {
+ "list": [
+ "operator",
+ "dau"
+ ]
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/owners": {
+ "get": {
+ "tags": [
+ "Owners"
+ ],
+ "summary": "Lists all Owners",
+ "description": "GET request, to get all Owners as Array[Objects]",
+ "operationId": "getApiV1Owners",
+ "responses": {
+ "200": {
+ "description": "found Owners",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_Owner"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/owners/apps": {
+ "get": {
+ "tags": [
+ "Owners"
+ ],
+ "summary": "Getting Applications",
+ "description": "GET request, to get your Applications",
+ "operationId": "getApiV1OwnersApps",
+ "responses": {
+ "200": {
+ "description": "get all Applications ... 🗂",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Application"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "Owners"
+ ],
+ "summary": "Creating Application",
+ "description": "POST request, to create an Application for the Owner",
+ "operationId": "postApiV1OwnersApps",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The Name of it."
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "Application created ... 👍",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Application"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Validation Eror",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/owners/apps/{app_key}": {
+ "delete": {
+ "tags": [
+ "Owners"
+ ],
+ "summary": "Deleting Application",
+ "description": "DLETE request, to delete an Application",
+ "operationId": "deleteApiV1OwnersAppsAppKey",
+ "parameters": [
+ {
+ "name": "app_key",
+ "in": "path",
+ "description": "The App Key of it.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Deleting Application",
+ "content": {}
+ },
+ "400": {
+ "description": "Validation Eror",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/ownership/change": {
+ "patch": {
+ "tags": [
+ "Ownership"
+ ],
+ "summary": "Change Ownership of requested Subject",
+ "description": "PATCH request, to change Ownership of requested Subject",
+ "operationId": "patchApiV1OwnershipChange",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/patchApiV1OwnershipChange"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Ownership changed",
+ "content": {}
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/V1_Entities_Message"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "patchApiV1OwnershipChange"
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "V1_Entities_Statistics": {
+ "type": "object",
+ "properties": {
+ "predictions": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string"
+ },
+ "count": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ },
+ "calibrations": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string"
+ },
+ "count": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ },
+ "description": "V1_Entities_Statistics model"
+ },
+ "V1_Entities_Message": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ },
+ "description": "V1_Entities_Message model"
+ },
+ "postApiV1PredictionsFilter": {
+ "type": "object",
+ "properties": {
+ "page": {
+ "type": "integer",
+ "description": "Which page should be shown.
If nothings given, all will be responded.",
+ "format": "int32"
+ },
+ "search": {
+ "type": "string",
+ "description": "Search free text on different attributes."
+ },
+ "sort": {
+ "type": "object",
+ "properties": {
+ "attribute": {
+ "type": "string"
+ },
+ "dir": {
+ "type": "string"
+ }
+ },
+ "description": "Sort by provided attribute and given direction."
+ }
+ },
+ "description": "Filter Predictions"
+ },
+ "V1_Entities_Prediction": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "uuid": {
+ "type": "string",
+ "format": "UUID"
+ },
+ "name": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "crop": {
+ "type": "string"
+ },
+ "trait": {
+ "type": "string"
+ },
+ "created_by": {
+ "type": "string",
+ "format": "Email"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "DateTime"
+ },
+ "comment": {
+ "type": "string"
+ },
+ "history_id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "path": {
+ "type": "string"
+ },
+ "can_be_deleted": {
+ "type": "boolean"
+ },
+ "updated_by": {
+ "type": "string",
+ "format": "Email"
+ },
+ "approved": {
+ "type": "boolean"
+ },
+ "workflow": {
+ "$ref": "#/components/schemas/Workflow"
+ }
+ },
+ "description": "V1_Entities_Prediction model"
+ },
+ "Workflow": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The Name of it."
+ },
+ "href": {
+ "type": "string",
+ "description": "Link to GLX.",
+ "format": "URL"
+ },
+ "state": {
+ "type": "string",
+ "description": "The Final workflow state"
+ },
+ "errors": {
+ "type": "string",
+ "description": "Error message(s) if something bad happened."
+ }
+ }
+ },
+ "PagedPredictions": {
+ "type": "object",
+ "properties": {
+ "pages": {
+ "type": "integer",
+ "description": "Page count of result.",
+ "format": "int32"
+ },
+ "items": {
+ "type": "array",
+ "description": "The result array for Predictions.",
+ "items": {
+ "$ref": "#/components/schemas/V1_Entities_Prediction"
+ }
+ }
+ },
+ "description": "PagedPredictions model"
+ },
+ "V1_Entities_AttributeValues": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "values": {
+ "type": "array"
+ },
+ "value": {
+ "type": "boolean"
+ }
+ },
+ "description": "V1_Entities_AttributeValues model"
+ },
+ "postApiV1PredictionsCreating": {
+ "required": [
+ "crop",
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "crop": {
+ "type": "string",
+ "description": "The Crop of it."
+ },
+ "name": {
+ "type": "string",
+ "description": "The Name of it."
+ },
+ "comment": {
+ "type": "string",
+ "description": "The Comment of it."
+ },
+ "pools": {
+ "type": "array",
+ "description": "The pool(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "material_level": {
+ "type": "array",
+ "description": "The material level(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "material_groups": {
+ "type": "array",
+ "description": "The material group(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "id": {
+ "type": "integer",
+ "description": "The ID of it (possible on back step, so editing is possible).",
+ "format": "int32"
+ }
+ },
+ "description": "Creating Prediction"
+ },
+ "V1_Entities_PredictionWorkspace": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "uuid": {
+ "type": "string",
+ "format": "UUID"
+ },
+ "name": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "crop": {
+ "type": "string"
+ },
+ "trait": {
+ "type": "string"
+ },
+ "created_by": {
+ "type": "string",
+ "format": "Email"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "DateTime"
+ },
+ "comment": {
+ "type": "string"
+ },
+ "material_groups": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "material_level": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "pools": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "genotype_list": {
+ "$ref": "#/components/schemas/GenotypeShort"
+ },
+ "calibrations": {
+ "type": "array",
+ "description": "The assigned Calibrations.",
+ "items": {
+ "$ref": "#/components/schemas/CalibrationShort"
+ }
+ },
+ "result": {
+ "type": "object",
+ "properties": {
+ "genotypes": {
+ "type": "array",
+ "description": "Compared Genotypes",
+ "items": {
+ "$ref": "#/components/schemas/ComparingGenotypeResult"
+ }
+ },
+ "markers": {
+ "type": "array",
+ "description": "Array of Calibration comparing result.",
+ "items": {
+ "$ref": "#/components/schemas/ComparingMarkerResult"
+ }
+ }
+ },
+ "description": "The Marker Comparision results."
+ }
+ },
+ "description": "V1_Entities_PredictionWorkspace model"
+ },
+ "GenotypeShort": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "name": {
+ "type": "string",
+ "description": "The Name of it."
+ },
+ "mdb": {
+ "type": "boolean",
+ "description": "The Source Indicator: `true` -> it comes from MarkerDB."
+ },
+ "count": {
+ "type": "integer",
+ "description": "Number of user provided genotypes",
+ "format": "int32"
+ }
+ },
+ "description": "GenotypeShort model"
+ },
+ "CalibrationShort": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "uuid": {
+ "type": "string",
+ "format": "UUID"
+ },
+ "name": {
+ "type": "string"
+ },
+ "crop": {
+ "type": "string"
+ },
+ "trait": {
+ "type": "string"
+ },
+ "kind": {
+ "type": "string"
+ }
+ },
+ "description": "CalibrationShort model"
+ },
+ "ComparingGenotypeResult": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "name": {
+ "type": "string"
+ },
+ "total": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "in_mdb": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "ComparingMarkerResult": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "name": {
+ "type": "string"
+ },
+ "total": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "overlap": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "rerun": {
+ "type": "boolean"
+ }
+ }
+ },
+ "postApiV1PredictionsWorkspace": {
+ "type": "object",
+ "description": "Workspace for Predictions"
+ },
+ "V1_Entities_File": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the file."
+ }
+ },
+ "description": "V1_Entities_File model"
+ },
+ "putApiV1PredictionsIdWorkflowParameters": {
+ "required": [
+ "workflow"
+ ],
+ "type": "object",
+ "properties": {
+ "workflow": {
+ "required": [
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The workflow ID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The workflow Name."
+ }
+ },
+ "description": "besides documented and required parameters,\n it is possible to submit additional one, depends on choosen workflow"
+ }
+ },
+ "description": "Set Workflow Parameters"
+ },
+ "putApiV1PredictionsIdGenotypes": {
+ "required": [
+ "list"
+ ],
+ "type": "object",
+ "properties": {
+ "list": {
+ "required": [
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The Genotypelist ID to assign to.",
+ "format": "int32"
+ },
+ "mdb": {
+ "type": "boolean",
+ "description": "Comes the List from Marker DB?",
+ "default": false
+ }
+ }
+ }
+ },
+ "description": "Assign Genotypelist"
+ },
+ "postApiV1CalibrationsFilter": {
+ "type": "object",
+ "properties": {
+ "page": {
+ "type": "integer",
+ "description": "Which page should be shown.
If nothings given, all will be responded.",
+ "format": "int32"
+ },
+ "short": {
+ "type": "boolean",
+ "description": "Indicates if short or long entities should be responded"
+ },
+ "search": {
+ "type": "string",
+ "description": "Search free text on different attributes."
+ },
+ "sort": {
+ "type": "object",
+ "properties": {
+ "attribute": {
+ "type": "string"
+ },
+ "dir": {
+ "type": "string"
+ }
+ },
+ "description": "Sort by provided attribute and given direction."
+ },
+ "ids": {
+ "type": "array",
+ "description": "Get Calibrations by id",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "description": "Filter Calibrations"
+ },
+ "Calibration": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "uuid": {
+ "type": "string",
+ "format": "UUID"
+ },
+ "name": {
+ "type": "string"
+ },
+ "crop": {
+ "type": "string"
+ },
+ "trait": {
+ "type": "string"
+ },
+ "kind": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "history_id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "method": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ },
+ "can_be_deleted": {
+ "type": "boolean"
+ },
+ "updated_by": {
+ "type": "string",
+ "format": "Email"
+ },
+ "created_by": {
+ "type": "string",
+ "format": "Email"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "DateTime"
+ },
+ "glx_created_at": {
+ "type": "string",
+ "format": "DateTime"
+ }
+ },
+ "description": "Calibration model"
+ },
+ "PagedCalibrations": {
+ "type": "object",
+ "properties": {
+ "pages": {
+ "type": "integer",
+ "description": "Page count of result.",
+ "format": "int32"
+ },
+ "items": {
+ "type": "array",
+ "description": "The result array for Calibrations.",
+ "items": {
+ "$ref": "#/components/schemas/Calibration"
+ }
+ }
+ },
+ "description": "PagedCalibrations model"
+ },
+ "postApiV1CalibrationsCreating": {
+ "required": [
+ "crop",
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "crop": {
+ "type": "string",
+ "description": "The Crop of it."
+ },
+ "name": {
+ "type": "string",
+ "description": "The Name of it."
+ },
+ "projects": {
+ "type": "array",
+ "description": "The project(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "pools": {
+ "type": "array",
+ "description": "The pool(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "material_level": {
+ "type": "array",
+ "description": "The material level(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "material_groups": {
+ "type": "array",
+ "description": "The material group(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "path": {
+ "type": "string",
+ "description": "The path of it."
+ },
+ "testers": {
+ "type": "array",
+ "description": "The tester(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "locations": {
+ "type": "array",
+ "description": "The location(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "years": {
+ "type": "array",
+ "description": "The year(s) of it.",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "description": "The tag(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "treatments": {
+ "type": "array",
+ "description": "The treatment(s) of it.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "id": {
+ "type": "integer",
+ "description": "The ID of it (possible on back step, so editing is possible).",
+ "format": "int32"
+ }
+ },
+ "description": "Creating Calibration"
+ },
+ "CalibrationWorkspace": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "uuid": {
+ "type": "string",
+ "format": "UUID"
+ },
+ "name": {
+ "type": "string"
+ },
+ "crop": {
+ "type": "string"
+ },
+ "trait": {
+ "type": "string"
+ },
+ "kind": {
+ "type": "string"
+ },
+ "treatments": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "status": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ },
+ "locations": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "material_groups": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "material_level": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "pools": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "projects": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "testers": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "years": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "workflow": {
+ "type": "object",
+ "properties": {}
+ },
+ "created_at": {
+ "type": "string",
+ "format": "DateTime"
+ },
+ "created_by": {
+ "type": "string",
+ "format": "Email"
+ }
+ },
+ "description": "CalibrationWorkspace model"
+ },
+ "postApiV1CalibrationsWorkspace": {
+ "type": "object",
+ "description": "Workspace for Calibrations"
+ },
+ "putApiV1CalibrationsIdWorkflowParameters": {
+ "required": [
+ "workflow"
+ ],
+ "type": "object",
+ "properties": {
+ "workflow": {
+ "required": [
+ "id",
+ "marker_set_name"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The workflow ID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The workflow Name."
+ },
+ "marker_set_name": {
+ "required": [
+ "id",
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The MarkerSet ID.",
+ "format": "int32"
+ },
+ "name": {
+ "type": "string",
+ "description": "The MarkerSet Name."
+ }
+ }
+ },
+ "method": {
+ "type": "string",
+ "description": "The Method."
+ },
+ "het_individuals_fraction": {
+ "type": "number",
+ "description": "The HET stuff.",
+ "format": "float"
+ }
+ },
+ "description": "besides documented and required parameters,\n it is possible to submit additional one, depends on choosen workflow"
+ }
+ },
+ "description": "Set Workflow Parameters"
+ },
+ "putApiV1CalibrationsUuid": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "description": "Attributes to update",
+ "items": {
+ "required": [
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Attribute name"
+ },
+ "type": {
+ "type": "string",
+ "description": "Indicates, if attribute is an Array"
+ },
+ "values": {
+ "type": "string",
+ "description": "Value(s) to update"
+ }
+ }
+ }
+ }
+ },
+ "description": "Update Calibration"
+ },
+ "V1_Entities_Parameters": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The ID of the object."
+ },
+ "name": {
+ "type": "string",
+ "description": "The Name of the object."
+ },
+ "label": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "values": {
+ "type": "array",
+ "description": "Predefined values -> allowed values",
+ "items": {
+ "type": "object",
+ "properties": {}
+ }
+ },
+ "optional": {
+ "type": "boolean",
+ "description": "Is the value required?"
+ },
+ "type": {
+ "type": "string",
+ "description": "The data type"
+ }
+ },
+ "description": "V1_Entities_Parameters model"
+ },
+ "Workflows": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "type": "integer",
+ "description": "The ID of it.",
+ "format": "int32"
+ },
+ "label": {
+ "type": "string",
+ "description": "The Name of it."
+ },
+ "owner": {
+ "type": "string",
+ "description": "The Owner of it."
+ }
+ },
+ "description": "Workflows model"
+ },
+ "V1_Entities_List": {
+ "type": "object",
+ "description": "V1_Entities_List model"
+ },
+ "V1_Entities_Information": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string",
+ "description": "value is based on the result of the action",
+ "enum": [
+ "success",
+ "error"
+ ]
+ },
+ "name": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "description": "V1_Entities_Information model"
+ },
+ "postApiV1ImportListing": {
+ "required": [
+ "content",
+ "kind",
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "kind": {
+ "type": "string",
+ "description": "The Kind of it",
+ "enum": [
+ "marker",
+ "genotype",
+ "phenotype"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "The Name of it."
+ },
+ "content": {
+ "type": "string",
+ "description": "A File including list of items, formatted as CSV | TSV | JSON Array,\t\n or a String, such as one from text input,\n where the items can be separated by comma, semicolon or tab."
+ },
+ "old_list_id": {
+ "type": "integer",
+ "description": "ID of a list which was created before, but will not be used → will be deleted",
+ "format": "int32"
+ }
+ },
+ "description": "Import Listing"
+ },
+ "postApiV1CartsCreate": {
+ "required": [
+ "calibrations",
+ "name",
+ "published"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "published": {
+ "type": "boolean"
+ },
+ "calibrations": {
+ "type": "array",
+ "description": "List of selected calibration ids",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "description": "Crate new cart"
+ },
+ "V1_Entities_Cart": {
+ "type": "object",
+ "properties": {
+ "display_name": {
+ "type": "string",
+ "description": "The id and name of the cart."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the cart."
+ },
+ "id": {
+ "type": "integer",
+ "description": "Id of the cart.",
+ "format": "int32"
+ },
+ "crop": {
+ "type": "string",
+ "description": "Crop of the cart."
+ },
+ "published": {
+ "type": "boolean",
+ "description": "Whether or not the cart has been published."
+ },
+ "created_by": {
+ "type": "string",
+ "description": "Owner of the cart."
+ },
+ "trait_calibrations": {
+ "type": "array",
+ "description": "The associated calibrations.",
+ "items": {
+ "$ref": "#/components/schemas/CalibrationShort"
+ }
+ }
+ },
+ "description": "V1_Entities_Cart model"
+ },
+ "putApiV1CartsId": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "published": {
+ "type": "boolean"
+ },
+ "calibrations": {
+ "type": "array",
+ "description": "List of selected calibration ids",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "description": "Update cart"
+ },
+ "Health": {
+ "type": "object",
+ "properties": {
+ "checks": {
+ "type": "array",
+ "description": "The services being monitored.",
+ "items": {
+ "$ref": "#/components/schemas/Service"
+ }
+ },
+ "health": {
+ "type": "string",
+ "description": "The overall status of the application."
+ }
+ },
+ "description": "Health model"
+ },
+ "Service": {
+ "type": "object",
+ "properties": {
+ "check": {
+ "type": "string",
+ "description": "The name of the service."
+ },
+ "health": {
+ "type": "string",
+ "description": "The status of the service."
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the service."
+ },
+ "milliseconds": {
+ "type": "integer",
+ "description": "The time it took to perform the check in milliseconds.",
+ "format": "int32"
+ },
+ "exception": {
+ "type": "string",
+ "description": "The exception message if the service is unhealthy."
+ },
+ "modules": {
+ "type": "array",
+ "description": "The modules that depend on the service."
+ }
+ }
+ },
+ "V1_Entities_Owner": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "email": {
+ "type": "string",
+ "format": "Email"
+ },
+ "role": {
+ "type": "string"
+ }
+ },
+ "description": "V1_Entities_Owner model"
+ },
+ "postApiV1MessageRecipientsCreate": {
+ "required": [
+ "crops",
+ "email"
+ ],
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string"
+ },
+ "crops": {
+ "type": "string"
+ }
+ },
+ "description": "Create Message Recipient"
+ },
+ "postApiV1MessageRecipientsSend": {
+ "required": [
+ "id",
+ "recipients"
+ ],
+ "type": "object",
+ "properties": {
+ "recipients": {
+ "type": "array",
+ "description": "List of selected recipient ids",
+ "items": {
+ "required": [
+ "email"
+ ],
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "files": {
+ "type": "array",
+ "description": "List of selected files",
+ "items": {
+ "required": [
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ "description": "Send Message to Recipients"
+ },
+ "Application": {
+ "type": "object",
+ "properties": {
+ "app_key": {
+ "type": "string",
+ "description": "Tha Access Key of the App.",
+ "format": "uuid"
+ },
+ "name": {
+ "type": "string",
+ "description": "The Name of it."
+ }
+ },
+ "description": "Application model"
+ },
+ "patchApiV1OwnershipChange": {
+ "required": [
+ "owner",
+ "subject"
+ ],
+ "type": "object",
+ "properties": {
+ "owner": {
+ "required": [
+ "email",
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The ID.",
+ "format": "int32"
+ },
+ "email": {
+ "type": "string",
+ "description": "The Email."
+ }
+ },
+ "description": "The new Owner."
+ },
+ "subject": {
+ "required": [
+ "id",
+ "klass"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The ID.",
+ "format": "int32"
+ },
+ "klass": {
+ "type": "string",
+ "description": "The Class."
+ }
+ },
+ "description": "The Subject to change ownership"
+ }
+ },
+ "description": "Change Ownership of requested Subject"
+ }
+ },
+ "securitySchemes": {
+ "user_authentication": {
+ "type": "apiKey",
+ "description": "provide your galaxy key as api key",
+ "name": "HTTP_API_KEY",
+ "in": "header"
+ },
+ "app_authentication": {
+ "type": "apiKey",
+ "description": "provide key of registered app -> login and create a key under /apps",
+ "name": "HTTP_APP_KEY",
+ "in": "header"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/spec/lib/import_spec.rb b/spec/lib/import_spec.rb
index 7676d2b..650d07e 100644
--- a/spec/lib/import_spec.rb
+++ b/spec/lib/import_spec.rb
@@ -2,7 +2,7 @@
RSpec.describe Starter::Import do
# describe '.do_it!' do
- # let(:path) { './spec/fixtures/links.json' }
+ # let(:path) { './spec/fixtures/pmm.json' }
# subject { described_class.do_it!(path) }
diff --git a/spec/lib/importer/parameter_spec.rb b/spec/lib/importer/parameter_spec.rb
index 4e6c860..fefd7cd 100644
--- a/spec/lib/importer/parameter_spec.rb
+++ b/spec/lib/importer/parameter_spec.rb
@@ -1,8 +1,52 @@
# frozen_string_literal: false
+# rubocop:disable Layout/LineLength
RSpec.describe Starter::Importer::Parameter do
+ let(:components) do
+ {
+ 'parameters' => {
+ 'rowParam' => {
+ 'description' => 'Board row (vertical coordinate)',
+ 'name' => 'row',
+ 'in' => 'path',
+ 'required' => true,
+ 'schema' => { '$ref' => '#/components/schemas/coordinate' }
+ },
+ 'columnParam' => {
+ 'description' => 'Board column (horizontal coordinate)',
+ 'name' => 'column',
+ 'in' => 'path',
+ 'required' => true,
+ 'schema' => { '$ref' => '#/components/schemas/coordinate' }
+ }
+ },
+ 'schemas' => {
+ 'errorMessage' => { 'type' => 'string', 'maxLength' => 256, 'description' => 'A text message describing an error' },
+ 'coordinate' => { 'type' => 'integer', 'minimum' => 1, 'maximum' => 3, 'example' => 1 },
+ 'mark' => {
+ 'type' => 'string',
+ 'enum' => ['.', 'X', 'O'],
+ 'description' => 'Possible values for a board square. `.` means empty square.',
+ 'example' => '.'
+ },
+ 'board' => {
+ 'type' => 'array',
+ 'maxItems' => 3,
+ 'minItems' => 3,
+ 'items' => { 'type' => 'array', 'maxItems' => 3, 'minItems' => 3, 'items' => { '$ref' => '#/components/schemas/mark' } }
+ },
+ 'winner' => {
+ 'type' => 'string', 'enum' => ['.', 'X', 'O'], 'description' => 'Winner of the game. `.` means nobody has won yet.', 'example' => '.'
+ },
+ 'status' => {
+ 'type' => 'object', 'properties' => { 'winner' => { '$ref' => '#/components/schemas/winner' }, 'board' => { '$ref' => '#/components/schemas/board' } }
+ }
+ }
+ }
+ end
+
describe 'valid parameters -> sets kind' do
- describe 'name in definition' do
+ describe 'name in definition -> :direct' do
subject { described_class.new(definition:) }
let(:definition) { { 'name' => 'limit' } }
@@ -13,7 +57,7 @@
end
end
- describe 'ref and components/parameters given' do
+ describe 'ref and components/parameters given -> :ref' do
subject { described_class.new(definition:, components:) }
let(:definition) { { '$ref' => '#/components/parameters/rowParam' } }
@@ -24,6 +68,35 @@
expect(subject.kind).to eql :ref
end
end
+
+ describe 'content given -> body' do
+ subject { described_class.new(definition:, components:) }
+
+ let(:definition) do
+ {
+ 'content' => { 'application/json' => {
+ 'schema' => {
+ '$ref' => '#/components/schemas/some_name'
+ }
+ } }
+ }
+ end
+ let(:components) do
+ {
+ 'schemas' => {
+ 'some_name' => {
+ 'required' => %w[crop name],
+ 'type' => 'object',
+ 'properties' => {}
+ }
+ }
+ }
+ end
+ specify do
+ expect { subject }.not_to raise_error
+ expect(subject.kind).to eql :body
+ end
+ end
end
describe 'invalid parameters' do
@@ -49,104 +122,219 @@
end
end
- describe 'local params' do
- subject { described_class.new(definition:) }
+ subject { described_class.new(definition:, components:) }
- describe 'atomic' do
- let(:definition) do
- {
- 'name' => 'limit',
- 'in' => 'query',
- 'description' => 'maximum number of results to return',
- 'required' => false,
- 'schema' => { 'type' => 'integer', 'format' => 'int32' }
- }
- end
+ describe 'atomic parameter' do
+ let(:definition) do
+ {
+ 'name' => 'limit',
+ 'in' => 'query',
+ 'description' => 'maximum number of results to return',
+ 'required' => false,
+ 'schema' => { 'type' => 'integer', 'format' => 'int32' }
+ }
+ end
- specify do
- expect(subject.name).to eql 'limit'
- expect(subject.definition.keys).to match_array %w[
- description in required schema
- ]
- expect(subject.to_s).to eql(
- "optional :limit, type: Integer, documentation: { desc: 'maximum number of results to return', in: 'query' }"
- )
- end
+ specify do
+ expect(subject.name).to eql 'limit'
+ expect(subject.definition.keys).to match_array %w[
+ description in required schema
+ ]
+ expect(subject.to_s).to eql(
+ "optional :limit, type: Integer, documentation: { desc: 'maximum number of results to return', in: 'query' }"
+ )
end
+ end
- describe 'array' do
- let(:definition) do
- {
- 'name' => 'tags',
- 'in' => 'query',
- 'description' => 'tags to filter by',
- 'required' => false,
- 'style' => 'form',
- 'schema' => { 'type' => 'array', 'items' => { 'type' => 'string' } }
- }
- end
+ describe 'reference atomic parameter' do
+ let(:definition) do
+ { '$ref' => '#/components/parameters/rowParam' }
+ end
- specify do
- expect(subject.name).to eql 'tags'
- expect(subject.definition.keys).to match_array %w[
- description in required style schema
- ]
- expect(subject.to_s).to eql(
- "optional :tags, type: Array, documentation: { desc: 'tags to filter by', in: 'query' }"
- )
- end
+ specify do
+ expect(subject.name).to eql 'row'
+ expect(subject.definition.keys).to match_array %w[
+ description in required schema
+ ]
+ expect(subject.definition['schema']['type']).to eql 'integer'
+ expect(subject.to_s).to eql(
+ "requires :row, type: Integer, documentation: { desc: 'Board row (vertical coordinate)', in: 'path' }"
+ )
end
end
- describe 'references' do
- subject { described_class.new(definition:, components:) }
-
+ describe 'array' do
let(:definition) do
- { '$ref' => '#/components/parameters/rowParam' }
+ {
+ 'name' => 'tags',
+ 'in' => 'query',
+ 'description' => 'tags to filter by',
+ 'required' => false,
+ 'style' => 'form',
+ 'schema' => { 'type' => 'array', 'items' => { 'type' => 'string' } }
+ }
end
- let(:components) do
+ specify do
+ expect(subject.name).to eql 'tags'
+ expect(subject.definition.keys).to match_array %w[
+ description in required style schema
+ ]
+ expect(subject.to_s).to eql(
+ "optional :tags, type: Array, documentation: { desc: 'tags to filter by', in: 'query' }"
+ )
+ end
+ end
+
+ describe 'request body: simple array' do
+ let(:definition) do
{
- 'parameters' => {
- 'rowParam' => {
- 'description' => 'Board row (vertical coordinate)',
- 'name' => 'row',
- 'in' => 'path',
- 'required' => true,
+ 'content' => {
+ 'multipart/form-data' => {
'schema' => {
- '$ref' => '#/components/schemas/coordinate'
+ 'required' => ['ids'],
+ 'properties' => {
+ 'ids' => { 'type' => 'array', 'items' => { 'type' => 'integer', 'format' => 'int32' } }
+ }
}
- },
- 'columnParam' => {
- 'description' => 'Board column (horizontal coordinate)',
- 'name' => 'column',
- 'in' => 'path',
- 'required' => true,
+ }
+ },
+ 'required' => true,
+ 'in' => 'body'
+ }
+ end
+
+ specify do
+ expect(subject.name).to eql 'ids'
+ expect(subject.definition.keys).to match_array %w[
+ content in items required type
+ ]
+ expect(subject.to_s).to eql(
+ "requires :ids, type: Array[Integer], documentation: { in: 'body' }"
+ )
+ end
+ end
+
+ describe 'request body: other' do
+ let(:definition) do
+ {
+ 'required' => true,
+ 'content' => {
+ 'application/form_data' => {
+ 'schema' => { '$ref' => '#/components/schemas/mark' }
+ }
+ }
+ }
+ end
+
+ specify do
+ expect(subject.name).to eql 'mark'
+ expect(subject.definition.keys).to match_array %w[
+ required content in type enum description example
+ ]
+ expect(subject.to_s).to eql(
+ "requires :mark, type: String, documentation: { desc: 'Possible values for a board square. `.` means empty square.', in: 'body' }"
+ )
+ end
+ end
+
+ describe 'request body: object' do
+ let(:definition) do
+ {
+ 'content' => {
+ 'application/json' => {
'schema' => {
- '$ref' => '#/components/schemas/coordinate'
+ '$ref' => '#/components/schemas/postApiV1CalibrationsCreating'
}
}
},
+ 'required' => true,
+ 'in' => 'body'
+ }
+ end
+
+ let(:components) do
+ {
'schemas' => {
- 'coordinate' => {
- 'type' => 'integer',
- 'minimum' => 1,
- 'maximum' => 3,
- 'example' => 1
+ 'postApiV1CalibrationsCreating' => {
+ 'required' => ['crop', 'name'], # rubocop:disable Style/WordArray
+ 'type' => 'object',
+ 'properties' => {
+ 'crop' => { 'type' => 'string', 'description' => 'The Crop of it.' },
+ 'name' => { 'type' => 'string', 'description' => 'The Name of it.' },
+ 'projects' => { 'type' => 'array', 'description' => 'The project(s) of it.', 'items' => { 'type' => 'string' } },
+ 'pools' => { 'type' => 'array', 'description' => 'The pool(s) of it.', 'items' => { 'type' => 'string' } },
+ 'material_level' => { 'type' => 'array', 'description' => 'The material level(s) of it.', 'items' => { 'type' => 'string' } },
+ 'material_groups' => { 'type' => 'array', 'description' => 'The material group(s) of it.', 'items' => { 'type' => 'string' } },
+ 'path' => { 'type' => 'string', 'description' => 'The path of it.' },
+ 'testers' => { 'type' => 'array', 'description' => 'The tester(s) of it.', 'items' => { 'type' => 'string' } },
+ 'locations' => { 'type' => 'array', 'description' => 'The location(s) of it.', 'items' => { 'type' => 'string' } },
+ 'years' => { 'type' => 'array', 'description' => 'The year(s) of it.', 'items' => { 'type' => 'integer', 'format' => 'int32' } },
+ 'tags' => { 'type' => 'array', 'description' => 'The tag(s) of it.', 'items' => { 'type' => 'string' } },
+ 'treatments' => { 'type' => 'array', 'description' => 'The treatment(s) of it.', 'items' => { 'type' => 'string' } },
+ 'id' => { 'type' => 'integer', 'description' => 'The ID of it (possible on back step, so editing is possible).', 'format' => 'int32' }
+ },
+ 'description' => 'Creating Calibration'
}
}
}
end
specify do
- expect(subject.name).to eql 'row'
+ # require 'pry'; binding.pry
+ expect(subject.name).to eql 'postApiV1CalibrationsCreating'
expect(subject.definition.keys).to match_array %w[
- description in required schema
+ required content in type
]
- expect(subject.definition['schema']['type']).to eql 'integer'
- expect(subject.to_s).to eql(
- "requires :row, type: Integer, documentation: { desc: 'Board row (vertical coordinate)', in: 'path' }"
+ expect(subject.definition['type']).to eql 'object'
+ # ap subject.to_s
+
+ expect(subject.to_s).to include(
+ "requires :postApiV1CalibrationsCreating, type: JSON, documentation: { in: 'body' } do"
+ )
+ expect(subject.to_s).to include(
+ "requires :crop, type: String, documentation: { desc: 'The Crop of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "requires :name, type: String, documentation: { desc: 'The Name of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :projects, type: Array[String], documentation: { desc: 'The project(s) of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :pools, type: Array[String], documentation: { desc: 'The pool(s) of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :material_level, type: Array[String], documentation: { desc: 'The material level(s) of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :material_groups, type: Array[String], documentation: { desc: 'The material group(s) of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :path, type: String, documentation: { desc: 'The path of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :testers, type: Array[String], documentation: { desc: 'The tester(s) of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :locations, type: Array[String], documentation: { desc: 'The location(s) of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :years, type: Array[Integer], documentation: { desc: 'The year(s) of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :tags, type: Array[String], documentation: { desc: 'The tag(s) of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :treatments, type: Array[String], documentation: { desc: 'The treatment(s) of it.' }"
+ )
+ expect(subject.to_s).to include(
+ "optional :id, type: Integer, documentation: { desc: 'The ID of it (possible on back step, so editing is possible).' }"
+ )
+ expect(subject.to_s).to include(
+ 'end'
)
end
end
end
+# rubocop:enable Layout/LineLength