Module: Label

Defined in:
lib/label.rb,
lib/label/version.rb,
lib/label/description_formatter.rb

Defined Under Namespace

Classes: DescriptionFormatter

Constant Summary collapse

GEM_REGEXP =
/^(?<whitespace> *)gem ['"](?<name>.+?)['"](:?, ['"](?<version>.+?)['"])?/
VERSION =
"0.2.0"

Class Method Summary collapse

Class Method Details

.describe(name, version = nil) ⇒ Object

Describe the given gem.

name - A String with the name of a gem. version - A String describing the version of a gem.

Returns a String.



87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/label.rb', line 87

def describe name, version = nil
  requirement = Gem::Requirement.new(version)

  or_raise = -> do
    raise Gem::LoadError.new("Could not find '#{name}' (#{requirement})")
  end

  specs.find or_raise do |spec|
    spec.name == name &&
    requirement.satisfied_by?(spec.version)
  end.summary
end

.label(gemfile = "Gemfile") ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/label.rb', line 14

def label gemfile = "Gemfile"
  describing = lambda { |name| STDOUT.write "#{name}: " }
  described  = lambda { |description| STDOUT.puts description }

  output = process gemfile, describing, described

  write gemfile, output
end

.process(gemfile, describing = nil, described = nil) ⇒ Object

Process the given Gemfile.

gemfile - A String describing the path to a Gemfile. describing - A Proc to be called once a query to describe a gem begins.

Receives the name of the gem as an argument.

described - A Proc to be called once a query to describe a gem completes.

Receives the description as an argument.


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/label.rb', line 30

def process gemfile, describing = nil, described = nil
  file = read gemfile

  lines = file.read.split "\n"

  processed_lines = []

  lines.each_with_index do |line, i|
    match = line.match GEM_REGEXP

    if match
      previous_line = lines[i - 1]

      whitespace = match[:whitespace]
      name       = match[:name]
      version    = match[:version]

      unless previous_line =~ /^ *#/
        describing.call(name) if describing

        description = describe(name, version)

        described.call(description) if described

        processed_lines << format(description, "#{whitespace}#")
      end
    end

    processed_lines << line
  end

  processed_lines.join("\n") + "\n"
end

.read(file) ⇒ Object

Read the given file.

file - A String describing the path to a file.



67
68
69
# File 'lib/label.rb', line 67

def read file
  File.open file
end

.write(file, text) ⇒ Object

Write to the given file.

file - A String describing the path to a file. text - A String describing text to be written.



75
76
77
78
79
# File 'lib/label.rb', line 75

def write file, text
  File.open file, "w" do |file|
    file.write text
  end
end