gjp 0.38.0 → 0.39.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/.rubocop.yml +6 -2
  2. data/Rakefile +2 -0
  3. data/SPECIAL_CASES.md +1 -1
  4. data/bin/gjp +1 -1
  5. data/gjp.gemspec +1 -1
  6. data/lib/gjp.rb +23 -2
  7. data/lib/gjp/ant_runner.rb +1 -1
  8. data/lib/gjp/archiver.rb +4 -3
  9. data/lib/gjp/commands/ant.rb +2 -0
  10. data/lib/gjp/commands/base.rb +4 -8
  11. data/lib/gjp/commands/download_maven_source_jars.rb +1 -0
  12. data/lib/gjp/commands/dry_run.rb +1 -0
  13. data/lib/gjp/commands/finish.rb +2 -1
  14. data/lib/gjp/commands/generate_all.rb +4 -3
  15. data/lib/gjp/commands/generate_kit_archive.rb +3 -2
  16. data/lib/gjp/commands/generate_kit_spec.rb +1 -0
  17. data/lib/gjp/commands/generate_package_archive.rb +1 -0
  18. data/lib/gjp/commands/generate_package_script.rb +1 -0
  19. data/lib/gjp/commands/generate_package_spec.rb +2 -1
  20. data/lib/gjp/commands/get_pom.rb +1 -0
  21. data/lib/gjp/commands/get_source.rb +6 -10
  22. data/lib/gjp/commands/init.rb +1 -0
  23. data/lib/gjp/commands/list_kit_missing_sources.rb +3 -2
  24. data/lib/gjp/commands/move_jars_to_kit.rb +1 -0
  25. data/lib/gjp/commands/mvn.rb +2 -0
  26. data/lib/gjp/git.rb +5 -5
  27. data/lib/gjp/kit_checker.rb +8 -12
  28. data/lib/gjp/kit_runner.rb +6 -8
  29. data/lib/gjp/logger.rb +3 -5
  30. data/lib/gjp/main.rb +1 -1
  31. data/lib/gjp/maven_runner.rb +1 -1
  32. data/lib/gjp/maven_website.rb +0 -2
  33. data/lib/gjp/pom.rb +1 -4
  34. data/lib/gjp/pom_getter.rb +7 -15
  35. data/lib/gjp/project.rb +24 -25
  36. data/lib/gjp/source_getter.rb +3 -7
  37. data/lib/gjp/template_manager.rb +0 -2
  38. data/lib/gjp/version.rb +2 -1
  39. data/lib/gjp/version_matcher.rb +8 -14
  40. data/spec/lib/ant_runner_spec.rb +1 -2
  41. data/spec/lib/maven_runner_spec.rb +0 -1
  42. data/spec/lib/project_spec.rb +10 -10
  43. data/spec/lib/script_generator_spec.rb +1 -0
  44. data/spec/lib/template_manager_spec.rb +1 -0
  45. data/spec/spec_helper.rb +2 -1
  46. data/spec/{lib/kit_runner_spec.rb → support/kit_runner_examples.rb} +0 -2
  47. metadata +4 -5
  48. data/.rubocop_todo.yml +0 -111
@@ -1,10 +1,14 @@
1
- inherit_from: .rubocop_todo.yml
2
-
3
1
  ClassLength:
4
2
  Max: 200
5
3
 
6
4
  LineLength:
7
5
  Max: 120
8
6
 
7
+ MethodLength:
8
+ Max: 35
9
+
9
10
  StringLiterals:
10
11
  EnforcedStyle: double_quotes
12
+
13
+ MultilineBlockChain:
14
+ Enabled: false
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
@@ -14,7 +14,7 @@ You can do any manual changes to spec and build.sh files and regenerate them lat
14
14
  * `gjp generate-package-archive`: (re)generates a package tarball;
15
15
  * `gjp generate-package-spec`: (re)generates a package spec;
16
16
 
17
- Note that, by default, `generate-kit-archive` will generate additional "diff" tar.xz files instead of rewriting the whole archive - this will result in faster uploads if you use OBS (see below). You can use the `--full` option to regenerate a single complete archive.
17
+ Note that, by default, `generate-kit-archive` will generate additional "diff" tar.xz files instead of rewriting the whole archive - this will result in faster uploads if you use OBS (see below). You can use the `--whole` option to regenerate a single complete archive.
18
18
 
19
19
  ## Kit sources
20
20
 
data/bin/gjp CHANGED
@@ -16,7 +16,7 @@
16
16
  #
17
17
 
18
18
  if File.exist?(File.join(File.dirname(__FILE__), "..", ".git"))
19
- $: << File.join(File.dirname(__FILE__), "..", "lib")
19
+ $LOAD_PATH << File.join(File.dirname(__FILE__), "..", "lib")
20
20
  end
21
21
 
22
22
  begin
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
- $:.push File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.push File.expand_path("../lib", __FILE__)
3
3
  require "gjp/version"
4
4
 
5
5
  Gem::Specification.new do |s|
data/lib/gjp.rb CHANGED
@@ -1,4 +1,25 @@
1
- # backend
1
+ # encoding: UTF-8
2
+
3
+ # ruby standard library
4
+ require "digest/sha1"
5
+ require "English"
6
+ require "erb"
7
+ require "find"
8
+ require "forwardable"
9
+ require "logger"
10
+ require "open-uri"
11
+ require "pathname"
12
+ require "singleton"
13
+ require "text"
14
+
15
+ # third party libraries
16
+ require "clamp"
17
+ require "json"
18
+ require "nokogiri"
19
+ require "rest_client"
20
+ require "zip"
21
+
22
+ # internal, backend
2
23
  require "gjp/version"
