Sha256: 2f8c6a4718ad3a576c4a1a06f01e660ab3b9dc96511efd4430bf1d67fc2b80e5

Contents?: true

Size: 1.56 KB

Versions: 12

Compression:

Stored size: 1.56 KB

Contents

class ProgressBar
  module Format
    class Base
      attr_reader :molecules

      def initialize(format_string)
        @format_string = format_string
        @molecules     = parse(format_string)
      end

      def process(environment)
        processed_string = @format_string.dup
        ansi_sgr_codes   = %r{\e\[[\d;]+m}

        non_bar_molecules.each do |molecule|
          processed_string.gsub!("%#{molecule.key}", environment.send(molecule.method_name).to_s)
        end

        remaining_molecules = bar_molecules.size
        placeholder_length  = remaining_molecules * 2

        processed_string.gsub! '%%', '%'

        processed_string_length = processed_string.gsub(ansi_sgr_codes, '').length
        leftover_bar_length     = environment.send(:length) - processed_string_length + placeholder_length
        leftover_bar_length     = leftover_bar_length < 0 ? 0 : leftover_bar_length

        bar_molecules.each do |molecule|
          processed_string.gsub!("%#{molecule.key}", environment.send(molecule.method_name, leftover_bar_length).to_s)
        end

        processed_string
      end

    private
      def non_bar_molecules
        @non_bar_molecules ||= molecules.select { |molecule| !molecule.bar_molecule? }
      end

      def bar_molecules
        @bar_molecules     ||= molecules.select { |molecule| molecule.bar_molecule? }
      end

      def parse(format_string)
        molecules        = []

        format_string.scan(/%[a-zA-Z]/) do |match|
          molecules << Molecule.new(match[1,1])
        end

        molecules
      end
    end
  end
end

Version data entries

12 entries across 12 versions & 2 rubygems

Version Path
rubyjobbuilderdsl-0.0.2 vendor/bundle/ruby/2.1.0/gems/ruby-progressbar-1.5.1/lib/ruby-progressbar/format/base.rb
rubyjobbuilderdsl-0.0.1 vendor/bundle/ruby/2.1.0/gems/ruby-progressbar-1.5.1/lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.6.1 lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.6.0 lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.5.1 lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.5.0 lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.4.2 lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.4.1 lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.4.0 lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.3.2 lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.3.1 lib/ruby-progressbar/format/base.rb
ruby-progressbar-1.3.0 lib/ruby-progressbar/format/base.rb