Sha256: 9760c1175b646e3de9d0cf65b27f3e3d91264a5eac5c9d0496b825e58a9c9c76

Contents?: true

Size: 1.73 KB

Versions: 71

Compression:

Stored size: 1.73 KB

Contents

module Trackler
  class GuaranteedFile
    attr_accessor :content

    def self.for(problem:, track:, filename:)
      [TrackFile, CommonFile].detect(-> {NullFile}) do |d|
        d.send(:exists?, problem: problem, track: track, filename: filename)
      end.send(:new, problem: problem, track: track, filename: filename)
    end

    private

    attr_accessor :problem, :track, :filename

    def self.exists?(problem:, track:, filename:)
      File.exists?(location(problem: problem, track: track, filename: filename))
    end
    private_class_method :exists?

    def initialize(problem:, track:, filename:)
      self.problem = problem
      self.track = track
      self.filename = filename
      self.content = File.read(self.class.location(problem: problem, track: track, filename: filename))
    end
    private_class_method :new
  end

  class TrackFile < GuaranteedFile
    def self.location(problem:, track:, filename:)
      File.join(problem.root, 'tracks', track.id, 'exercises', problem.slug, filename)
    end

    def url
      "#{track.repository}/blob/master/exercises/%s/#{filename}" % problem.slug
    end
  end

  class CommonFile < GuaranteedFile
    def self.location(problem:, filename:, **_track)
      File.join(problem.root, 'common', 'exercises', problem.slug, filename)
    end

    def url
      "https://github.com/exercism/x-common/blob/master/exercises/%s/#{filename}" % problem.slug
    end
  end

  class NullFile < GuaranteedFile
    def method_missing(*)
      # NOOP
    end

    def respond_to?(*)
      true
    end

    def inspect
      "<null>"
    end

    def exists?
      false
    end

    def content
      ""
    end

    def initialize(*)
      self
    end

    klass = self
    define_method(:class) { klass }
  end
end

Version data entries

71 entries across 71 versions & 1 rubygems

Version Path
trackler-2.1.0.16 lib/trackler/guaranteed_file.rb
trackler-2.1.0.15 lib/trackler/guaranteed_file.rb
trackler-2.1.0.14 lib/trackler/guaranteed_file.rb
trackler-2.1.0.13 lib/trackler/guaranteed_file.rb
trackler-2.1.0.12 lib/trackler/guaranteed_file.rb
trackler-2.1.0.11 lib/trackler/guaranteed_file.rb
trackler-2.1.0.10 lib/trackler/guaranteed_file.rb
trackler-2.1.0.9 lib/trackler/guaranteed_file.rb
trackler-2.1.0.8 lib/trackler/guaranteed_file.rb
trackler-2.1.0.7 lib/trackler/guaranteed_file.rb
trackler-2.1.0.6 lib/trackler/guaranteed_file.rb
trackler-2.1.0.5 lib/trackler/guaranteed_file.rb
trackler-2.1.0.4 lib/trackler/guaranteed_file.rb
trackler-2.1.0.3 lib/trackler/guaranteed_file.rb
trackler-2.1.0.2 lib/trackler/guaranteed_file.rb
trackler-2.1.0.1 lib/trackler/guaranteed_file.rb
trackler-2.1.0.0 lib/trackler/guaranteed_file.rb
trackler-2.0.8.55 lib/trackler/guaranteed_file.rb
trackler-2.0.8.54 lib/trackler/guaranteed_file.rb
trackler-2.0.8.53 lib/trackler/guaranteed_file.rb