3
24
  require "gjp/logger"
4
25
  require "gjp/template_manager"
@@ -19,7 +40,7 @@ require "gjp/spec_generator"
19
40
  require "gjp/archiver"
20
41
  require "gjp/kit_checker"
21
42
 
22
- # UI
43
+ # internal, UI
23
44
  require "gjp/commands/base"
24
45
 
25
46
  require "gjp/commands/ant"
@@ -20,7 +20,7 @@ module Gjp
20
20
 
21
21
  "#{ant_path}"
22
22
  else
23
- raise ExecutableNotFoundError.new("ant")
23
+ fail ExecutableNotFoundError, "ant"
24
24
  end
25
25
  end
26
26
  end
@@ -10,7 +10,7 @@ module Gjp
10
10
  end
11
11
 
12
12
  # generates an archive for the kit package
13
- def archive_kit(full)
13
+ def archive_kit(whole)
14
14
  destination_dir = File.join(@project.full_path, "output", "#{@project.name}-kit")
15
15
  FileUtils.mkdir_p(destination_dir)
16
16
  file_prefix = "#{@project.name}-kit"
@@ -19,7 +19,7 @@ module Gjp
19
19
  @project.take_snapshot "Kit archival started"
20
20
 
21
21
  destination_file = (
22
- if full
22
+ if whole
23
23
  remove_stale_incremental(destination_dir, file_prefix, file_suffix)
24
24
  archive_single("kit", File.join(destination_dir, file_prefix + file_suffix))
25
25
  else
@@ -62,7 +62,8 @@ module Gjp
62
62
  if latest_tag_count == 0
63
63
  archive_single(source_directory, File.join(destination_dir, file_prefix + file_suffix))
64
64
  else
65
- destination_file = File.join(destination_dir, "#{file_prefix}_#{"%04d" % (latest_tag_count)}#{file_suffix}")
65
+ destination_file = File.join(destination_dir,
66
+ "#{file_prefix}_#{format("%04d", latest_tag_count)}#{file_suffix}")
66
67
  tag = @project.latest_tag(tag_prefix)
67
68
  log.debug "creating #{destination_file} with files newer than #{tag}"
68
69
 
@@ -1,10 +1,12 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp ant
4
5
  class AntCommand < Gjp::BaseCommand
5
6
  parameter "[ANT OPTIONS] ...", "ant options", attribute_name: "dummy"
6
7
 
7
8
  # override parsing in order to pipe everything to mvn
9
+ # rubocop:disable TrivialAccessors
8
10
  def parse(args)
9
11
  @options = args
10
12
  end
@@ -1,6 +1,4 @@
1
1
  # encoding: UTF-8
2
- require "clamp"
3
- require "gjp/logger"
4
2
 
5
3
  module Gjp
6
4
  # implements common options and utility methods
@@ -8,7 +6,7 @@ module Gjp
8
6
  include Logging
9
7
 
10
8
  # Options available to all gjp commands
11
- option ["-v", "--verbose"], :flag, "verbose output"
9
+ option %w(-v --verbose), :flag, "verbose output"
12
10
  option ["--very-verbose"], :flag, "very verbose output"
13
11
  option ["--very-very-verbose"], :flag, "very very verbose output"
14
12
 
@@ -40,7 +38,7 @@ module Gjp
40
38
 
41
39
  # prints an error message and exits unless there is a dry-run in progress
42
40
  def ensure_dry_running(state, project)
43
- if project.is_dry_running == state
41
+ if project.dry_running? == state
44
42
  yield
45
43
  else
46
44
  if state == true
@@ -54,9 +52,7 @@ module Gjp
54
52
  # outputs output of a file generation
55
53
  def print_generation_result(project, result_path, conflict_count = 0)
56
54
  puts "#{format_path(result_path, project)} generated"
57
- if conflict_count > 0
58
- puts "Warning: #{conflict_count} unresolved conflicts"
59
- end
55
+ puts "Warning: #{conflict_count} unresolved conflicts" if conflict_count > 0
60
56
  end
61
57
 
62
58
  # generates a version of path relative to the current directory
@@ -84,7 +80,7 @@ module Gjp
84
80
  $stderr.puts "#{e.directory} is not a gjp project directory, see gjp init"
85
81
  rescue NoPackageDirectoryError => e
86
82
  $stderr.puts "#{e.directory} is not a gjp package directory, see README"
87
- rescue GitAlreadyInitedError => e
83
+ rescue GitAlreadyInitedError
88
84
  $stderr.puts "This directory is already a gjp project"
89
85
  rescue ExecutableNotFoundError => e
90
86
  $stderr.puts "Executable #{e.executable} not found in kit/ or any of its subdirectories"
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp download-maven-source-jars
4
5
  class DownloadMavenSourceJarsCommand < Gjp::BaseCommand
5
6
  def execute
6
7
  checking_exceptions do
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp dry-run
4
5
  class DryRunCommand < Gjp::BaseCommand
5
6
  def execute
6
7
  checking_exceptions do
@@ -1,8 +1,9 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp finish
4
5
  class FinishCommand < Gjp::BaseCommand
5
- option ["-a", "--abort"], :flag, "build abort, restore files as before dry-run"
6
+ option %w(-a --abort), :flag, "build abort, restore files as before dry-run"
6
7
 
7
8
  def execute
8
9
  checking_exceptions do
@@ -1,9 +1,10 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp generate-all
4
5
  class GenerateAllCommand < Gjp::BaseCommand
5
- option ["-f", "--filter"], "FILTER", "filter files to be installed by this package spec", default: "*.jar"
6
- option ["-f", "--full"], :flag, "create a full archive (not incremental)"
6
+ option %w(-f --filter), "FILTER", "filter files to be installed by this package spec", default: "*.jar"
7
+ option %w(-w --whole), :flag, "recreate the whole archive (not incremental)"
7
8
  parameter "[DIRECTORY]", "path to a package directory (src/<package name>)", default: "."
8
9
  parameter "[POM]", "a package pom file path", default: "pom.xml"
9
10
 
@@ -13,7 +14,7 @@ module Gjp
13
14
  ensure_dry_running(false, project) do
14
15
  package_name = project.get_package_name(directory)
15
16
 
16
- result_path = Gjp::Archiver.new(project).archive_kit(full?)
17
+ result_path = Gjp::Archiver.new(project).archive_kit(whole?)
17
18
  print_generation_result(project, result_path)
18
19
 
19
20
  result_path, conflict_count = Gjp::SpecGenerator.new(project).generate_kit_spec
@@ -1,14 +1,15 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp generate-kit-archive
4
5
  class GenerateKitArchiveCommand < Gjp::BaseCommand
5
- option ["-f", "--full"], :flag, "create a full archive (not incremental)"
6
+ option %w(-w --whole), :flag, "recreate the whole archive (not incremental)"
6
7
 
7
8
  def execute
8
9
  checking_exceptions do
9
10
  project = Gjp::Project.new(".")
10
11
  ensure_dry_running(false, project) do
11
- result_path = Gjp::Archiver.new(project).archive_kit(full?)
12
+ result_path = Gjp::Archiver.new(project).archive_kit(whole?)
12
13
  print_generation_result(project, result_path)
13
14
  end
14
15
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp generate-kit-spec
4
5
  class GenerateKitSpecCommand < Gjp::BaseCommand
5
6
  def execute
6
7
  checking_exceptions do
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp generate-package-archive
4
5
  class GeneratePackageArchiveCommand < Gjp::BaseCommand
5
6
  parameter "[DIRECTORY]", "path to a package directory (src/<package name>)", default: "."
6
7
 
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp generate-package-script
4
5
  class GeneratePackageScriptCommand < Gjp::BaseCommand
5
6
  parameter "[DIRECTORY]", "path to a package directory (src/<package name>)", default: "."
6
7
 
@@ -1,8 +1,9 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp generate-package-spec
4
5
  class GeneratePackageSpecCommand < Gjp::BaseCommand
5
- option ["-f", "--filter"], "FILTER", "filter files to be installed by this spec", default: "*.jar"
6
+ option %w(-f --filter), "FILTER", "filter files to be installed by this spec", default: "*.jar"
6
7
  parameter "[DIRECTORY]", "path to a package directory (src/<package name>)", default: "."
7
8
  parameter "[POM]", "a pom file path", default: "pom.xml"
8
9
 
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp get-pom
4
5
  class GetPomCommand < Gjp::BaseCommand
5
6
  parameter "NAME", "a jar file name or a `name-version` string (heuristic)"
6
7
 
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp get-source
4
5
  class GetSourceCommand < Gjp::BaseCommand
5
6
  parameter "POM", "a pom file path or URI"
6
7
 
@@ -16,17 +17,12 @@ module Gjp
16
17
  effective_pom_path = Gjp::MavenRunner.new(project).get_effective_pom(pom)
17
18
  puts "Source jar not found in Maven. Try looking here:"
18
19
  pom = Gjp::Pom.new(effective_pom_path)
19
- unless pom.url.empty?
20
- puts "Website: #{pom.url}"
21
- end
22
- unless pom.scm_connection.empty?
23
- puts "SCM connection: #{pom.scm_connection}"
24
- end
25
- unless pom.scm_url.empty?
26
- puts "SCM connection: #{pom.scm_url}"
27
- end
20
+ puts "Website: #{pom.url}" unless pom.url.empty?
21
+ puts "SCM connection: #{pom.scm_connection}" unless pom.scm_connection.empty?
22
+ puts "SCM connection: #{pom.scm_url}" unless pom.scm_url.empty?
28
23
  puts "The effective POM: #{effective_pom_path}"
29
- puts "Google: http://google.com/#q=#{URI.encode(pom.name + " sources")}"
24
+ name = !pom.name.empty? ? pom.name : pom.artifact_id
25
+ puts "Google: http://google.com/#q=#{URI.encode("#{name} sources")}"
30
26
  end
31
27
  end
32
28
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp init
4
5
  class InitCommand < Gjp::BaseCommand
5
6
  def execute
6
7
  checking_exceptions do
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp list-kit-missing-sources
4
5
  class ListKitMissingSourcesCommand < Gjp::BaseCommand
5
6
  def execute
6
7
  checking_exceptions do
@@ -10,8 +11,8 @@ module Gjp
10
11
  ensure_dry_running(false, project) do
11
12
  puts "Some source files were not found in these archives:"
12
13
  kit_checker.unsourced_archives.each do |archive|
13
- percentage = "%.2f" % (100.0 * archive[:unsourced_class_names].length / archive[:class_names].length)
14
- puts "#{format_path(archive[:archive], project)} (~#{percentage}% missing)"
14
+ percentage = 100.0 * archive[:unsourced_class_names].length / archive[:class_names].length
15
+ puts "#{format_path(archive[:archive], project)} (~#{format("%.2f", percentage)}% missing)"
15
16
  end
16
17
  end
17
18
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp move-jars-to-kit
4
5
  class MoveJarsToKitCommand < Gjp::BaseCommand
5
6
  def execute
6
7
  checking_exceptions do
@@ -1,10 +1,12 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
+ # gjp mvn
4
5
  class MavenCommand < Gjp::BaseCommand
5
6
  parameter "[MAVEN OPTIONS] ...", "mvn options", attribute_name: "dummy"
6
7
 
7
8
  # override parsing in order to pipe everything to mvn
9
+ # rubocop:disable TrivialAccessors
8
10
  def parse(args)
9
11
  @options = args
10
12
  end
@@ -18,7 +18,7 @@ module Gjp
18
18
  if Dir.exist?(".git") == false
19
19
  `git init`
20
20
  else
21
- raise GitAlreadyInitedError
21
+ fail GitAlreadyInitedError
22
22
  end
23
23
  end
24
24
  end
@@ -56,9 +56,9 @@ module Gjp
56
56
  # rename all .gitignore files by default as
57
57
  # they prevent snapshotting
58
58
  Find.find(".") do |file|
59
- if file =~ /\.gitignore$/
60
- FileUtils.mv(file, "#{file}_disabled_by_gjp")
61
- end
59
+ next unless file =~ /\.gitignore$/
60
+
61
+ FileUtils.mv(file, "#{file}_disabled_by_gjp")
62
62
  end
63
63
 
64
64
  `git rm -r --cached --ignore-unmatch .`
@@ -116,7 +116,7 @@ module Gjp
116
116
  log.debug "calling git merge-file #{path} #{path}.old_version #{new_path}, output follows"
117
117
  `git merge-file #{path} #{path}.old_version #{new_path} \
118
118
  -L "newly generated" -L "previously generated" -L "user edited"`
119
- conflict_count = $?.exitstatus
119
+ conflict_count = $CHILD_STATUS.exitstatus
120
120
  File.delete "#{path}.old_version"
121
121
  return conflict_count
122
122
  end
@@ -1,8 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "find"
4
- require "zip"
5
-
6
3
  module Gjp
7
4
  # checks kits for errors
8
5
  class KitChecker
@@ -22,14 +19,12 @@ module Gjp
22
19
  [path, nil]
23
20
  end
24
21
 
25
- archived_file_paths = plain_file_paths.select do |path, archive|
22
+ archived_file_paths = plain_file_paths.select do |path, _archive|
26
23
  path. =~ (/\.(zip)|([jwe]ar)$/)
27
- end.map do |path, archive|
24
+ end.map do |path, _archive|
28
25
  result = []
29
26
  Zip::File.foreach(path) do |entry|
30
- if entry.file?
31
- result << [entry.to_s, path]
32
- end
27
+ result << [entry.to_s, path] if entry.file?
33
28
  end
34
29
  result
35
30
  end.flatten(1)
@@ -41,7 +36,7 @@ module Gjp
41
36
  # returns a list of class names for which
42
37
  # we have source files in kit/
43
38
  def source_class_names(paths)
44
- source_paths = paths.select do |path, archive|
39
+ source_paths = paths.select do |path, _archive|
45
40
  path =~ /\.java$/
46
41
  end
47
42
 
@@ -49,7 +44,7 @@ module Gjp
49
44
  # back the directory tree all the way back to root.
50
45
  # This could add non-existent names, but allows not looking
51
46
  # in the file at all
52
- class_names = source_paths.map do |path, archive|
47
+ class_names = source_paths.map do |path, _archive|
53
48
  class_name = path_to_class(path)
54
49
  parts = class_name.split(".")
55
50
  last_index = parts.length - 1
@@ -65,7 +60,7 @@ module Gjp
65
60
  # we have binary files in kit/
66
61
  def compiled_classes(paths)
67
62
  result = {}
68
- compiled_paths = paths.select do |path, archive|
63
+ paths.select do |path, _archive|
69
64
  path =~ /\.class$/
70
65
  end.each do |path, archive|
71
66
  class_name = path_to_class(path)
@@ -86,7 +81,7 @@ module Gjp
86
81
  source_class_names = source_class_names(paths)
87
82
  archive_paths_to_class_names = compiled_classes(paths)
88
83
 
89
- result = archive_paths_to_class_names.map do |archive, class_names|
84
+ archive_paths_to_class_names.map do |archive, class_names|
90
85
  unsourced_class_names = class_names.select do |class_name|
91
86
  source_class_names.include?(class_name) == false
92
87
  end
@@ -97,6 +92,7 @@ module Gjp
97
92
  end
98
93
 
99
94
  private
95
+
100
96
  # attempts to turn a .java/.class file name into a class name
101
97
  def path_to_class(path)
102
98
  path
@@ -1,8 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "find"
4
- require "pathname"
5
-
6
3
  module Gjp
7
4
  # runs programs from a gjp kit with gjp-specific options
8
5
  class KitRunner
@@ -16,10 +13,10 @@ module Gjp
16
13
  def find_executable(name)
17
14
  @project.from_directory do
18
15
  Find.find("kit") do |path|
19
- if path =~ /bin\/#{name}$/
20
- log.debug("found #{name} executable: #{path}")
21
- return path
22
- end
16
+ next unless path =~ /bin\/#{name}$/
17
+
18
+ log.debug("found #{name} executable: #{path}")
19
+ return path
23
20
  end
24
21
  end
25
22
 
@@ -31,10 +28,11 @@ module Gjp
31
28
  def run_executable(full_commandline)
32
29
  log.debug "running #{full_commandline}"
33
30
  Process.wait(Process.spawn(full_commandline))
34
- $?.exitstatus == 0
31
+ $CHILD_STATUS.exitstatus == 0
35
32
  end
36
33
  end
37
34
 
35
+ # an executable from the kit was not found
38
36
  class ExecutableNotFoundError < Exception
39
37
  attr_reader :executable
40
38
 
@@ -1,10 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "singleton"
4
- require "forwardable"
5
- require "logger"
6
-
7
3
  module Gjp
4
+ # configures logging for this application
8
5
  class Logger
9
6
  include Singleton
10
7
  extend Forwardable
@@ -15,12 +12,13 @@ module Gjp
15
12
  @logger = ::Logger.new(STDERR)
16
13
  @logger.datetime_format = "%Y-%m-%d %H:%M "
17
14
  @logger.level = ::Logger::ERROR
18
- @logger.formatter = proc do |severity, datetime, progname, msg|
15
+ @logger.formatter = proc do |severity, _datetime, _progname, msg|
19
16
  "#{severity.chars.first}: #{msg}\n"
20
17
  end
21
18
  end
22
19
  end
23
20
 
21
+ # convenience methods
24
22
  module Logging
25
23
  # convenience instance method
26
24
  def log
@@ -1,7 +1,7 @@
1
1
  # encoding: UTF-8
2
- require "clamp"
3
2
 
4
3
  module Gjp
4
+ # program entry point
5
5
  class MainCommand < Clamp::Command
6
6
  subcommand(
7
7
  "init",
@@ -40,7 +40,7 @@ module Gjp
40
40
 
41
41
  "#{mvn_path} -Dmaven.repo.local=#{repo_path} -s#{config_path} #{options.join(" ")}"
42
42
  else
43
- raise ExecutableNotFoundError.new("mvn")
43
+ fail ExecutableNotFoundError, "mvn"
44
44
  end
45
45
  end
46
46
  end
@@ -1,7 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "text"
4
-
5
3
  module Gjp
6
4
  # Facade to search.maven.org
7
5
  class MavenWebsite
@@ -1,8 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "nokogiri"
4
- require "open-uri"
5
-
6
3
  module Gjp
7
4
  # encapsulates a pom.xml file
8
5
  class Pom
@@ -40,7 +37,7 @@ module Gjp
40
37
  end
41
38
 
42
39
  def runtime_dependency_ids
43
- result = @doc.xpath("project/dependencies/dependency[\
40
+ @doc.xpath("project/dependencies/dependency[\
44
41
  not(optional='true') and not(scope='provided') and not(scope='test') and not(scope='system')\
45
42
  ]").map do |element|
46
43
  [element.xpath("groupId").text, element.xpath("artifactId").text, element.xpath("version").text]
@@ -1,13 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "digest/sha1"
4
- require "zip"
5
- require "rest_client"
6
- require "json"
7
- require "pathname"
8
-
9
- require "gjp/version_matcher"
10
-
11
3
  module Gjp
12
4
  # attempts to get java projects' pom file
13
5
  class PomGetter
@@ -17,11 +9,11 @@ module Gjp
17
9
  # returns filename and status if found, else nil
18
10
  def get_pom(filename)
19
11
  content, status = (get_pom_from_jar(filename) || get_pom_from_sha1(filename) || get_pom_from_heuristic(filename))
20
- if content
21
- pom_filename = filename.sub(/(\.jar)?$/, ".pom")
22
- File.open(pom_filename, "w") { |io| io.write(content) }
23
- [pom_filename, status]
24
- end
12
+ return unless content
13
+
14
+ pom_filename = filename.sub(/(\.jar)?$/, ".pom")
15
+ File.open(pom_filename, "w") { |io| io.write(content) }
16
+ [pom_filename, status]
25
17
  end
26
18
 
27
19
  # returns a pom embedded in a jar file
@@ -78,7 +70,7 @@ module Gjp
78
70
  result = site.search_by_name(my_artifact_id).first
79
71
  log.debug("Artifact id search result: #{result}")
80
72
  unless result.nil?
81
- group_id, artifact_id, version = site.get_maven_id_from result
73
+ group_id, artifact_id, _ = site.get_maven_id_from result
82
74
  results = site.search_by_group_id_and_artifact_id(group_id, artifact_id)
83
75
  log.debug("All versions: #{results}")
84
76
  their_versions = results.map { |doc| doc["v"] }
@@ -89,7 +81,7 @@ module Gjp
89
81
  their_versions.max
90
82
  end
91
83
  )
92
- best_matched_result = (results.select { |result| result["v"] == best_matched_version }).first
84
+ best_matched_result = (results.select { |r| r["v"] == best_matched_version }).first
93
85
 
94
86
  group_id, artifact_id, version = site.get_maven_id_from(best_matched_result)
95
87
  log.warn("pom.xml for #{filename} found on search.maven.org with heuristic search\
@@ -1,7 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "find"
4
-
5
3
  module Gjp
6
4
  # encapsulates a Gjp project directory
7
5
  class Project
@@ -26,17 +24,17 @@ module Gjp
26
24
  # finds the project directory up in the tree, like git does
27
25
  def self.find_project_dir(starting_dir)
28
26
  result = starting_dir
29
- while is_project(result) == false && result != "/"
27
+ while project?(result) == false && result != "/"
30
28
  result = File.expand_path("..", result)
31
29
  end
32
30
 
33
- raise NoProjectDirectoryError.new(starting_dir) if result == "/"
31
+ fail NoProjectDirectoryError, starting_dir if result == "/"
34
32
 
35
33
  result
36
34
  end
37
35
 
38
36
  # returns true if the specified directory is a valid gjp project
39
- def self.is_project(dir)
37
+ def self.project?(dir)
40
38
  File.directory?(File.join(dir, "src")) &&
41
39
  File.directory?(File.join(dir, "kit")) &&
42
40
  File.directory?(File.join(dir, ".git"))
@@ -48,14 +46,14 @@ module Gjp
48
46
  dir_path = Pathname.new(File.expand_path(dir)).relative_path_from(Pathname.new(@full_path))
49
47
  components = dir_path.to_s.split(File::SEPARATOR)
50
48
  if components.count >= 2 &&
51
- components.first == "src" &&
52
- Dir.exist?(File.join(@full_path, components[0], components[1]))
49
+ components.first == "src" &&
50
+ Dir.exist?(File.join(@full_path, components[0], components[1]))
53
51
  components[1]
54
- else
55
- raise NoPackageDirectoryError
56
- end
52
+ else
53
+ fail NoPackageDirectoryError
54
+ end
57
55
  rescue ArgumentError, NoProjectDirectoryError
58
- raise NoPackageDirectoryError.new(dir)
56
+ raise NoPackageDirectoryError, dir
59
57
  end
60
58
 
61
59
  # inits a new project directory structure
@@ -83,9 +81,7 @@ module Gjp
83
81
  # to the kit package, src/ will be reset at the current state
84
82
  # when finished
85
83
  def dry_run
86
- if is_dry_running
87
- return false
88
- end
84
+ return false if dry_running?
89
85
 
90
86
  current_directory = Pathname.new(Dir.pwd).relative_path_from Pathname.new(@full_path)
91
87
 
@@ -94,7 +90,7 @@ module Gjp
94
90
  end
95
91
 
96
92
  # returns true iff we are currently dry-running
97
- def is_dry_running
93
+ def dry_running?
98
94
  latest_tag_count(:dry_run_started) > latest_tag_count(:dry_run_finished)
99
95
  end
100
96
 
@@ -102,7 +98,7 @@ module Gjp
102
98
  # if abort is true, reverts the whole directory
103
99
  # if abort is false, reverts sources and updates output file lists
104
100
  def finish(abort)
105
- if is_dry_running
101
+ if dry_running?
106
102
  if abort
107
103
  @git.revert_whole_directory(".", latest_tag(:dry_run_started))
108
104
  @git.delete_tag(latest_tag(:dry_run_started))
@@ -211,17 +207,17 @@ module Gjp
211
207
  from_directory do
212
208
  result = []
213
209
  Find.find("src") do |file|
214
- if file =~ /.jar$/ && !File.symlink?(file)
215
- new_location = File.join("kit", "jars", Pathname.new(file).split[1])
216
- FileUtils.mv(file, new_location)
210
+ next unless file =~ /.jar$/ && !File.symlink?(file)
217
211
 
218
- link_target = Pathname.new(new_location)
219
- .relative_path_from(Pathname.new(file).split.first)
220
- .to_s
212
+ new_location = File.join("kit", "jars", Pathname.new(file).split[1])
213
+ FileUtils.mv(file, new_location)
221
214
 
222
- File.symlink(link_target, file)
223
- result << [file, new_location]
224
- end
215
+ link_target = Pathname.new(new_location)
216
+ .relative_path_from(Pathname.new(file).split.first)
217
+ .to_s
218
+
219
+ File.symlink(link_target, file)
220
+ result << [file, new_location]
225
221
  end
226
222
 
227
223
  result
@@ -229,6 +225,7 @@ module Gjp
229
225
  end
230
226
  end
231
227
 
228
+ # current directory is not a gjp project
232
229
  class NoProjectDirectoryError < StandardError
233
230
  attr_reader :directory
234
231
 
@@ -236,6 +233,8 @@ module Gjp
236
233
  @directory = directory
237
234
  end
238
235
  end
236
+
237
+ # current directory is not a gjp package directory
239
238
  class NoPackageDirectoryError < StandardError
240
239
  attr_reader :directory
241
240
 
@@ -1,7 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "rest_client"
4
-
5
3
  module Gjp
6
4
  # attempts to get java projects' sources
7
5
  class SourceGetter
@@ -22,7 +20,7 @@ module Gjp
22
20
  project.from_directory do
23
21
  paths = Find.find(".").reject { |path| artifact_from_path(path).nil? }.sort
24
22
 
25
- succeded_paths = paths.select.with_index do |path, i|
23
+ succeded_paths = paths.each do |path|
26
24
  group_id, artifact_id, version = artifact_from_path(path)
27
25
  log.info("attempting source download for #{path} (#{group_id}:#{artifact_id}:#{version})")
28
26
  maven_runner.get_source_jar(group_id, artifact_id, version)
@@ -36,10 +34,8 @@ module Gjp
36
34
 
37
35
  # if possible, turn path into a Maven artifact name, otherwise return nil
38
36
  def artifact_from_path(path)
39
- match = path.match(/\.\/kit\/m2\/(.+)\/(.+)\/(.+)\/\2-\3.*\.jar$/)
40
- unless match.nil?
41
- [match[1].gsub("/", "."), match[2], match[3]]
42
- end
37
+ match = path.match(%r{\./kit/m2/(.+)/(.+)/(.+)/\2-\3.*\.jar$})
38
+ [match[1].gsub("/", "."), match[2], match[3]] unless match.nil?
43
39
  end
44
40
  end
45
41
  end
@@ -1,7 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "erb"
4
-
5
3
  module Gjp
6
4
  # operates on files in template/
7
5
  class TemplateManager
@@ -1,5 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ # base module for gjp
3
4
  module Gjp
4
- VERSION = "0.38.0"
5
+ VERSION = "0.39.0"
5
6
  end
@@ -1,7 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "text"
4
-
5
3
  module Gjp
6
4
  # heuristically matches version strings
7
5
  class VersionMatcher
@@ -74,23 +72,19 @@ module Gjp
74
72
  # for strings, the score is the Levenshtein distance
75
73
  # in any case score is normalized between 0 (identical) and 99 (very different/uncomparable)
76
74
  def chunk_distance(my_chunk, their_chunk)
77
- if my_chunk.nil?
78
- my_chunk = "0"
79
- end
80
- if their_chunk.nil?
81
- their_chunk = "0"
82
- end
83
- if my_chunk.is_i? && their_chunk.is_i?
75
+ my_chunk = "0" if my_chunk.nil?
76
+ their_chunk = "0" if their_chunk.nil?
77
+
78
+ if i?(my_chunk) && i?(their_chunk)
84
79
  return [(my_chunk.to_i - their_chunk.to_i).abs, 99].min
85
80
  else
86
81
  return [Text::Levenshtein.distance(my_chunk.upcase, their_chunk.upcase), 99].min
87
82
  end
88
83
  end
89
- end
90
- end
91
84
 
92
- class String
93
- def is_i?
94
- !!(self =~ /^[0-9]+$/)
85
+ # true for integer strings
86
+ def i?(string)
87
+ string =~ /^[0-9]+$/
88
+ end
95
89
  end
96
90
  end
@@ -1,7 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  require "spec_helper"
4
- require "lib/kit_runner_spec"
5
4
 
6
5
  describe Gjp::AntRunner do
7
6
  it_behaves_like Gjp::KitRunner
@@ -31,7 +30,7 @@ describe Gjp::AntRunner do
31
30
 
32
31
  describe "#ant" do
33
32
  it "runs Ant" do
34
- executable_path = create_mock_executable("ant")
33
+ create_mock_executable("ant")
35
34
  @project.from_directory do
36
35
  @kit_runner.ant(["extra-option"])
37
36
  File.read("test_out").strip.should match(/extra-option$/)
@@ -1,7 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  require "spec_helper"
4
- require "lib/kit_runner_spec"
5
4
 
6
5
  describe Gjp::MavenRunner do
7
6
  it_behaves_like Gjp::KitRunner
@@ -15,10 +15,10 @@ describe Gjp::Project do
15
15
  FileUtils.rm_rf(@project_path)
16
16
  end
17
17
 
18
- describe "#is_project" do
18
+ describe "#project?" do
19
19
  it "checks if a directory is a gjp project or not" do
20
- Gjp::Project.is_project(@project_path).should be_true
21
- Gjp::Project.is_project(File.join(@project_path, "..")).should be_false
20
+ Gjp::Project.project?(@project_path).should be_true
21
+ Gjp::Project.project?(File.join(@project_path, "..")).should be_false
22
22
  end
23
23
  end
24
24
 
@@ -99,14 +99,14 @@ describe Gjp::Project do
99
99
  end
100
100
  end
101
101
 
102
- describe "#is_dry_running" do
102
+ describe "#dry_running?" do
103
103
  it "checks if a project is dry running" do
104
104
  @project.from_directory do
105
- @project.is_dry_running.should be_false
105
+ @project.dry_running?.should be_false
106
106
  @project.dry_run
107
- @project.is_dry_running.should be_true
107
+ @project.dry_running?.should be_true
108
108
  @project.finish(false)
109
- @project.is_dry_running.should be_false
109
+ @project.dry_running?.should be_false
110
110
  end
111
111
  end
112
112
  end
@@ -142,7 +142,7 @@ describe Gjp::Project do
142
142
  end
143
143
 
144
144
  @project.finish(false).should be_true
145
- @project.is_dry_running.should be_false
145
+ @project.dry_running?.should be_false
146
146
 
147
147
  @project.from_directory do
148
148
  `git rev-list --all`.split("\n").length.should eq 4
@@ -172,7 +172,7 @@ describe Gjp::Project do
172
172
  end
173
173
 
174
174
  @project.finish(true).should be_true
175
- @project.is_dry_running.should be_false
175
+ @project.dry_running?.should be_false
176
176
 
177
177
  @project.from_directory do
178
178
  `git rev-list --all`.split("\n").length.should eq 2
@@ -198,7 +198,7 @@ describe Gjp::Project do
198
198
  end
199
199
 
200
200
  @project.from_directory do
201
- @project.is_dry_running.should be_true
201
+ @project.dry_running?.should be_true
202
202
  `git rev-list --all`.split("\n").length.should eq 2
203
203
  `git diff-tree --no-commit-id --name-only -r HEAD`.split("\n").should include("src/test")
204
204
  `git cat-file tag gjp_dry_run_started_1 | tail -1`.should include("src")
@@ -21,6 +21,7 @@ describe Gjp::ScriptGenerator do
21
21
  end
22
22
 
23
23
  FileUtils.mkdir_p(File.join("src", "test-package"))
24
+ @project.dry_run
24
25
 
25
26
  @generator = Gjp::ScriptGenerator.new(@project, "history")
26
27
  end
@@ -34,6 +34,7 @@ describe Gjp::TemplateManager do
34
34
  destination_path = destination.path
35
35
  destination.unlink
36
36
 
37
+ # binding test class
37
38
  class WorldClass
38
39
  def world_property
39
40
  "World!"
@@ -1,9 +1,10 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  require "gjp"
4
+ Dir["./spec/support/**/*.rb"].sort.each { |f| require f}
4
5
 
5
- # custom mock methods
6
6
  module Gjp
7
+ # custom mock methods
7
8
  module Mockers
8
9
  # creates a minimal gjp project
9
10
  def create_mock_project
@@ -1,7 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "spec_helper"
4
-
5
3
  shared_examples_for Gjp::KitRunner do
6
4
  include Gjp::Mockers
7
5
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gjp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.38.0
4
+ version: 0.39.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-26 00:00:00.000000000 Z
12
+ date: 2014-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -149,7 +149,6 @@ extra_rdoc_files: []
149
149
  files:
150
150
  - .gitignore
151
151
  - .rubocop.yml
152
- - .rubocop_todo.yml
153
152
  - Gemfile
154
153
  - LICENSE
155
154
  - MOTIVATION.md
@@ -225,7 +224,6 @@ files:
225
224
  - spec/lib/archiver_spec.rb
226
225
  - spec/lib/git_spec.rb
227
226
  - spec/lib/kit_checker_spec.rb
228
- - spec/lib/kit_runner_spec.rb
229
227
  - spec/lib/maven_runner_spec.rb
230
228
  - spec/lib/maven_website_spec.rb
231
229
  - spec/lib/pom_getter_spec.rb
@@ -237,6 +235,7 @@ files:
237
235
  - spec/lib/template_manager_spec.rb
238
236
  - spec/lib/version_matcher_spec.rb
239
237
  - spec/spec_helper.rb
238
+ - spec/support/kit_runner_examples.rb
240
239
  - utils/delete_nonet_user.sh
241
240
  - utils/setup_nonet_user.sh
242
241
  homepage: https://github.com/SilvioMoioli/gjp
@@ -285,7 +284,6 @@ test_files:
285
284
  - spec/lib/archiver_spec.rb
286
285
  - spec/lib/git_spec.rb
287
286
  - spec/lib/kit_checker_spec.rb
288
- - spec/lib/kit_runner_spec.rb
289
287
  - spec/lib/maven_runner_spec.rb
290
288
  - spec/lib/maven_website_spec.rb
291
289
  - spec/lib/pom_getter_spec.rb
@@ -297,3 +295,4 @@ test_files:
297
295
  - spec/lib/template_manager_spec.rb
298
296
  - spec/lib/version_matcher_spec.rb
299
297
  - spec/spec_helper.rb
298
+ - spec/support/kit_runner_examples.rb
@@ -1,111 +0,0 @@
1
- # This configuration was generated by `rubocop --auto-gen-config`
2
- # on 2014-05-23 15:40:35 +0200 using RuboCop version 0.22.0.
3
- # The point is for the user to remove these configuration records
4
- # one by one as the offenses are removed from the code base.
5
- # Note that changes in the inspected code, or installation of new
6
- # versions of RuboCop, may require this file to be generated again.
7
-
8
- # Offense count: 8
9
- Documentation:
10
- Enabled: false
11
-
12
- # Offense count: 1
13
- DoubleNegation:
14
- Enabled: false
15
-
16
- # Offense count: 1
17
- EmptyLinesAroundAccessModifier:
18
- Enabled: false
19
-
20
- # Offense count: 2
21
- # Configuration parameters: EnforcedStyle, SupportedStyles.
22
- Encoding:
23
- Enabled: false
24
-
25
- # Offense count: 9
26
- # Configuration parameters: AlignWith, SupportedStyles.
27
- EndAlignment:
28
- Enabled: false
29
-
30
- # Offense count: 2
31
- # Configuration parameters: EnforcedStyle, SupportedStyles.
32
- FormatString:
33
- Enabled: false
34
-
35
- # Offense count: 4
36
- # Configuration parameters: MinBodyLength.
37
- GuardClause:
38
- Enabled: false
39
-
40
- # Offense count: 7
41
- # Configuration parameters: MaxLineLength.
42
- IfUnlessModifier:
43
- Enabled: false
44
-
45
- # Offense count: 28
46
- # Configuration parameters: CountComments.
47
- MethodLength:
48
- Max: 34
49
-
50
- # Offense count: 6
51
- MultilineBlockChain:
52
- Enabled: false
53
-
54
- # Offense count: 3
55
- # Configuration parameters: EnforcedStyle, SupportedStyles.
56
- Next:
57
- Enabled: false
58
-
59
- # Offense count: 3
60
- # Configuration parameters: NamePrefixBlacklist.
61
- PredicateName:
62
- Enabled: false
63
-
64
- # Offense count: 4
65
- # Configuration parameters: SupportedStyles.
66
- RaiseArgs:
67
- EnforcedStyle: compact
68
-
69
- # Offense count: 1
70
- # Configuration parameters: MaxSlashes.
71
- RegexpLiteral:
72
- Enabled: false
73
-
74
- # Offense count: 1
75
- ShadowingOuterLocalVariable:
76
- Enabled: false
77
-
78
- # Offense count: 5
79
- # Cop supports --auto-correct.
80
- # Configuration parameters: EnforcedStyle, SupportedStyles.
81
- SignalException:
82
- Enabled: false
83
-
84
- # Offense count: 4
85
- # Cop supports --auto-correct.
86
- SpecialGlobalVars:
87
- Enabled: false
88
-
89
- # Offense count: 7
90
- Tab:
91
- Enabled: false
92
-
93
- # Offense count: 2
94
- # Cop supports --auto-correct.
95
- # Configuration parameters: ExactNameMatch, AllowPredicates, AllowDSLWriters, Whitelist.
96
- TrivialAccessors:
97
- Enabled: false
98
-
99
- # Offense count: 8
100
- # Cop supports --auto-correct.
101
- UnusedBlockArgument:
102
- Enabled: false
103
-
104
- # Offense count: 6
105
- UselessAssignment:
106
- Enabled: false
107
-
108
- # Offense count: 6
109
- # Cop supports --auto-correct.
110
- WordArray:
111
- MinSize: 2