gistory 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f15e11803f6e91bfb1af57610267737d808406fb
4
- data.tar.gz: fd36322d7caa39a74a17843f6604c721906e8cdb
2
+ SHA256:
3
+ metadata.gz: 3e8eab6d518dee70d3c57035306062a1d3d466fe9fdd468076bece37ea8f21d3
4
+ data.tar.gz: 384accb7f97bc56ca2adaaae3963520a1d60f9f96e1b8c9f418077f0a14f5055
5
5
  SHA512:
6
- metadata.gz: 00de34130a52fcd49e7cfe8de998fd80e16307b8e62b24d357f551a27fe3eebd4b98599c354bcf51ab2cb7b9d8fc8d28c856d66ae6d5e37bab5ff3f7d40fbd55
7
- data.tar.gz: 18fc83ae3593944d3fe8f8b7476494c1d4272baa3c162c3d09b5feed21bf1813f7bd1ca93e786cd3bf26ce87ffebf3ad7eab4317045f604bcca893c5c3c67d23
6
+ metadata.gz: 2320727fc749c876387b075bf3a26e5e45a74fc688f06fc1d91acf132307f7a3cac6a94bac3b913073f3a61be25a7ee31ed6ad1e275f7890309f9b3cf64dd6f9
7
+ data.tar.gz: 2877f804af2ef087f87a6900b6b4cdc834e574015853022d8332896fabbf4a9f9f63c8cf61c38016c463b5c3127234dce41c423890da16b9e99892227de67d9b
@@ -13,4 +13,4 @@ ratings:
13
13
  paths:
14
14
  - "**.rb"
15
15
  exclude_paths:
16
- - test/
16
+ - spec/
data/.gitignore CHANGED
@@ -8,4 +8,7 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
 
11
+ # rspec failure tracking
12
+ .rspec_status
13
+
11
14
  NOTES.txt
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -1,18 +1,87 @@
1
- Metrics/LineLength:
2
- Max: 120
3
-
4
- Documentation:
5
- Enabled: false
1
+ require: rubocop-rspec
6
2
 
7
3
  Metrics/AbcSize:
8
- # The ABC size is a calculated magnitude, so this number can be a Fixnum or a Float.
9
- # http://c2.com/cgi/wiki?AbcMetric
10
- Max: 20
4
+ Max: 25
5
+ Exclude:
6
+ - 'spec/**/*_spec.rb'
7
+
8
+ Metrics/BlockLength:
11
9
  Exclude:
12
- - 'test/**/*_test.rb' # ignore tests which typically have high B count due to many asserts
10
+ - 'spec/**/*_spec.rb'
13
11
 
14
12
  Metrics/MethodLength:
15
- Max: 15
13
+ Max: 20
14
+
15
+ Layout/EmptyLineAfterGuardClause:
16
+ Enabled: false
17
+
18
+ Layout/LineLength:
19
+ Max: 120
20
+
21
+ Style/BlockDelimiters:
22
+ Exclude:
23
+ - 'spec/**/*_spec.rb'
24
+
25
+ Style/Documentation:
26
+ Enabled: false
27
+
28
+ Style/IfUnlessModifier:
29
+ Enabled: false
16
30
 
17
31
  Style/FrozenStringLiteralComment:
18
32
  EnforcedStyle: always
33
+
34
+ Style/StringLiterals:
35
+ EnforcedStyle: double_quotes
36
+
37
+ # rubocop-rspec
38
+
39
+ RSpec/MultipleExpectations:
40
+ Max: 15
41
+
42
+ RSpec/ExampleLength:
43
+ Max: 15
44
+
45
+ # starting rubocop 0.80 newly added cops need to be explicitly enabled:
46
+
47
+ Lint/DeprecatedOpenSSLConstant:
48
+ Enabled: true
49
+
50
+ Layout/EmptyLinesAroundAttributeAccessor:
51
+ Enabled: true
52
+
53
+ Lint/MixedRegexpCaptureTypes:
54
+ Enabled: true
55
+
56
+ Lint/RaiseException:
57
+ Enabled: true
58
+
59
+ Layout/SpaceAroundMethodCallOperator:
60
+ Enabled: true
61
+
62
+ Lint/StructNewOverride:
63
+ Enabled: true
64
+
65
+ Style/ExponentialNotation:
66
+ Enabled: true
67
+
68
+ Style/HashEachMethods:
69
+ Enabled: true
70
+
71
+ Style/HashTransformKeys:
72
+ Enabled: true
73
+
74
+ Style/HashTransformValues:
75
+ Enabled: true
76
+
77
+ Style/RedundantFetchBlock:
78
+ Enabled: true
79
+
80
+ Style/RedundantRegexpCharacterClass:
81
+ Enabled: true
82
+
83
+ Style/RedundantRegexpEscape:
84
+ Enabled: true
85
+
86
+ Style/SlicingWithRange:
87
+ Enabled: true
@@ -1,8 +1,9 @@
1
1
  sudo: false
