license_auto 0.1.1.1 → 0.1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/Gemfile +9 -1
- data/Gemfile.lock +27 -0
- data/README.md +14 -18
- data/Rakefile +5 -5
- data/examples/get_license_files_of_bundler.rb +1 -1
- data/lib/license_auto/config/config.rb +37 -51
- data/lib/license_auto/config/sample.config.yml +20 -0
- data/lib/license_auto/exceptions.rb +32 -0
- data/lib/license_auto/license/frequency.rb +1 -1
- data/lib/license_auto/license/readme.rb +43 -0
- data/lib/license_auto/license/similarity.rb +43 -231
- data/lib/license_auto/license/templates/PerlArtistic.txt +1 -0
- data/lib/license_auto/license_info_wrapper.rb +28 -0
- data/lib/license_auto/logger.rb +27 -0
- data/lib/license_auto/{errors.rb → misc.rb} +0 -0
- data/lib/license_auto/module.rb +17 -0
- data/lib/license_auto/package.rb +65 -10
- data/lib/license_auto/package_manager/apt.rb +2 -0
- data/lib/license_auto/package_manager/bower.rb +2 -0
- data/lib/license_auto/package_manager/bundler.rb +87 -0
- data/lib/license_auto/package_manager/gemfury.rb +39 -0
- data/lib/license_auto/{parser → package_manager}/golang.rb +0 -0
- data/lib/{parser/enums.rb → license_auto/package_manager/golang_stdlibs.rb} +1 -1
- data/lib/license_auto/{parser → package_manager}/gradle.rb +0 -0
- data/lib/license_auto/package_manager/ivy.rb +1 -0
- data/lib/license_auto/{parser/gemfile.rb → package_manager/license_header.rb} +0 -0
- data/lib/license_auto/package_manager/maven.rb +0 -0
- data/lib/license_auto/package_manager/npm.rb +2 -0
- data/lib/license_auto/package_manager/phar.rb +3 -0
- data/lib/license_auto/package_manager/pip.rb +2 -0
- data/lib/license_auto/package_manager/yum.rb +2 -0
- data/lib/license_auto/package_manager.rb +41 -0
- data/lib/license_auto/repo.rb +79 -0
- data/lib/license_auto/version.rb +1 -1
- data/lib/license_auto/website/gemfury_com.rb +10 -0
- data/lib/license_auto/website/github_com.rb +179 -0
- data/lib/license_auto/website/ruby_gems_org.rb +17 -4
- data/lib/license_auto.rb +6 -11
- data/license_auto.gemspec +7 -2
- data/{lib → remove}/api/bitbucket.rb +0 -0
- data/{lib → remove}/api/code_google_com.rb +0 -0
- data/{lib → remove}/api/excel_export.rb +0 -0
- data/{lib → remove}/api/gem_data.rb +0 -0
- data/{lib → remove}/api/git_kernel_org.rb +0 -0
- data/{lib → remove}/api/github.rb +0 -0
- data/{lib → remove}/api/go_pkg_in.rb +0 -0
- data/{lib → remove}/api/golang_org.rb +0 -0
- data/{lib → remove}/api/google_source_com.rb +0 -0
- data/{lib → remove}/api/gradle2.rb +0 -0
- data/{lib → remove}/api/helper.rb +0 -0
- data/{lib → remove}/api/j_center.rb +0 -0
- data/{lib → remove}/api/maven_central_repository.rb +0 -0
- data/{lib → remove}/api/mq.rb +0 -0
- data/{lib → remove}/api/npm_registry.rb +0 -0
- data/{lib → remove}/api/pattern.rb +0 -0
- data/{lib → remove}/api/remote_source_package.rb +0 -0
- data/{lib → remove}/api/spider.rb +0 -0
- data/{lib → remove}/api.rb +0 -0
- data/{lib → remove}/cloner.rb +1 -1
- data/{lib → remove}/db.rb +0 -0
- data/{lib → remove}/misc.rb +0 -0
- data/{lib → remove}/parser/gemfile_parser.rb +0 -0
- data/{lib → remove}/parser/golang_parser.rb +1 -1
- data/{lib → remove}/parser/gradle_parser.rb +0 -0
- data/{lib → remove}/parser/manifest_parser.rb +0 -0
- data/{lib → remove}/parser/maven_parser.rb +0 -0
- data/{lib → remove}/parser/npm_parser.rb +0 -0
- data/{lib → remove}/parser/pip_parser.rb +0 -0
- data/{lib → remove}/parser/rebar_parser.rb +0 -0
- data/{lib → remove}/recorder.rb +0 -0
- data/{lib → remove}/script/apt-get.deps.sh +0 -0
- data/{lib → remove}/script/debian_dpkg_list.sh +0 -0
- data/{lib → remove}/script/rubygems.org.importdb.sh +0 -0
- metadata +103 -52
- data/lib/license_auto/license_info.rb +0 -12
- data/lib/license_auto/website/github.rb +0 -49
- data/lib/message.rb +0 -5
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'find'
|
3
|
+
require 'license_auto/logger'
|
4
|
+
require 'license_auto/module'
|
5
|
+
|
6
|
+
module LicenseAuto
|
7
|
+
class VirtualPackageManager
|
8
|
+
|
9
|
+
virtual :initialize,
|
10
|
+
:parse_dependencies,
|
11
|
+
:dependency_file_pattern
|
12
|
+
|
13
|
+
# def self.package_managers
|
14
|
+
# [Bundler, NPM, Pip, Bower, Maven, Gradle, CocoaPods, Rebar, Nuget]
|
15
|
+
# end
|
16
|
+
|
17
|
+
# @uri:
|
18
|
+
# ./filepath/name.txt
|
19
|
+
# /some/absolute/file/path/name
|
20
|
+
# http://somesite.com/foo/bar/baz.file
|
21
|
+
def initialize(path)
|
22
|
+
@path = path
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return Array[Dependency]
|
26
|
+
def parse_dependencies; end
|
27
|
+
|
28
|
+
# @return Array[Regexp]
|
29
|
+
def dependency_file_pattern; end
|
30
|
+
|
31
|
+
def dependency_file_path_names(pattern=dependency_file_pattern)
|
32
|
+
if FileTest.directory?(@path)
|
33
|
+
Find.find(@path).select do |filename|
|
34
|
+
FileTest.file?(filename) && filename =~ pattern
|
35
|
+
end
|
36
|
+
else
|
37
|
+
LicenseAuto.logger.fatal("The repo path: #{@path} does not exist!")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'hashie/mash'
|
2
|
+
require 'license_auto/website/github_com'
|
3
|
+
require 'license_auto/package_manager/bundler'
|
4
|
+
|
5
|
+
module LicenseAuto
|
6
|
+
class Repo < Hashie::Mash
|
7
|
+
|
8
|
+
# hash example:
|
9
|
+
# {
|
10
|
+
# "clone_url": "https://github.com/mineworks/license_auto.git",
|
11
|
+
# "ref": "readme",
|
12
|
+
# "access_token": "40 chars token"
|
13
|
+
# }
|
14
|
+
def initialize(hash)
|
15
|
+
super(hash)
|
16
|
+
@server = chose_repo_server
|
17
|
+
raise("#{hash} is not a Github Repo") unless @server
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.package_managers
|
21
|
+
[Bundler]
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return:
|
25
|
+
# {
|
26
|
+
# "LicenseAuto::Bundler": [
|
27
|
+
# {
|
28
|
+
# "dep_file": "/tmp/license_auto/cache/github.com/mineworks/license_auto.git/Gemfile.lock",
|
29
|
+
# "deps": [
|
30
|
+
# {
|
31
|
+
# "name": "addressable",
|
32
|
+
# "version": "2.4.0",
|
33
|
+
# "remote": "https://rubygems.org/"
|
34
|
+
# },
|
35
|
+
# {
|
36
|
+
# "name": "anemone",
|
37
|
+
# "version": "0.7.2",
|
38
|
+
# "remote": "https://rubygems.org/"
|
39
|
+
# },
|
40
|
+
# {
|
41
|
+
# "name": "ast",
|
42
|
+
# "version": "2.2.0",
|
43
|
+
# "remote": "https://rubygems.org/"
|
44
|
+
# }
|
45
|
+
# ]
|
46
|
+
# }
|
47
|
+
# ]
|
48
|
+
# }
|
49
|
+
def find_dependencies
|
50
|
+
repo_dir = @server.clone
|
51
|
+
deps = {}
|
52
|
+
Repo.package_managers.each {|pm|
|
53
|
+
# LicenseAuto.logger.debug(pm)
|
54
|
+
items = pm.new(repo_dir).parse_dependencies
|
55
|
+
unless items.empty?
|
56
|
+
deps[pm.to_s] = items
|
57
|
+
end
|
58
|
+
}
|
59
|
+
LicenseAuto.logger.debug(JSON.pretty_generate(deps))
|
60
|
+
deps
|
61
|
+
end
|
62
|
+
|
63
|
+
# def get_ref()
|
64
|
+
# @server.get_ref(self.ref)
|
65
|
+
# end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def chose_repo_server
|
70
|
+
source_code_matcher = LicenseAuto::Matcher::SourceURL.new(clone_url)
|
71
|
+
github_matched = source_code_matcher.match_github_resource
|
72
|
+
if github_matched
|
73
|
+
# TODO: pass argument: ref
|
74
|
+
|
75
|
+
@server = GithubCom.new({}, github_matched[:owner], github_matched[:repo], ref=self.ref)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/license_auto/version.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
##
|
2
|
+
# [Gemfury](https://gemfury.com/) is a hosted repository for your public and private packages,
|
3
|
+
# where they are safe and within reach.
|
4
|
+
#
|
5
|
+
# [Install RubyGems with a Gemfile](https://gemfury.com/help/install-gems#_ga=1.159224378.125260097.1457687192)
|
6
|
+
|
7
|
+
class GemfuryCom
|
8
|
+
# TODO:
|
9
|
+
|
10
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'github_api'
|
5
|
+
require 'git'
|
6
|
+
|
7
|
+
|
8
|
+
require 'license_auto/config/config'
|
9
|
+
require 'license_auto/license/similarity'
|
10
|
+
require 'license_auto/license/readme'
|
11
|
+
|
12
|
+
class GithubCom < Website
|
13
|
+
|
14
|
+
HOST = 'github.com'
|
15
|
+
LANGUAGE = nil
|
16
|
+
|
17
|
+
GIT_HASH_LENGTH = 40
|
18
|
+
|
19
|
+
##
|
20
|
+
# package: Hashie::Mash
|
21
|
+
# user: string
|
22
|
+
# repo: string
|
23
|
+
# ref: string
|
24
|
+
def initialize(package, user, repo, ref=nil)
|
25
|
+
super(package)
|
26
|
+
@ref = ref
|
27
|
+
|
28
|
+
LicenseAuto.logger.debug("#{user}/#{repo}, #{@ref}")
|
29
|
+
|
30
|
+
@server =
|
31
|
+
begin
|
32
|
+
eval('WebMock')
|
33
|
+
LicenseAuto.logger.debug("LicenseAuto under RSpec mode")
|
34
|
+
Github.new(user: user, repo: repo)
|
35
|
+
rescue NameError => e
|
36
|
+
LicenseAuto.logger.debug("LicenseAuto under running mode")
|
37
|
+
basic_auth = "#{LUTO_CONF.github.username}:#{LUTO_CONF.github.access_token}"
|
38
|
+
Github.new(user: user, repo: repo, basic_auth: basic_auth)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
# @return LicenseInfoWrapper
|
44
|
+
|
45
|
+
def get_license_info()
|
46
|
+
possible_ref = @ref || match_versioned_ref
|
47
|
+
# If possible_ref is nil, the Github API server will return the default branch contents
|
48
|
+
contents = @server.repos.contents.get(path: '/', ref: possible_ref)
|
49
|
+
|
50
|
+
license_files = []
|
51
|
+
readme_files = []
|
52
|
+
notice_files = []
|
53
|
+
contents.each {|obj|
|
54
|
+
if obj.type == 'file'
|
55
|
+
filename_matcher = LicenseAuto::Matcher::FilepathName.new(obj.name)
|
56
|
+
license_files.push(obj) if filename_matcher.match_license_file
|
57
|
+
readme_files.push(obj) if filename_matcher.match_readme_file
|
58
|
+
notice_files.push(obj) if filename_matcher.match_notice_file
|
59
|
+
end
|
60
|
+
}
|
61
|
+
|
62
|
+
license_files = license_files.map {|obj|
|
63
|
+
license_content = get_blobs(obj['sha'])
|
64
|
+
license_name, sim_ratio = LicenseAuto::Similarity.new(license_content).most_license_sim
|
65
|
+
_hash = {
|
66
|
+
name: license_name,
|
67
|
+
sim_ratio: sim_ratio,
|
68
|
+
html_url: obj['html_url'],
|
69
|
+
download_url: obj['download_url'],
|
70
|
+
text: license_content
|
71
|
+
}
|
72
|
+
LicenseAuto::LicenseWrapper.new(_hash)
|
73
|
+
}
|
74
|
+
|
75
|
+
readme_files = readme_files.map {|obj|
|
76
|
+
readme_content = get_blobs(obj['sha'])
|
77
|
+
license_content = LicenseAuto::Readme.new(obj['download_url'], readme_content).license_content
|
78
|
+
LicenseAuto.logger.debug(license_content)
|
79
|
+
if license_content.nil?
|
80
|
+
next
|
81
|
+
else
|
82
|
+
license_name, sim_ratio = LicenseAuto::Similarity.new(license_content).most_license_sim
|
83
|
+
_hash = {
|
84
|
+
name: license_name,
|
85
|
+
sim_ratio: sim_ratio,
|
86
|
+
html_url: obj['html_url'],
|
87
|
+
download_url: obj['download_url'],
|
88
|
+
text: license_content
|
89
|
+
}
|
90
|
+
LicenseAuto::LicenseWrapper.new(_hash)
|
91
|
+
end
|
92
|
+
}.compact!
|
93
|
+
|
94
|
+
LicenseAuto::LicenseInfoWrapper.new(licenses: license_files, readmes: readme_files, notices: notice_files)
|
95
|
+
end
|
96
|
+
|
97
|
+
def get_ref(ref)
|
98
|
+
@server.git_data.references.get(ref: ref)
|
99
|
+
end
|
100
|
+
|
101
|
+
def match_versioned_ref()
|
102
|
+
possible_ref = nil
|
103
|
+
# If provided a Git SHA, use it directly
|
104
|
+
if @package.version.size >= GIT_HASH_LENGTH
|
105
|
+
possible_ref = @package.version
|
106
|
+
else
|
107
|
+
matcher = LicenseAuto::Matcher::FilepathName.new(@package.version)
|
108
|
+
@server.repos.tags do |tag|
|
109
|
+
matched = matcher.match_the_ref(tag.name)
|
110
|
+
if matched
|
111
|
+
possible_ref = tag.name
|
112
|
+
break
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
possible_ref
|
117
|
+
end
|
118
|
+
|
119
|
+
def list_languages
|
120
|
+
langs = @server.repos.languages
|
121
|
+
LicenseAuto.logger.debug("All languaegs: #{langs}")
|
122
|
+
langs
|
123
|
+
end
|
124
|
+
|
125
|
+
def clone
|
126
|
+
info = repo_info
|
127
|
+
|
128
|
+
clone_url = info.body.fetch('clone_url')
|
129
|
+
LicenseAuto.logger.debug(clone_url)
|
130
|
+
|
131
|
+
trimmed_url = clone_url.gsub(/^http[s]?:\/\//, '')
|
132
|
+
clone_dir = "#{LUTO_CACHE_DIR}/#{trimmed_url}"
|
133
|
+
LicenseAuto.logger.debug(clone_dir)
|
134
|
+
|
135
|
+
if Dir.exists?(clone_dir)
|
136
|
+
git = Git.open(clone_dir, :log => LicenseAuto.logger)
|
137
|
+
local_branch = git.branches.local[0].full
|
138
|
+
if local_branch == @ref
|
139
|
+
git.pull(remote='origin', branch=local_branch)
|
140
|
+
else
|
141
|
+
FileUtils::rm_rf(clone_dir)
|
142
|
+
do_clone(clone_url, clone_dir)
|
143
|
+
end
|
144
|
+
else
|
145
|
+
do_clone(clone_url, clone_dir)
|
146
|
+
end
|
147
|
+
clone_dir
|
148
|
+
end
|
149
|
+
|
150
|
+
def do_clone(clone_url, clone_dir)
|
151
|
+
LicenseAuto.logger.debug(@ref)
|
152
|
+
clone_opts = {
|
153
|
+
:depth => 1, # Only last commit history for fast
|
154
|
+
:branch => @ref
|
155
|
+
}
|
156
|
+
LicenseAuto.logger.debug(clone_url)
|
157
|
+
cloned_repo = Git.clone(clone_url, clone_dir, clone_opts)
|
158
|
+
end
|
159
|
+
|
160
|
+
def repo_info
|
161
|
+
@server.repos.get
|
162
|
+
end
|
163
|
+
|
164
|
+
def filter_gitmodules
|
165
|
+
end
|
166
|
+
|
167
|
+
# http://www.rubydoc.info/github/piotrmurach/github/master/Github/Client/GitData/Blobs#get-instance_method
|
168
|
+
def get_blobs(sha)
|
169
|
+
response_wrapper = @server.git_data.blobs.get(@server.user, @server.repo, sha)
|
170
|
+
LicenseAuto.logger.debug(response_wrapper)
|
171
|
+
content = response_wrapper.body.content
|
172
|
+
encoding = response_wrapper.body.encoding
|
173
|
+
if encoding == 'base64'
|
174
|
+
Base64.decode64(content)
|
175
|
+
else
|
176
|
+
LicenseAuto.logger.error("Unknown encoding: #{encoding}")
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -1,11 +1,15 @@
|
|
1
1
|
require 'gems'
|
2
2
|
require 'hashie'
|
3
3
|
|
4
|
-
require 'license_auto/website/
|
4
|
+
require 'license_auto/website/github_com'
|
5
|
+
require 'license_auto/exceptions'
|
5
6
|
|
6
7
|
|
7
8
|
class RubyGemsOrg < Website
|
8
9
|
|
10
|
+
URI = 'https://rubygems.org/'
|
11
|
+
HOST = 'rubygems.org'
|
12
|
+
LANGUAGE = 'Ruby'
|
9
13
|
|
10
14
|
GEM_NOT_FOUND = "This rubygem could not be found."
|
11
15
|
|
@@ -26,13 +30,16 @@ class RubyGemsOrg < Website
|
|
26
30
|
end
|
27
31
|
|
28
32
|
gem_info = get_gem_info
|
29
|
-
|
33
|
+
|
34
|
+
raise LicenseAuto::PackageNotFound if gem_info.nil?
|
30
35
|
|
31
36
|
source_code_matcher = LicenseAuto::Matcher::SourceURL.new(gem_info.source_code_uri)
|
32
37
|
|
33
38
|
github_matched = source_code_matcher.match_github_resource
|
34
39
|
if github_matched
|
35
|
-
license_info =
|
40
|
+
license_info = GithubCom.new(@package, github_matched[:owner], github_matched[:repo]).get_license_info
|
41
|
+
elsif false
|
42
|
+
|
36
43
|
end
|
37
44
|
|
38
45
|
# bitbucket_matched = source_code_matcher.match_bitbucket_resource()
|
@@ -43,7 +50,13 @@ class RubyGemsOrg < Website
|
|
43
50
|
|
44
51
|
def get_gem_info()
|
45
52
|
# TODO: Gems.info(@package.name, @package.version)
|
46
|
-
Gems.info(@package.name)
|
53
|
+
gem_info = Gems.info(@package.name)
|
54
|
+
gem_info =
|
55
|
+
if gem_info == GEM_NOT_FOUND
|
56
|
+
nil
|
57
|
+
else
|
58
|
+
Hashie::Mash.new(gem_info)
|
59
|
+
end
|
47
60
|
end
|
48
61
|
|
49
62
|
# TODO: switch to https://github.com/rubygems/gems/issues/32#issuecomment-195180422
|
data/lib/license_auto.rb
CHANGED
@@ -1,20 +1,15 @@
|
|
1
1
|
require 'pathname'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
end
|
6
|
-
|
2
|
+
require 'license_auto/config/config'
|
3
|
+
require 'license_auto/logger'
|
7
4
|
|
8
5
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'license_auto'))
|
9
6
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
10
7
|
|
11
|
-
# puts $LOAD_PATH
|
12
|
-
# puts Pathname.new(__FILE__).dirname.join("license_finder")
|
13
|
-
|
14
|
-
# require 'license_auto/config/config'
|
15
|
-
|
16
8
|
require 'license_auto/website'
|
17
9
|
require 'license_auto/matcher'
|
18
10
|
require 'license_auto/package'
|
19
|
-
require 'license_auto/
|
11
|
+
require 'license_auto/repo'
|
12
|
+
require 'license_auto/license/similarity'
|
13
|
+
require 'license_auto/license_info_wrapper'
|
14
|
+
require 'license_auto/exceptions'
|
20
15
|
|
data/license_auto.gemspec
CHANGED
@@ -34,11 +34,16 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
35
35
|
spec.require_paths = ["lib"]
|
36
36
|
|
37
|
+
spec.add_runtime_dependency 'bundler', '~> 1.10', '>= 0'
|
37
38
|
spec.add_runtime_dependency "hashie"
|
39
|
+
spec.add_runtime_dependency "log4r"
|
38
40
|
spec.add_runtime_dependency "json"
|
39
41
|
spec.add_runtime_dependency "gems"
|
40
42
|
spec.add_runtime_dependency "github_api"
|
41
|
-
|
42
|
-
spec.
|
43
|
+
spec.add_runtime_dependency "tf-idf-similarity"
|
44
|
+
# spec.add_runtime_dependency "github-markup"
|
45
|
+
# spec.add_runtime_dependency "redcarpet"
|
46
|
+
# spec.add_runtime_dependency "rdoc"
|
47
|
+
|
43
48
|
spec.add_development_dependency "rake", "~> 10.0"
|
44
49
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/{lib → remove}/api/mq.rb
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/{lib → remove}/api.rb
RENAMED
File without changes
|
data/{lib → remove}/cloner.rb
RENAMED
@@ -10,7 +10,7 @@ module Cloner
|
|
10
10
|
def self.make_path(repo)
|
11
11
|
# todo: If repo is a git@github.com:xxx/yyy
|
12
12
|
$plog.debug(repo)
|
13
|
-
repo = repo.gsub(/(https:\/\/|http:\/\/|git@)/,'')
|
13
|
+
repo = repo.gsub(/(https:\/\/|http:\/\/|git@)/, '')
|
14
14
|
path = "#{AUTO_ROOT}/#{repo}"
|
15
15
|
end
|
16
16
|
|
data/{lib → remove}/db.rb
RENAMED
File without changes
|
data/{lib → remove}/misc.rb
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/{lib → remove}/recorder.rb
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|