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. Works for both regular gems (+lib/my_gem.rb+) and extension gems whose entry point nests deeper (+lib/my_gem/extension.rb+ for my_gem-extension).

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.



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

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

Instance Attribute Details

#rootObject (readonly)

Returns the value of attribute root.



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

def root
  @root
end

Instance Method Details

#increment_versionObject



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

def increment_version
  version.next_version
end

#klassObject



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

def klass
  Object.const_get(project_segments.map(&:camelize).join("::"))
end

#libObject



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

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

#lib_projectObject



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

def lib_project
  @lib_project ||= fetch_lib_project
end

#nameObject



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

def name
  project_segments.join("-")
end

#refresh_version!Object



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

def refresh_version!
  @version = fetch_version
end

#versionObject



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

def version
  @version ||= fetch_version
end

#version_tagObject



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

def version_tag = version.tag

#version_valueObject



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

def version_value = version.value

#write_version!(old_version, new_version) ⇒ Object



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

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