gemat 0.1.1 → 0.1.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a0cf4ae9ce848baece6d6ae5468172dae15a3d9ce0f5c1f86f5857683bdd997
4
- data.tar.gz: 0f4530883e71e3d11a8e87c0209dc205f71bcd87b34e7e56577c8fc5327b5da1
3
+ metadata.gz: 8f982912f3b03995a2abde75b03a47ec9102608968aac18984961dcc0eeec294
4
+ data.tar.gz: b424b233d91a30b3343a72423899f03bdd646bea95ab04b3e5db35877952188f
5
5
  SHA512:
6
- metadata.gz: b6bd9726fed2ebd7eedb7a2abe9bb24e24ef2dd2da6d5caf4e097e9099f44becf881c283a075088be4d46f3ad414cd2d7eb46f83bd5794c1f8f0f7fa6175b7ea
7
- data.tar.gz: dc337262705b8c00c0ec80055332a81650a35057eba95cf1a0359d526785dcd803fdf3311e1284d3f5272ae8990fd9d213904e870cabc1e94ee02f1c132e671c
6
+ metadata.gz: cfae4ee42d415f01228e91e7579d4f3426af3cc66c856355bbc543097f43f11f03112fb231995e1ae603a2f9fbd151db28a5654592602c4e83a68ac8ebc72596
7
+ data.tar.gz: bd65e8888a6ebb972621da6ad8eb2fa5e2f66658621908a950e7463ad60282f8dc1de100ee30d4966c040f741b5b8d5c9aec5783f756d2c0d7feddd4d22aab9c
data/lib/csv_formatter.rb CHANGED
@@ -1,28 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'csv'
4
-
5
3
  module Gemat
6
- class CsvFormatter
7
- DEFAULT_OUTPUT = 'gemat'
8
-
9
- def initialize(url, output = DEFAULT_OUTPUT)
10
- @url = url
11
- @output = output
12
- end
4
+ class CsvFormatter < Formatter
5
+ private
13
6
 
14
- def to_csv
15
- CSV.open(output_file, 'w') do |csv|
16
- csv << ['gem', 'Repo URL']
17
- @url.urls.each do |k, v|
18
- csv << [k, v]
19
- end
7
+ def gen_rows
8
+ @rows << @columns.map(&:column_name).join(',')
9
+ @gems.each do |gem|
10
+ @rows << @columns.map { |dsl| dsl.call(gem) }.join(',')
20
11
  end
21
- print "\n\nexport to #{output_file} !"
22
- end
23
-
24
- def output_file
25
- "#{@output}.csv"
26
12
  end
27
13
  end
28
14
  end
