Sha256: f5d58edaff28c53cef5e94a2d3ae725cbc73f1b9a4d2e6b25d48c9ed8dc148a2

Contents?: true

Size: 1.5 KB

Versions: 1

Compression:

Stored size: 1.5 KB

Contents

# frozen_string_literal: true

module Rake
  module Funnel
    module Integration
      module TeamCity
        class ServiceMessages
          class << self
            def respond_to_missing?(_method, _include_private = false)
              true
            end

            def method_missing(method, *args, &_block) # rubocop:disable Style/MethodMissingSuper
              return unless Rake::Funnel::Integration::TeamCity.running?

              message_name = method.camelize
              publish(message_name, args[0])
            end

            private

            def publish(message_name, args)
              args = [message_name] << escaped_array_of(args)
              args = args.flatten.reject(&:nil?)

              print "##teamcity[#{args.join(' ')}]\n"
            end

            def escape(string) # rubocop:disable Metrics/MethodLength
              string
                .to_s
                .gsub(/\|/, '||')
                .gsub(/'/, "|'")
                .gsub(/\r/, '|r')
                .gsub(/\n/, '|n')
                .gsub(/\u0085/, '|x')
                .gsub(/\u2028/, '|l')
                .gsub(/\u2029/, '|p')
                .gsub(/\[/, '|[')
                .gsub(/\]/, '|]')
            end

            def escaped_array_of(args)
              return [] if args.nil?

              return "'#{escape(args)}'" unless args.is_a?(Hash)

              args.map { |key, value| "#{key.camelize}='#{escape(value.to_s)}'" }
            end
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rake-funnel-0.22.3 lib/rake/funnel/integration/teamcity/service_messages.rb