gemfile_utils 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+
@@ -0,0 +1,3 @@
1
+ module GemfileUtils
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ require "gemfile_utils/version"
2
+ require "gemfile_utils/cli/base"
3
+ module GemfileUtils
4
+ end
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: []