gemfile_utils 1.0.0
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 +7 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +12 -0
- data/LICENSE.txt +21 -0
- data/README.md +62 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/gemfile_utils +4 -0
- data/bin/setup +8 -0
- data/fixtures/vcr_cassettes/rubygems.yml +1925 -0
- data/gemfile_utils.gemspec +29 -0
- data/lib/gemfile_utils/cli/base.rb +55 -0
- data/lib/gemfile_utils/cli/modules/comments.rb +34 -0
- data/lib/gemfile_utils/cli/modules/licenses.rb +29 -0
- data/lib/gemfile_utils/parser/gemfile.rb +19 -0
- data/lib/gemfile_utils/parser/ruby_gems.rb +38 -0
- data/lib/gemfile_utils/thor/actions/inject_into_file.rb +21 -0
- data/lib/gemfile_utils/version.rb +3 -0
- data/lib/gemfile_utils.rb +4 -0
- metadata +165 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'gemfile_utils/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "gemfile_utils"
|
8
|
+
spec.version = GemfileUtils::VERSION
|
9
|
+
spec.authors = ["Igor Fedoronchuk"]
|
10
|
+
spec.email = ["fedoronchuk@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{gemfile_utils gem}
|
13
|
+
spec.description = %q{gemfile_utils provides command line interface to modify Gemfile with annotations and comments}
|
14
|
+
spec.homepage = "https://github.com/Fivell"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "bin"
|
19
|
+
spec.executables = ['gemfile_utils']
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
23
|
+
spec.add_dependency "thor", '~> 0.19'
|
24
|
+
spec.add_dependency "faraday", '~> 0.10'
|
25
|
+
spec.add_dependency "typhoeus", '~> 1.1'
|
26
|
+
spec.add_dependency "gemnasium-parser", '~> 0.1'
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require_relative '../thor/actions/inject_into_file'
|
3
|
+
require_relative '../parser/gemfile'
|
4
|
+
require_relative '../parser/ruby_gems'
|
5
|
+
|
6
|
+
require_relative 'modules/comments'
|
7
|
+
require_relative 'modules/licenses'
|
8
|
+
|
9
|
+
|
10
|
+
module GemfileUtils
|
11
|
+
module Cli
|
12
|
+
class Base < ::Thor
|
13
|
+
include ::Thor::Actions
|
14
|
+
namespace :gemfile_utils
|
15
|
+
|
16
|
+
UNKNOWN_LICENCES = ['Unknown'].freeze
|
17
|
+
|
18
|
+
include GemfileUtils::Cli::Comments
|
19
|
+
include GemfileUtils::Cli::Licenses
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def gemfile_dependencies
|
26
|
+
@gemfile_dependencies ||= GemfileUtils::Parser::Gemfile.new(gemfile_content).dependencies
|
27
|
+
end
|
28
|
+
|
29
|
+
def gemfile_content
|
30
|
+
@gemfile_content ||= File.read( options[:gemfile] )
|
31
|
+
end
|
32
|
+
|
33
|
+
def ruby_gems(gem_name)
|
34
|
+
ruby_gems_parser.info(gem_name)
|
35
|
+
end
|
36
|
+
|
37
|
+
def ruby_gems_parser
|
38
|
+
@ruby_gems_parser ||= begin
|
39
|
+
rg = GemfileUtils::Parser::RubyGems.new(gemfile_dependencies.map(&:name))
|
40
|
+
rg.request!
|
41
|
+
rg
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def comment_block(str, indention = '')
|
46
|
+
safe_encode str.lines.map{|line| "#{indention}# #{line.chomp}" }.join($/) + $/
|
47
|
+
end
|
48
|
+
|
49
|
+
def safe_encode(value)
|
50
|
+
value.encode("utf-8", invalid: :replace, undef: :replace, replace: "_")
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module GemfileUtils
|
2
|
+
module Cli
|
3
|
+
module Comments
|
4
|
+
|
5
|
+
def self.included(thor)
|
6
|
+
thor.class_eval do
|
7
|
+
|
8
|
+
desc 'comments', 'Comment Gemfile with gems descriptions fetched from rubygems'
|
9
|
+
method_option :gemfile, default: 'Gemfile'
|
10
|
+
method_option :licenses, default: 'false'
|
11
|
+
|
12
|
+
def comments
|
13
|
+
gemfile_dependencies.each do |dependency|
|
14
|
+
add_comment(dependency.name, ruby_gems(dependency.name), ' ' * dependency.instance_variable_get(:@indention) )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def add_comment(gem_name, gem_data, indention = '')
|
21
|
+
info = gem_data['info']
|
22
|
+
if options[:licenses]
|
23
|
+
licenses = gem_data['licenses']
|
24
|
+
licenses = Base::UNKNOWN_LICENCES if licenses.nil? || licenses.empty?
|
25
|
+
info = "(#{licenses * ', '}) #{info}"
|
26
|
+
end
|
27
|
+
inject_into_file options[:gemfile], comment_block(info, indention), before: Regexp.new("[\s]*gem[\s]+['\"]#{gem_name}['\"]") if info
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module GemfileUtils
|
2
|
+
module Cli
|
3
|
+
module Licenses
|
4
|
+
|
5
|
+
def self.included(thor)
|
6
|
+
thor.class_eval do
|
7
|
+
desc 'licenses', 'Comment Gemfile with gems all dependencies licences fetched from rubygems'
|
8
|
+
method_option :gemfile, default: 'Gemfile'
|
9
|
+
|
10
|
+
def licenses
|
11
|
+
licenses_list = []
|
12
|
+
gemfile_dependencies.each do |dependency|
|
13
|
+
l = ruby_gems(dependency.name)['licenses']
|
14
|
+
l = Base::UNKNOWN_LICENCES if l.nil? || l.empty?
|
15
|
+
licenses_list += l
|
16
|
+
end
|
17
|
+
|
18
|
+
prepend_to_file options[:gemfile], comment_block(licenses_comment(licenses_list))
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def licenses_comment(list)
|
23
|
+
safe_encode "Licenses: #{list.uniq.sort}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'gemnasium/parser'
|
2
|
+
require 'gemnasium/parser/gemfile'
|
3
|
+
module GemfileUtils
|
4
|
+
module Parser
|
5
|
+
class Gemfile < ::Gemnasium::Parser::Gemfile
|
6
|
+
#do not exclude any gem
|
7
|
+
def exclude?(_match, _opts)
|
8
|
+
false
|
9
|
+
end
|
10
|
+
|
11
|
+
def dependency(match)
|
12
|
+
dep = super(match)
|
13
|
+
dep.instance_variable_set(:@indention, match.to_s.index(/[^ ]/) ) #count spaces before gem method
|
14
|
+
dep
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'typhoeus'
|
2
|
+
require 'typhoeus/adapters/faraday'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module GemfileUtils
|
6
|
+
module Parser
|
7
|
+
class RubyGems
|
8
|
+
API_URL = 'https://rubygems.org/api/v1/gems/'.freeze
|
9
|
+
|
10
|
+
attr_reader :gems, :connection, :responses
|
11
|
+
|
12
|
+
def initialize(gems)
|
13
|
+
@gems = gems
|
14
|
+
@connection = Faraday.new(url: API_URL) do |faraday|
|
15
|
+
faraday.adapter :typhoeus
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def request!
|
20
|
+
#
|
21
|
+
@responses = {}
|
22
|
+
|
23
|
+
connection.in_parallel(Typhoeus::Hydra.new(max_concurrency: 10)) do
|
24
|
+
gems.map do |gem_name|
|
25
|
+
@responses[gem_name] = connection.get("#{gem_name}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
#keep only successful responses
|
29
|
+
@responses.reject! { |_, response| response.status >= 400 }
|
30
|
+
end
|
31
|
+
|
32
|
+
def info(gem_name)
|
33
|
+
responses.has_key?(gem_name) ? JSON.parse(responses[gem_name].body) : {}
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# incompatible character encodings: ASCII-8BIT and UTF-8 fix by replacing File.binread with File.read
|
2
|
+
# https://github.com/erikhuda/thor/issues/191
|
3
|
+
class Thor
|
4
|
+
module Actions
|
5
|
+
class InjectIntoFile < EmptyDirectory #:nodoc:
|
6
|
+
protected
|
7
|
+
|
8
|
+
# Adds the content to the file.
|
9
|
+
#
|
10
|
+
def replace!(regexp, string, force)
|
11
|
+
return if base.options[:pretend]
|
12
|
+
content = File.read(destination)
|
13
|
+
if force || !content.include?(replacement)
|
14
|
+
content.gsub!(regexp, string)
|
15
|
+
File.open(destination, "wb") { |file| file.write(content) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
metadata
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gemfile_utils
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Igor Fedoronchuk
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.12'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.12'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.19'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.19'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faraday
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.10'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.10'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: typhoeus
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: gemnasium-parser
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.1'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '10.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.0'
|
111
|
+
description: gemfile_utils provides command line interface to modify Gemfile with
|
112
|
+
annotations and comments
|
113
|
+
email:
|
114
|
+
- fedoronchuk@gmail.com
|
115
|
+
executables:
|
116
|
+
- gemfile_utils
|
117
|
+
extensions: []
|
118
|
+
extra_rdoc_files: []
|
119
|
+
files:
|
120
|
+
- ".rspec"
|
121
|
+
- ".rvmrc"
|
122
|
+
- ".travis.yml"
|
123
|
+
- CODE_OF_CONDUCT.md
|
124
|
+
- Gemfile
|
125
|
+
- LICENSE.txt
|
126
|
+
- README.md
|
127
|
+
- Rakefile
|
128
|
+
- bin/console
|
129
|
+
- bin/gemfile_utils
|
130
|
+
- bin/setup
|
131
|
+
- fixtures/vcr_cassettes/rubygems.yml
|
132
|
+
- gemfile_utils.gemspec
|
133
|
+
- lib/gemfile_utils.rb
|
134
|
+
- lib/gemfile_utils/cli/base.rb
|
135
|
+
- lib/gemfile_utils/cli/modules/comments.rb
|
136
|
+
- lib/gemfile_utils/cli/modules/licenses.rb
|
137
|
+
- lib/gemfile_utils/parser/gemfile.rb
|
138
|
+
- lib/gemfile_utils/parser/ruby_gems.rb
|
139
|
+
- lib/gemfile_utils/thor/actions/inject_into_file.rb
|
140
|
+
- lib/gemfile_utils/version.rb
|
141
|
+
homepage: https://github.com/Fivell
|
142
|
+
licenses:
|
143
|
+
- MIT
|
144
|
+
metadata: {}
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
requirements: []
|
160
|
+
rubyforge_project:
|
161
|
+
rubygems_version: 2.4.6
|
162
|
+
signing_key:
|
163
|
+
specification_version: 4
|
164
|
+
summary: gemfile_utils gem
|
165
|
+
test_files: []
|