2
2
  language: ruby
3
+ script:
4
+ - bundle exec rspec
3
5
  rvm:
4
- - 2.4.0
5
- - 2.3.3
6
- - 2.2.6
7
- - 2.1.10
8
- before_install: gem install bundler -v 1.14.3
6
+ - 2.6.6
7
+ - 2.5.8
8
+ - 2.4.10
9
+ before_install: gem install bundler -v 1.17.3
data/Gemfile CHANGED
@@ -1,20 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
7
  group :development, :test do
8
- gem 'byebug' # debugger
9
- gem 'pry' # better console
10
- gem 'pry-byebug' # pry integration for byebug
8
+ gem "byebug" # debugger
9
+ gem "pry" # better console
10
+ gem "pry-byebug" # pry integration for byebug
11
11
  end
12
12
 
13
13
  group :test do
14
- gem 'coveralls', require: false
15
- gem 'flexmock' # mock library
16
- gem 'simplecov', require: false # code coverage
14
+ gem "coveralls", require: false
15
+ gem "simplecov", require: false # code coverage
17
16
  end
18
17
 
19
- local_gemfile = 'Gemfile.local'
18
+ local_gemfile = "Gemfile.local"
20
19
  eval_gemfile(local_gemfile) if File.exist?(local_gemfile)
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![Build Status](https://travis-ci.org/serch/gistory.svg?branch=master)](https://travis-ci.org/serch/gistory)
6
6
  [![Coverage Status](https://coveralls.io/repos/github/serch/gistory/badge.svg?branch=master)](https://coveralls.io/github/serch/gistory?branch=master)
7
7
 
8
- If you use bundler and git, and want to know when a gem you are using was updated, `gistory` comes to your rescue, simply:
8
+ If you use bundler and git and you want to know when a gem was updated, `gistory` comes to the rescue, simply:
9
9
 
10
10
  ```shell
11
11
  gem install gistory
@@ -14,6 +14,7 @@ gistory sidekiq
14
14
  ```
15
15
 
16
16
  and you'll see something like:
17
+
17
18
  ```
18
19
  Gem: sidekiq
19
20
  Current version: 4.2.7
@@ -25,11 +26,17 @@ Change history:
25
26
  4.1.4 on Wed, 9 Nov 2016 14:31 +01:00 (commit 05a3c549)
26
27
  ```
27
28
 
28
- By default `gistory` only looks at the last 100 changes to Gemfile.lock
29
- if you want to see farther in the past run:
29
+ By default `gistory` only looks at the last 100 commits made to the current branch.
30
+ If you want to see farther back in the past run:
31
+
32
+ ```shell
33
+ gistory sidekiq -m1000
34
+ ```
35
+
36
+ If you want to look at all changes to Gemfile.lock in all branches, use the `-a` switch:
30
37
 
31
38
  ```shell
32
- gistory sidekiq -m10000
39
+ gistory sidekiq -a
33
40
  ```
34
41
 
35
42
  Note that if the gem was added, then removed, and then added again, `gistory` will
data/Rakefile CHANGED
@@ -1,12 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/gem_tasks'
4
- require 'rake/testtask'
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
5
 
6
- Rake::TestTask.new(:test) do |t|
7
- t.libs << 'test'
8
- t.libs << 'lib'
9
- t.test_files = FileList['test/**/*_test.rb']
10
- end
6
+ RSpec::Core::RakeTask.new(:spec)
11
7
 
12
- task default: :test
8
+ task default: :spec
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'bundler/setup'
5
- require 'gistory'
6
- require 'pry'
4
+ require "bundler/setup"
5
+ require "gistory"
6
+ require "pry"
7
7
 
8
8
  root_path = "#{File.dirname(__FILE__)}/.."
9
9
 
10
10
  # require all files in lib for quick access to them in the console
11
- Dir["#{root_path}/lib/**/*.rb"].each { |file| require file }
11
+ Dir["#{root_path}/lib/**/*.rb"].sort.each { |file| require file }
12
12
 
13
13
  def reload!
14
14
  verbosity = $VERBOSE
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- lib = File.expand_path('../../lib', __FILE__)
4
+ lib = File.expand_path("../lib", __dir__)
5
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
6
 
7
- require 'gistory'
7
+ require "gistory"
8
8
 
9
9
  Gistory::Cli::Main.new(repo_path: Dir.getwd, args: ARGV).run
@@ -1,33 +1,36 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path("lib", __dir__)
5
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
- require 'gistory/version'
5
+ require "gistory/version"
7
6
 
8
7
  Gem::Specification.new do |spec|
9
- spec.name = 'gistory'
8
+ spec.name = "gistory"
10
9
  spec.version = Gistory::VERSION
11
10
  spec.platform = Gem::Platform::RUBY
12
- spec.required_ruby_version = '>= 2.1'
13
- spec.authors = ['Sergio Medina']
14
- spec.email = ['medinasergio@gmail.com']
11
+ spec.required_ruby_version = ">= 2.4"
12
+ spec.authors = ["Sergio Medina"]
13
+ spec.email = ["medinasergio@gmail.com"]
15
14
 
16
- spec.summary = 'Gistory: Know exactly when a gem was updated in your Gemfile.lock'
17
- spec.description = 'Gistory: Know exactly when a gem was updated in your Gemfile.lock'
18
- spec.homepage = 'https://www.github.com/serch/gistory'
19
- spec.licenses = ['MIT']
15
+ spec.summary = "Gistory: Know exactly when a gem was updated in your Gemfile.lock"
16
+ spec.description = "Gistory: Know exactly when a gem was updated in your Gemfile.lock"
17
+ spec.homepage = "https://www.github.com/serch/gistory"
18
+ spec.licenses = ["MIT"]
20
19
 
21
20
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
22
21
  f.match(%r{^(test|spec|features)/})
23
22
  end
24
- spec.bindir = 'exe'
23
+ spec.bindir = "exe"
25
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
- spec.require_paths = ['lib']
25
+ spec.require_paths = ["lib"]
27
26
 
28
- spec.add_dependency 'bundler', '~> 1.0'
29
- spec.add_dependency 'colorize'
27
+ spec.add_dependency "bundler", "~> 1.0"
28
+ spec.add_dependency "colorize"
30
29
 
31
- spec.add_development_dependency 'rake', '~> 10.0'
32
- spec.add_development_dependency 'minitest', '~> 5.0'
30
+ spec.add_development_dependency "pry"
31
+ spec.add_development_dependency "pry-byebug"
32
+ spec.add_development_dependency "rake", "~> 13.0"
33
+ spec.add_development_dependency "rspec", "~> 3.9"
34
+ spec.add_development_dependency "rubocop"
35
+ spec.add_development_dependency "rubocop-rspec"
33
36
  end
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gistory/version'
3
+ require "gistory/version"
4
4
 
5
- require 'gistory/cli/main'
6
- require 'gistory/cli/arg_parser'
7
- require 'gistory/cli/io'
8
- require 'gistory/configuration'
5
+ require "gistory/cli/main"
6
+ require "gistory/cli/arg_parser"
7
+ require "gistory/cli/io"
8
+ require "gistory/configuration"
9
9
 
10
- require 'gistory/errors'
11
- require 'gistory/commit'
12
- require 'gistory/version_change'
13
- require 'gistory/git_repo'
14
- require 'gistory/change_log'
10
+ require "gistory/errors"
11
+ require "gistory/commit"
12
+ require "gistory/version_change"
13
+ require "gistory/git_repo"
14
+ require "gistory/lockfile_parser"
15
+ require "gistory/change_log"
15
16
 
16
17
  module Gistory
17
18
  class << self
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler'
4
-
5
3
  module Gistory
6
4
  class ChangeLog
7
- LOCKFILE = 'Gemfile.lock'.freeze
5
+ LOCKFILE = "Gemfile.lock"
8
6
 
9
7
  def initialize(repo:)
10
8
  @repo = repo
@@ -12,33 +10,41 @@ module Gistory
12
10
 
13
11
  def changelog_for_gem(gem_name)
14
12
  version_changes = []
15
- previous_version = nil
16
- lockfile_changes = @repo.changes_to_file(LOCKFILE)
13
+ commits_with_changes = @repo.changes_to_file(LOCKFILE)
14
+
15
+ # no lockfile found or no changes to the lockfile found
16
+ return [] if commits_with_changes.empty?
17
+
18
+ previous_commit = commits_with_changes.shift
19
+ previous_gem_spec = gem_version_at_commit_hash(previous_commit.short_hash, gem_name)
20
+ # only one change to the lockfile was found and the gem was not there
21
+ return [] if previous_gem_spec.nil?
17
22
 
18
- lockfile_changes.each do |commit|
19
- gem_spec = gem_spec_at_commit_hash(commit.short_hash, gem_name)
23
+ commits_with_changes.each do |current_commit|
24
+ current_gem_spec = gem_version_at_commit_hash(current_commit.short_hash, gem_name)
20
25
 
21
26
  # we reached the end, the gem didn't exist back then
22
27
  # TODO: what if it was added then removed and then added again?
23
- break if gem_spec.nil?
28
+ break if current_gem_spec.nil?
24
29
 
25
- # only store version changes of this gem
26
- unless gem_spec.version.to_s == previous_version
27
- version_changes << VersionChange.new(commit: commit, version: gem_spec.version)
28
- previous_version = gem_spec.version.to_s
30
+ if current_gem_spec != previous_gem_spec
31
+ version_changes << VersionChange.new(commit: previous_commit, version: previous_gem_spec)
29
32
  end
33
+
34
+ previous_gem_spec = current_gem_spec
35
+ previous_commit = current_commit
30
36
  end
31
37
 
38
+ version_changes << VersionChange.new(commit: previous_commit, version: previous_gem_spec)
39
+
32
40
  version_changes
33
41
  end
34
42
 
35
43
  private
36
44
 
37
- def gem_spec_at_commit_hash(commit_hash, gem_name)
45
+ def gem_version_at_commit_hash(commit_hash, gem_name)
38
46
  lockfile_content = @repo.file_content_at_commit(commit_hash, LOCKFILE)
39
- lockfile = Bundler::LockfileParser.new(lockfile_content)
40
- gem_spec = lockfile.specs.find { |spec| spec.name == gem_name }
41
- gem_spec
47
+ LockfileParser.new(lockfile_content: lockfile_content).gem_version(gem_name)
42
48
  end
43
49
  end
44
50
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'optparse'
3
+ require "optparse"
4
4
 
5
5
  module Gistory
6
6
  module Cli
@@ -18,8 +18,8 @@ module Gistory
18
18
  parse_gem_name
19
19
  @io.error("extra parameters ignored: #{@args}") unless @args.count.zero?
20
20
  @config
21
- rescue OptionParser::InvalidOption => err
22
- raise(Gistory::ParserError, err.message)
21
+ rescue OptionParser::InvalidOption => e
22
+ raise(Gistory::ParserError, e.message)
23
23
  end
24
24
 
25
25
  def to_s
@@ -30,53 +30,55 @@ module Gistory
30
30
 
31
31
  def parse_gem_name
32
32
  gem_name = @args.shift
33
- raise(Gistory::ParserError, 'No gem specified') unless gem_name
33
+ raise(Gistory::ParserError, "No gem specified") unless gem_name
34
34
  @config.gem_name = gem_name
35
35
  end
36
36
 
37
37
  def create_parser(config)
38
38
  parser = OptionParser.new
39
- parser.banner = 'Usage: gistory <gem_name> [options]'
39
+ parser.banner = "Usage: gistory <gem_name> [options]"
40
40
 
41
- add_specific_options(parser, config)
42
- add_common_options(parser)
41
+ add_options(parser, config)
43
42
 
44
43
  parser
45
44
  end
46
45
 
47
- def add_specific_options(parser, config)
48
- parser.separator ''
49
- parser.separator 'Specific options:'
50
-
51
- add_max_lockfile_changes(parser, config)
52
- end
53
-
54
- def add_common_options(parser)
55
- parser.separator ''
56
- parser.separator 'Common options:'
46
+ def add_options(parser, config)
47
+ parser.separator ""
48
+ parser.separator "Options:"
57
49
 
50
+ add_max_fetched_commits(parser, config)
51
+ add_use_commits_from_all_branches(parser, config)
58
52
  add_help(parser)
59
53
  add_version(parser)
60
54
  end
61
55
 
62
- def add_max_lockfile_changes(parser, config)
63
- default = config.max_lockfile_changes
64
- description = "max number of changes to the lock file (default #{default})"
65
- parser.on('-m', '--max-lockfile-changes [INTEGER]', Integer, description) do |m|
66
- raise(Gistory::ParserError, 'argument --max-lockfile-changes must be an integer') if m.nil?
67
- config.max_lockfile_changes = m
56
+ def add_max_fetched_commits(parser, config)
57
+ default = config.max_fetched_commits
58
+ description = "max number of commits to be fetched (default #{default})"
59
+ parser.on("-m", "--max-fetched-commits [Integer]", Integer, description) do |m|
60
+ raise(Gistory::ParserError, "argument --max-fetched-commits must be an integer") if m.nil?
61
+ config.max_fetched_commits = m
62
+ end
63
+ end
64
+
65
+ def add_use_commits_from_all_branches(parser, config)
66
+ description = "use commits from all branches " \
67
+ "(by default it uses only commits made to the current branch)"
68
+ parser.on("-a", "--all-branches", description) do |a|
69
+ config.all_branches = a
68
70
  end
69
71
  end
70
72
 
71
73
  def add_help(parser)
72
- parser.on_tail('-h', '--help', 'Show this message') do
74
+ parser.on_tail("-h", "--help", "Show this message") do
73
75
  @io.puts parser
74
76
  exit
75
77
  end
76
78
  end
77
79
 
78
80
  def add_version(parser)
79
- parser.on_tail('--version', 'Show version') do
81
+ parser.on_tail("--version", "Show version") do
80
82
  @io.puts "gistory version #{Gistory::VERSION}"
81
83
  exit
82
84
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'colorize'
3
+ require "colorize"
4
4
 
5
5
  module Gistory
6
6
  module Cli
@@ -14,11 +14,11 @@ module Gistory
14
14
  parser = Cli::ArgParser.new(args: @args, io: @io)
15
15
  config = parser.parse
16
16
  history(repo, config.gem_name)
17
- rescue Gistory::ParserError => error
18
- @io.error error.message
17
+ rescue Gistory::ParserError => e
18
+ @io.error e.message
19
19
  @io.puts parser
20
- rescue Gistory::Error => error
21
- @io.error error.message
20
+ rescue Gistory::Error => e
21
+ @io.error e.message
22
22
  end
23
23
 
24
24
  private
@@ -32,16 +32,34 @@ module Gistory
32
32
 
33
33
  @io.puts "Gem: #{gem_name}"
34
34
  @io.puts "Current version: #{changes.first.version}"
35
- @io.puts ''
35
+ @io.puts ""
36
+
37
+ print_change_history(changes)
38
+
39
+ @io.puts ""
40
+
41
+ print_configuration_info
42
+ end
43
+
44
+ def print_change_history(changes)
45
+ @io.puts "Change history:"
46
+ max_length = changes.map { |c| c.version.length }.max
36
47
 
37
- @io.puts 'Change history:'
38
48
  changes.each do |change|
39
- @io.puts "#{change.version} on #{change.date.strftime('%a, %e %b %Y %H:%M %Z')} (commit #{change.short_hash})"
49
+ @io.puts "#{change.version.ljust(max_length)} on #{change.date.strftime('%a, %e %b %Y %H:%M %Z')} " \
50
+ "(commit #{change.short_hash})"
51
+ end
52
+ end
53
+
54
+ def print_configuration_info
55
+ max = Gistory.config.max_fetched_commits
56
+ if Gistory.config.all_branches?
57
+ @io.puts "The last #{max} changes to the lock file were fetched."
58
+ else
59
+ @io.puts "The last #{max} commits made to the current branch were fetched."
40
60
  end
41
61
 
42
- @io.puts ''
43
- max = Gistory.config.max_lockfile_changes
44
- @io.puts "The last #{max} changes to the lock file were taken into account, to see farther in the past use the -m switch" # rubocop:disable Metrics/LineLength
62
+ @io.puts "To see farther in the past use the -m switch"
45
63
  end
46
64
  end
47
65
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'date'
3
+ require "date"
4
4
 
5
5
  module Gistory
6
6
  class Commit
@@ -11,5 +11,9 @@ module Gistory
11
11
  @date = DateTime.parse(date.to_s)
12
12
  freeze
13
13
  end
14
+
15
+ def to_s
16
+ "Commit #{short_hash} on #{date}"
17
+ end
14
18
  end
15
19
  end
@@ -2,10 +2,16 @@
2
2
 
3
3
  module Gistory
4
4
  class Configuration
5
- attr_accessor :gem_name, :max_lockfile_changes
5
+ attr_accessor :gem_name, :max_fetched_commits
6
+ attr_writer :all_branches
6
7
 
7
8
  def initialize
8
- @max_lockfile_changes = 100
9
+ @max_fetched_commits = 100
10
+ @all_branches = false
11
+ end
12
+
13
+ def all_branches?
14
+ @all_branches
9
15
  end
10
16
  end
11
17
  end
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'English'
3
+ require "English"
4
4
 
5
5
  module Gistory
6
6
  class GitRepo
7
7
  def initialize(path:)
8
- raise(Gistory::Error, 'This is not a valid git repository') unless Dir.exist?(File.join(path, '.git'))
9
- raise(Gistory::Error, 'git is not available, please install it') unless git_cli_available?
8
+ raise(Gistory::Error, "This is not a valid git repository") unless Dir.exist?(File.join(path, ".git"))
9
+ raise(Gistory::Error, "git is not available, please install it") unless git_cli_available?
10
10
  end
11
11
 
12
12
  def changes_to_file(filename)
13
- max_count = Gistory.config.max_lockfile_changes
14
- hashes_and_dates = git("log --pretty=format:'%h|%cD' --max-count=#{max_count} --follow #{filename}")
13
+ max_count = Gistory.config.max_fetched_commits
14
+ strategy = git_log_strategy(filename)
15
+ hashes_and_dates = git("log --pretty=format:'%h|%cD' --max-count=#{max_count} #{strategy}")
15
16
  to_commits(hashes_and_dates.split("\n"))
16
17
  end
17
18
 
@@ -21,20 +22,29 @@ module Gistory
21
22
 
22
23
  private
23
24
 
25
+ def git_log_strategy(filename)
26
+ if Gistory.config.all_branches?
27
+ "--follow #{filename}"
28
+ else
29
+ # TODO: filter out commits that did not introduce changes to the lock file
30
+ "--first-parent"
31
+ end
32
+ end
33
+
24
34
  def git_cli_available?
25
- system('which git > /dev/null 2>&1')
35
+ system("which git > /dev/null 2>&1")
26
36
  end
27
37
 
28
38
  def to_commits(hashes_and_dates)
29
39
  hashes_and_dates.map do |hash_and_date|
30
- commit_hash, date = hash_and_date.split('|')
40
+ commit_hash, date = hash_and_date.split("|")
31
41
  Commit.new(short_hash: commit_hash, date: date)
32
42
  end
33
43
  end
34
44
 
35
45
  def git(command)
36
46
  out = `git #{command}`
37
- raise('Git CLI command failed') unless $CHILD_STATUS.success?
47
+ raise "Git CLI command failed" unless $CHILD_STATUS.success?
38
48
  out
39
49
  end
40
50
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler"
4
+
5
+ module Gistory
6
+ class LockfileParser
7
+ def initialize(lockfile_content:)
8
+ @lockfile_content = lockfile_content
9
+ end
10
+
11
+ def gem_version(gem_name)
12
+ lockfile = Bundler::LockfileParser.new(@lockfile_content)
13
+ gem_spec = lockfile.specs.find { |spec| spec.name == gem_name }
14
+ gem_spec ? gem_spec.version.to_s : nil
15
+ rescue Bundler::LockfileError => _e
16
+ # bundler could not parse the lockfile
17
+ # f.i. it could have been committed with merge conflicts
18
+ # try to parse it with a regex
19
+ # gem version looks like " byebug (9.0.6)"
20
+ # TODO: what if the gem was in the merge conflict?
21
+ regexp = /\n\s{4}#{gem_name} \((?<version>.+)\)\n/
22
+ matches = @lockfile_content.match(regexp)
23
+ matches ? matches[:version] : nil
24
+ end
25
+ end
26
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gistory
4
- VERSION = '0.1.5'.freeze
4
+ VERSION = "0.2.1"
5
5
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
3
+ require "forwardable"
4
4
 
5
5
  module Gistory
6
6
  class VersionChange
@@ -14,5 +14,9 @@ module Gistory
14
14
  @version = version
15
15
  freeze
16
16
  end
17
+
18
+ def to_s
19
+ "Version #{version} (on #{date} by #{short_hash})"
20
+ end
17
21
  end
18
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gistory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergio Medina
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-27 00:00:00.000000000 Z
11
+ date: 2020-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,34 +38,90 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rake
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: '10.0'
75
+ version: '13.0'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
- version: '10.0'
82
+ version: '13.0'
55
83
  - !ruby/object:Gem::Dependency
56
- name: minitest
84
+ name: rspec
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - "~>"
60
88
  - !ruby/object:Gem::Version
61
- version: '5.0'
89
+ version: '3.9'
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - "~>"
67
95
  - !ruby/object:Gem::Version
68
- version: '5.0'
96
+ version: '3.9'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
69
125
  description: 'Gistory: Know exactly when a gem was updated in your Gemfile.lock'
70
126
  email:
71
127
  - medinasergio@gmail.com
@@ -77,6 +133,7 @@ files:
77
133
  - ".codeclimate.yml"
78
134
  - ".coveralls.yml"
79
135
  - ".gitignore"
136
+ - ".rspec"
80
137
  - ".rubocop.yml"
81
138
  - ".travis.yml"
82
139
  - Gemfile
@@ -96,13 +153,14 @@ files:
96
153
  - lib/gistory/configuration.rb
97
154
  - lib/gistory/errors.rb
98
155
  - lib/gistory/git_repo.rb
156
+ - lib/gistory/lockfile_parser.rb
99
157
  - lib/gistory/version.rb
100
158
  - lib/gistory/version_change.rb
101
159
  homepage: https://www.github.com/serch/gistory
102
160
  licenses:
103
161
  - MIT
104
162
  metadata: {}
105
- post_install_message:
163
+ post_install_message:
106
164
  rdoc_options: []
107
165
  require_paths:
108
166
  - lib
@@ -110,16 +168,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
168
  requirements:
111
169
  - - ">="
112
170
  - !ruby/object:Gem::Version
113
- version: '2.1'
171
+ version: '2.4'
114
172
  required_rubygems_version: !ruby/object:Gem::Requirement
115
173
  requirements:
116
174
  - - ">="
117
175
  - !ruby/object:Gem::Version
118
176
  version: '0'
119
177
  requirements: []
120
- rubyforge_project:
121
- rubygems_version: 2.6.12
122
- signing_key:
178
+ rubygems_version: 3.0.3
179
+ signing_key:
123
180
  specification_version: 4
124
181
  summary: 'Gistory: Know exactly when a gem was updated in your Gemfile.lock'
125
182
  test_files: []