data/lib/fetcher.rb ADDED
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemat
4
+ class Fetcher
5
+ attr_accessor :gems
6
+
7
+ def initialize(dsl)
8
+ @dsl = dsl
9
+ @gems = []
10
+ end
11
+
12
+ def run
13
+ pb = ProgressBar.create(total: @dsl.dependencies.length)
14
+ @dsl.dependencies.each_with_index do |gem, idx|
15
+ pb.increment
16
+
17
+ response = fetch(gem)
18
+ sleep 0.2
19
+ next unless response
20
+
21
+ gem = Gem.new(response)
22
+ gem.index = idx
23
+ @gems << gem
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ # rubocop:disable Metrics/MethodLength
30
+ def fetch(gem)
31
+ failed = []
32
+
33
+ client = HTTPClient.new
34
+ request = client.get(rubygems_api(gem.name))
35
+ begin
36
+ response = JSON.parse(request.body)
37
+ rescue JSON::ParserError
38
+ failed << gem.name
39
+ return
40
+ end
41
+
42
+ print "#{failed.join(',')}: failed fetcing gem info." unless failed.empty?
43
+ response
44
+ end
45
+ # rubocop:enable Metrics/MethodLength
46
+
47
+ def rubygems_api(name)
48
+ "https://rubygems.org/api/v1/gems/#{name}.json"
49
+ end
50
+ end
51
+ end
data/lib/formatter.rb ADDED
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemat
4
+ class Formatter
5
+ def initialize(gems, columns, write_path: nil)
6
+ @gems = gems
7
+ @columns = columns
8
+ @write_path = write_path
9
+ @rows = []
10
+ gen_rows
11
+ end
12
+
13
+ def run
14
+ if @write_path
15
+ File.open(@write_path, 'w') do |file|
16
+ each_write(@rows) { |string| file << string }
17
+ end
18
+ else
19
+ print "\n\n"
20
+ each_write(@rows) { |string| print string }
21
+ print "\n"
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def each_write(rows, &proc)
28
+ rows.each do |row|
29
+ proc.call(row)
30
+ proc.call("\n")
31
+ end
32
+ end
33
+ end
34
+ end
data/lib/gem.rb ADDED
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemat
4
+ class Gem
5
+ attr_accessor :index, :response
6
+
7
+ def initialize(response)
8
+ @response = response
9
+ @index = 0
10
+ end
11
+
12
+ def repo_uri
13
+ match = github_uri_match([@response.dig('metadata', 'homepage_uri'),
14
+ @response['homepage_uri'],
15
+ @response['bug_tracker_uri'],
16
+ @response['source_code_uri']])
17
+ return if match.nil?
18
+
19
+ user = match[1]
20
+ repo = match[2]
21
+ "https://github.com/#{user}/#{repo}"
22
+ end
23
+
24
+ private
25
+
26
+ def github_uri_match(uris)
27
+ reg = %r{https://github.com/([\w\-]+)/([\w\-]+)}
28
+ uris.each do |uri|
29
+ return reg.match(uri) if reg.match(uri)
30
+ end
31
+ end
32
+ end
33
+ end
data/lib/gemat/cli.rb CHANGED
@@ -1,23 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'thor'
4
-
5
3
  module Gemat
6
4
  class Cli < Thor
7
5
  desc 'csv', 'export Gemfile to CSV file'
6
+ method_options input: :string, output: :string, columns: :array
8
7
  def csv
9
- dsl = Gemat::Dsl.new
10
- url = Gemat::GetUrl.new(dsl)
11
- url.run
12
- Gemat::CsvFormatter.new(url).to_csv
8
+ command(options, __method__)
13
9
  end
14
10
 
15
11
  desc 'md', 'export Gemfile to markdown'
12
+ method_options input: :string, output: :string, columns: :array
16
13
  def md
17
- dsl = Gemat::Dsl.new
18
- url = Gemat::GetUrl.new(dsl)
19
- url.run
20
- Gemat::MdFormatter.new(url).to_md
14
+ command(options, __method__)
15
+ end
16
+
17
+ no_tasks do
18
+ def command(options, method_name)
19
+ klass = "Gemat::#{method_name.capitalize}Formatter"
20
+ Gemat.run(options) do |gems, columns|
21
+ Object.const_get(klass).new(gems, columns, write_path: options[:output]).run
22
+ end
23
+ end
21
24
  end
22
25
  end
23
26
  end
data/lib/gemat/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gemat
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.5'
5
5
  end
data/lib/gemat.rb CHANGED
@@ -1,15 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bundler'
3
4
  require 'httpclient'
4
5
  require 'json'
6
+ require 'ruby-progressbar'
7
+ require 'thor'
5
8
 
9
+ require_relative 'in_dsl'
10
+ require_relative 'out_dsl'
11
+ require_relative 'fetcher'
12
+ require_relative 'gem'
13
+ require_relative 'formatter'
6
14
  require_relative 'csv_formatter'
7
15
  require_relative 'md_formatter'
8
- require_relative 'dsl'
9
16
  require_relative 'gemat/version'
10
17
  require_relative 'gemat/cli'
11
- require_relative 'get_url'
12
18
 
13
19
  module Gemat
14
20
  class Error < StandardError; end
21
+
22
+ class Gemat
23
+ def self.run(options = {}, &block)
24
+ dsl = InDsl.new(options[:input])
25
+ outdsls = OutDsl.create(options[:columns])
26
+ fetcher = Fetcher.new(dsl)
27
+ fetcher.run
28
+ block.call(fetcher.gems, outdsls)
29
+ end
30
+ end
15
31
  end
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler'
4
-
5
3
  module Gemat
6
- class Dsl
7
- attr_accessor :dependencies, :sources, :git_sources, :groups, :gemspecs
4
+ class InDsl
5
+ attr_accessor :dependencies, :sources, :git_sources, :groups, :gemfiles
8
6
 
9
7
  # rubocop:disable Metrics/MethodLength
10
8
  def initialize(gemfile = nil)
@@ -13,14 +11,14 @@ module Gemat
13
11
  dsl.eval_gemfile(gemfile)
14
12
 
15
13
  class << dsl
16
- attr_accessor :sources, :git_sources, :groups, :gemspecs
14
+ attr_accessor :sources, :git_sources, :groups, :gemfiles
17
15
  end
18
16
 
19
17
  @dependencies = dsl.dependencies
20
18
  @sources = dsl.sources
21
19
  @git_sources = dsl.git_sources
22
20
  @groups = dsl.groups
23
- @gemspecs = dsl.gemspecs
21
+ @gemfiles = dsl.gemfiles
24
22
  end
25
23
  # rubocop:enable Metrics/MethodLength
26
24
  end
data/lib/md_formatter.rb CHANGED
@@ -1,19 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'logger'
4
-
5
3
  module Gemat
6
- class MdFormatter
7
- def initialize(url)
8
- @url = url
9
- end
4
+ class MdFormatter < Formatter
5
+ private
10
6
 
11
- def to_md
12
- print "\n\n"
13
- puts '| gem | Repo URL |'
14
- puts '| ---- | ---- |'
15
- @url.urls.each do |k, v|
16
- puts "| #{k} | #{v} |"
7
+ def gen_rows
8
+ @rows << "| #{@columns.map(&:column_name).join(' | ')} |"
9
+ @rows << "| #{Array.new(@columns.length, '----').join(' | ')} |"
10
+ @gems.each do |gem|
11
+ @rows << "| #{@columns.map { |dsl| dsl.call(gem) }.join(' | ')} |"
17
12
  end
18
13
  end
19
14
  end
data/lib/out_dsl.rb ADDED
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemat
4
+ class OutDsl
5
+ INDEX = 'index'
6
+ NAME = 'name'
7
+ REPO_URI = 'repo_uri'
8
+ GEM_URI = 'gem_uri'
9
+ DOC_URI = 'documentation_uri'
10
+ LATEST_VERSION = 'version'
11
+ AUTHORS = 'authors'
12
+ DEFAULT_COLUMNS = [INDEX, NAME, REPO_URI, DOC_URI].freeze
13
+
14
+ RESPONSE_SOURCES = [NAME, DOC_URI, GEM_URI, LATEST_VERSION, AUTHORS].freeze
15
+ GEM_SOURCES = [INDEX, REPO_URI].freeze
16
+
17
+ attr_accessor :column_name
18
+
19
+ def self.new_by_array(columns)
20
+ columns.map { |column| new(column) }
21
+ end
22
+
23
+ def self.create(columns)
24
+ if columns
25
+ new_by_array(columns)
26
+ else
27
+ new_by_array(DEFAULT_COLUMNS)
28
+ end
29
+ end
30
+
31
+ def initialize(column_name)
32
+ @column_name = column_name
33
+
34
+ set_lambda
35
+ end
36
+
37
+ def call(gem)
38
+ @lambda.call(gem)
39
+ end
40
+
41
+ # rubocop:disable Metrics/MethodLength
42
+ def set_lambda
43
+ case @column_name
44
+ when *RESPONSE_SOURCES
45
+ @lambda = rubygems_response(@column_name)
46
+ when *GEM_SOURCES
47
+ @lambda = gem_method(@column_name)
48
+ else
49
+ msg = <<-ERROR.gsub(/^\s+/, '')
50
+ Contain invalid column name `#{@column_name}`!
51
+ valid columns hint: [#{GEM_SOURCES.join(', ')}, #{RESPONSE_SOURCES.join(', ')}]
52
+ ERROR
53
+ raise StandardError, msg
54
+ end
55
+ end
56
+ # rubocop:enable Metrics/MethodLength
57
+
58
+ def rubygems_response(column)
59
+ ->(gem) { gem.response[column] }
60
+ end
61
+
62
+ def gem_method(column)
63
+ ->(gem) { gem.send(column) }
64
+ end
65
+ end
66
+ end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - kijimaD
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-25 00:00:00.000000000 Z
11
+ date: 2021-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httpclient
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-progressbar
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: thor
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -34,12 +62,15 @@ extra_rdoc_files: []
34
62
  files:
35
63
  - exe/gemat
36
64
  - lib/csv_formatter.rb
37
- - lib/dsl.rb
65
+ - lib/fetcher.rb
66
+ - lib/formatter.rb
67
+ - lib/gem.rb
38
68
  - lib/gemat.rb
39
69
  - lib/gemat/cli.rb
40
70
  - lib/gemat/version.rb
41
- - lib/get_url.rb
71
+ - lib/in_dsl.rb
42
72
  - lib/md_formatter.rb
73
+ - lib/out_dsl.rb
43
74
  homepage: https://github.com/kijimaD/gemat
44
75
  licenses:
45
76
  - GPL3
data/lib/get_url.rb DELETED
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Gemat
4
- class GetUrl
5
- def initialize(dsl)
6
- @dsl = dsl
7
- @urls = {}
8
- end
9
-
10
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
11
- def run
12
- @dsl.dependencies.each do |gem|
13
- # break unless gem == @dsl.dependencies.first
14
-
15
- sleep 0.1
16
- print "#{gem.name}..."
17
-
18
- client = HTTPClient.new
19
- request = client.get(rubygems_api(gem))
20
- begin
21
- response = JSON.parse(request.body)
22
- rescue JSON::ParserError
23
- print "not found\n"
24
- next
25
- end
26
- # puts JSON.pretty_generate(response)
27
-
28
- github_gem = github_url(response.dig('metadata', 'homepage_uri')) ||
29
- github_url(response['homepage_uri']) ||
30
- github_url(response['bug_tracker_uri']) ||
31
- github_url(response['source_code_uri'])
32
- next if github_gem.nil?
33
-
34
- user = github_gem[1]
35
- repo = github_gem[2]
36
- gh_url = "https://github.com/#{user}/#{repo}"
37
- @urls[gem.name] = gh_url
38
- print "done\n"
39
- end
40
- end
41
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
42
-
43
- def github_url(url)
44
- reg = %r{https://github.com/([\w\-]+)/([\w\-]+)}
45
- reg.match(url)
46
- end
47
-
48
- def rubygems_api(gem)
49
- "https://rubygems.org/api/v1/gems/#{gem.name}.json"
50
- end
51
-
52
- def urls
53
- @urls.sort.to_h
54
- end
55
- end
56
- end