Class: LicenseAuto::Gradle

Inherits:
PackageManager show all
Defined in:
lib/license_auto/package_manager/gradle.rb

Constant Summary collapse

LANGUAGE =
'Java'
DEPENDENCY_PATTERN =
/\\---\s(?<group>.+):(?<name>.+):(?<version>.+)/
REMOTE =
'https://repo1.maven.org/maven2/'

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from PackageManager

#check_cli, #dependency_file_path_names

Constructor Details

#initialize(path) ⇒ Gradle

Returns a new instance of Gradle.



14
15
16
# File 'lib/license_auto/package_manager/gradle.rb', line 14

def initialize(path)
  super(path)
end

Class Method Details

.check_cliObject



41
42
43
44
45
46
47
48
49
50
# File 'lib/license_auto/package_manager/gradle.rb', line 41

def self.check_cli
  cmd = 'gradle --version'
  stdout_str, stderr_str, _status = Open3.capture3(cmd)
  if stdout_str.include?('Gradle 2.8')
    true
  else
    LicenseAuto.logger.error("stdout_str: #{stdout_str}, stderr_str: #{stderr_str}")
    false
  end
end

Instance Method Details

#collect_dependenciesObject



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/license_auto/package_manager/gradle.rb', line 81

def collect_dependencies
  root_deps = list_dependencies
  projects = list_projects
  projects.each {|project_name|
    deps = list_dependencies(project_name)
    root_deps.merge(deps)
  }
  root_deps.map {|dep|
    group, name, version_range = dep.split(':')
    version = filter_version(version_range)
    {
        name: [group, name].join(':'),
        version: version,
        remote: REMOTE
    }
  }
end

#dependency_file_patternObject



18
19
20
# File 'lib/license_auto/package_manager/gradle.rb', line 18

def dependency_file_pattern
  /#{@path}\/build.gradle$/i
end

#filter_version(version_range) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/license_auto/package_manager/gradle.rb', line 99

def filter_version(version_range)
  # 'junit:junit:3.8.2 -> 4.11'
  range_arrow_pattern = /(?<min_ver>.*)\s->\s(?<max_ver>.*)/
  matched = range_arrow_pattern.match(version_range)
  if matched
    version_range = matched[:max_ver]
  end

  # 'org.apache.ant:ant:1.8.3 (*)'
  star_pattern = /\s\(\*\)/
  version_range.gsub(star_pattern, '')
end

#list_dependencies(project_name = nil) ⇒ Object

Returns sample: Set.new([“commons-beanutils:commons-beanutils:1.8.3”, “commons-logging:commons-logging:1.1.1”, “junit:junit:4.8.2”]).

Returns:

  • sample: Set.new([“commons-beanutils:commons-beanutils:1.8.3”, “commons-logging:commons-logging:1.1.1”, “junit:junit:4.8.2”])



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/license_auto/package_manager/gradle.rb', line 114

def list_dependencies(project_name=nil)
  Dir.chdir(@path) do
    deps = Set.new
    cmd = if project_name
            "gradle -q #{project_name}:dependencies"
          else
            "gradle -q dependencies"
          end
    LicenseAuto.logger.debug("cmd: #{cmd}")

    stdout_str, stderr_str, _status = Open3.capture3(cmd)
    if stdout_str.length > 0
      LicenseAuto.logger.debug("stdout_str: #{stdout_str}")
      stdout_str.split("\n").each {|line|
        matched = DEPENDENCY_PATTERN.match(line)
        # LicenseAuto.logger.debug("#{line}, matched: #{matched}")
        if matched
          group_name_version = matched.to_s.gsub(/\\---\s/, '')
          # External dependencies
          # DOC: https://docs.gradle.org/current/userguide/artifact_dependencies_tutorial.html#N105E1
          deps.add(group_name_version)
        end
      }
    else
      LicenseAuto.logger.error("stderr_str: #{stderr_str}")
    end
    LicenseAuto.logger.debug(deps)
    deps
  end
end

#list_projectsObject

Out put sample:


Root project


Root project ‘maven-gradle-comparison-dependency-simplest’ No sub-projects



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/license_auto/package_manager/gradle.rb', line 59

def list_projects
  cmd = "gradle -q project"
  LicenseAuto.logger.debug(@path)
  projects = []
  Dir.chdir(@path) do
    stdout_str, stderr_str, _status = Open3.capture3(cmd)
    if stdout_str.length > 0
      LicenseAuto.logger.debug(stdout_str)
      stdout_str.split("\n").each {|line|
        sub_project_pattern = /Project\s\'(:)?(?<project_name>.+)\'/
        matched = sub_project_pattern.match(line)
        if matched
          projects.push(match_result[:project_name])
        end
      }
    else
      LicenseAuto.logger.error(stderr_str)
    end
    projects
  end
end

#parse_dependenciesObject



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/license_auto/package_manager/gradle.rb', line 22

def parse_dependencies
  build_files = dependency_file_path_names
  if build_files.empty?
    LicenseAuto.logger.info("#{LANGUAGE}: #{dependency_file_pattern} file not exist")
    []
    # TODO: check his sub dir has `build.gradle` or not
  else
    build_files.map {|dep_file|
      LicenseAuto.logger.debug(dep_file)

      {
          dep_file: dep_file,
          deps: collect_dependencies
      }
    }
  end
  # LicenseAuto.logger.debug(JSON.pretty_generate(dep_files))
end