diff --git a/lib/minds.rb b/lib/minds.rb index d32423d..5f28a74 100644 --- a/lib/minds.rb +++ b/lib/minds.rb @@ -9,6 +9,7 @@ require_relative "minds/config/base" require_relative "minds/datasources" require_relative "minds/minds" +require_relative "minds/validators" module Minds class MiddlewareErrors < Faraday::Middleware diff --git a/lib/minds/datasources.rb b/lib/minds/datasources.rb index 54d4c86..3a7d581 100644 --- a/lib/minds/datasources.rb +++ b/lib/minds/datasources.rb @@ -57,6 +57,8 @@ def initialize(client:) def create(ds_config, update = false) name = ds_config.name + Validators.validate_datasource_name!(name) + path = "datasources" path += "/#{name}" if update diff --git a/lib/minds/errors.rb b/lib/minds/errors.rb index 4f9c525..c5e239b 100644 --- a/lib/minds/errors.rb +++ b/lib/minds/errors.rb @@ -1,6 +1,9 @@ +# frozen_string_literal: true + module Minds class Error < StandardError; end - class ValidationError < Error; end class ObjectNotFound < Error; end class ObjectNotSupported < Error; end + class MindNameInvalid < Error; end + class DatasourceNameInvalid < Error; end end diff --git a/lib/minds/minds.rb b/lib/minds/minds.rb index 2423a95..0f819d1 100644 --- a/lib/minds/minds.rb +++ b/lib/minds/minds.rb @@ -36,6 +36,7 @@ def initialize(client, attributes = {}) # @param parameters [Hash, nil] Alter other parameters of the mind (optional) # @return [void] def update(name: nil, model_name: nil, provider: nil, prompt_template: nil, datasources: nil, parameters: nil) + Validators.validate_mind_name!(name) if !name.nil? data = {} ds_names = [] datasources.each do |ds| @@ -210,6 +211,8 @@ def destroy(name) # ) # def create(name:, model_name: nil, provider: nil, prompt_template: nil, datasources: nil, parameters: nil, replace: false, update: false) + Validators.validate_mind_name!(name) if !name.nil? + if replace find(name) destroy(name) diff --git a/lib/minds/validators.rb b/lib/minds/validators.rb new file mode 100644 index 0000000..579fd61 --- /dev/null +++ b/lib/minds/validators.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +module Minds + module Validators + class << self + # Validates a mind name according to naming rules + # + # @param name [String] The mind name to validate + # @return [Boolean] Returns true if valid + # @raise [MindNameInvalid] If the mind name is invalid + # + # @example Valid mind names + # validate_mind_name!("my_mind_1") # => true + # + # @example Invalid mind names + # validate_mind_name!("123_mind") # raises MindNameInvalid + # validate_mind_name!("my mind") # raises MindNameInvalid + # validate_mind_name!("very_very_long_mind_name_over_32_chars") # raises MindNameInvalid + # + # @note Mind name rules: + # - Must start with a letter + # - Can contain only letters, numbers, or underscores + # - Maximum length of 32 characters + # - Cannot contain spaces + def validate_mind_name!(name) + unless name.match?(/\A[a-zA-Z][a-zA-Z0-9_]{0,31}\z/) + raise MindNameInvalid, "Mind name '#{name}' is invalid. It must start with a letter, contain only letters, numbers, or underscores, and be 32 characters or less." + end + end + + # Validates a datasource name according to naming rules + # + # @param name [String] The datasource name to validate + # @return [Boolean] Returns true if valid + # @raise [DatasourceNameInvalid] If the datasource name is invalid + # + # @example Valid datasource names + # validate_datasource_name!("my_database") # => true + # + # @example Invalid datasource names + # validate_datasource_name!("123_db") # raises DatasourceNameInvalid + # validate_datasource_name!("my database") # raises DatasourceNameInvalid + # validate_datasource_name!("very_very_long_database_name_over_62_characters_not_allowed") # raises DatasourceNameInvalid + # + # @note Datasource name rules: + # - Must start with a letter + # - Can contain only letters, numbers, or underscores + # - Maximum length of 62 characters + # - Cannot contain spaces + def validate_datasource_name!(name) + unless name.match?(/\A[a-zA-Z][a-zA-Z0-9_]{0,61}\z/) + raise DatasourceNameInvalid, "Datasource name '#{name}' is invalid. It must start with a letter, contain only letters, numbers, or underscores, and be 62 characters or less." + end + end + end + end +end