Class: Gempilot::Project

Inherits:
Object
  • Object
show all
Defined in:
lib/gempilot/project.rb,
lib/gempilot/project/version.rb

Overview

Introspects a gem project to discover its name, module, and version.

Defined Under Namespace

Classes: ProjectIntrospectionError

Constant Summary collapse

Version =
Data.define(:path, :value) do
  def tag
    "v#{value}"
  end

  def bump(segment = :patch)
    case segment.to_sym
    when :major, :minor, :patch then bump_semver(segment)
    when :dev                   then bump_dev
    else raise ArgumentError, "Unknown segment #{segment.inspect}. Use :major, :minor, :patch, or :dev"
    end
  end

  private

  def bump_semver(segment)
    major, minor, patch = value.split(".").first(3).map(&:to_i)
    new_value = case segment.to_sym
                when :major then "#{major + 1}.0.0"
                when :minor then "#{major}.#{minor + 1}.0"
                when :patch then "#{major}.#{minor}.#{patch + 1}"
                end
    with(value: new_value)
  end

  def bump_dev
    if value.match?(/\.dev\d+\z/)
      with(value: value.sub(/\d+\z/) { it.to_i + 1 })
    else
      with(value: "#{value}.dev1")
    end
  end

  alias_method :next_version, :bump
end.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root = Dir.pwd) ⇒ Project

Returns a new instance of Project.



17
18
19
20
# File 'lib/gempilot/project.rb', line 17

def initialize(root = Dir.pwd)
  @root = Pathname(root)
  @verifications = Set.new
end

Instance Attribute Details

#rootObject (readonly)

Returns the value of attribute root.



15
16
17
# File 'lib/gempilot/project.rb', line 15

def root
  @root
end

Instance Method Details

#increment_versionObject



47
48
49
# File 'lib/gempilot/project.rb', line 47

def increment_version
  version.next_version
end

#klassObject



35
36
37
# File 'lib/gempilot/project.rb', line 35

def klass
  Object.const_get(name.camelize)
end

#libObject



22
23
24
25
# File 'lib/gempilot/project.rb', line 22

def lib
  root.join("lib")
      .tap { verify_existence! it }
end

#lib_projectObject



27
28
29
# File 'lib/gempilot/project.rb', line 27

def lib_project
  @lib_project ||= fetch_lib_project
end

#nameObject



31
32
33
# File 'lib/gempilot/project.rb', line 31

def name
  lib_project.basename.to_s
end

#refresh_version!Object



43
44
45
# File 'lib/gempilot/project.rb', line 43

def refresh_version!
  @version = fetch_version
end

#versionObject



39
40
41
# File 'lib/gempilot/project.rb', line 39

def version
  @version ||= fetch_version
end

#version_tagObject



51
# File 'lib/gempilot/project.rb', line 51

def version_tag = version.tag

#version_valueObject



53
# File 'lib/gempilot/project.rb', line 53

def version_value = version.value

#write_version!(old_version, new_version) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/gempilot/project.rb', line 55

def write_version!(old_version, new_version)
  with_version_file do |f|
    source = f.read

    unless source.match?(Regexp.escape(old_version.value))
      abort "Expected to find #{old_version.value} in #{f.path} but did not"
    end

    f.rewind
    f.write source.gsub(old_version.value, new_version.value)
  end
end