gemat 0.1.0 → 0.1.4

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: 6505a5cf71ca84a7cef9f7584f1acc48af9199c184afe8bb9ba3cc84b4ff13e0
4
- data.tar.gz: 9a35db86cdf9275fac5091674d360337f8dc16a2284c0decbecda003f7803d00
3
+ metadata.gz: d8aaec3acaf9aba89e198cf7077ea42527378af2ed240a2afd9569a463ffb11c
4
+ data.tar.gz: b1848af9dd9395a6a1e8b10615758da31fbbb8273fe08780c00d55393445cc6f
5
5
  SHA512:
6
- metadata.gz: c1d6d1be9948bf32493dee022278db5cbabf47b23c59bd488d019cdb8b986ef62ea44959d6442714fd76bd4a1c5e99d63462c78baf1ad7459fb1f7b9e912e168
7
- data.tar.gz: 37c66b7bc88beb96b05dc0962afcee34197f01bed68d98a0fe22954b27ccaf37f87988976d975ec19587ec5b32ce512fcd5c576c6f424add40a3262241264ac9
6
+ metadata.gz: c1ba3ce74b81c32c70ced331101bc9345eebd57b1481f8f28743c021076499cc136d3dae6b1aeb5fd79355f860a18b6ffaa5bfa6b065fb5a6fd59295c1fcd1f4
7
+ data.tar.gz: 7d780cfafb27dafd2becf3043337f4779aac46a9d17364179b9f15c9e20d47f505ed7067a05a7171d085c23a2144b6eb824586641ba280c90a048b02fe99f8d5
data/lib/csv_formatter.rb CHANGED
@@ -1,18 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'csv'
4
-
5
3
  module Gemat
6
- class CsvFormatter
7
- def initialize(url)
8
- @url = url
9
- end
4
+ class CsvFormatter < Formatter
5
+ private
10
6
 
11
- def to_csv
12
- CSV.open('test.csv', 'w') do |csv|
13
- @url.urls.each do |k, v|
14
- csv << [k, v]
15
- 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(',')
16
11
  end
17
12
  end
18
13
  end
data/lib/fetcher.rb ADDED
@@ -0,0 +1,46 @@
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
+ sleep 0.1
16
+ pb.increment
17
+
18
+ response = fetch(gem)
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
+ def fetch(gem)
30
+ client = HTTPClient.new
31
+ request = client.get(rubygems_api(gem.name))
32
+ begin
33
+ response = JSON.parse(request.body)
34
+ rescue JSON::ParserError
35
+ print "\n#{gem.name} is not found on Rubygems..."
36
+ return
37
+ end
38
+ # puts JSON.pretty_generate(response)
39
+ response
40
+ end
41
+
42
+ def rubygems_api(name)
43
+ "https://rubygems.org/api/v1/gems/#{name}.json"
44
+ end
45
+ end
46
+ 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,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemat
4
+ class Gem
5
+ attr_accessor :index
6
+
7
+ def initialize(response)
8
+ @response = response
9
+ @index = 0
10
+ end
11
+
12
+ def name
13
+ @response['name']
14
+ end
15
+
16
+ def repo_url
17
+ match = github_url_match([@response.dig('metadata', 'homepage_uri'),
18
+ @response['homepage_uri'],
19
+ @response['bug_tracker_uri'],
20
+ @response['source_code_uri']])
21
+ return if match.nil?
22
+
23
+ user = match[1]
24
+ repo = match[2]
25
+ "https://github.com/#{user}/#{repo}"
26
+ end
27
+
28
+ private
29
+
30
+ def github_url_match(urls)
31
+ reg = %r{https://github.com/([\w\-]+)/([\w\-]+)}
32
+ urls.each do |url|
33
+ return reg.match(url) if reg.match(url)
34
+ end
35
+ end
36
+ end
37
+ end
data/lib/gemat/cli.rb CHANGED
@@ -1,15 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'thor'
4
-
5
3
  module Gemat
6
4
  class Cli < Thor
7
- desc 'export Gemfile to CSV', 'test'
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__)
9
+ end
10
+
11
+ desc 'md', 'export Gemfile to markdown'
12
+ method_options input: :string, output: :string, columns: :array
13
+ def 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
13
24
  end
14
25
  end
15
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.0'
4
+ VERSION = '0.1.4'
5
5
  end
data/lib/gemat.rb CHANGED
@@ -1,14 +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
- require_relative 'dsl'
15
+ require_relative 'md_formatter'
8
16
  require_relative 'gemat/version'
9
17
  require_relative 'gemat/cli'
10
- require_relative 'get_url'
11
18
 
12
19
  module Gemat
13
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
14
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
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemat
4
+ class MdFormatter < Formatter
5
+ private
6
+
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(' | ')} |"
12
+ end
13
+ end
14
+ end
15
+ end
data/lib/out_dsl.rb ADDED
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemat
4
+ class OutDsl
5
+ INDEX = 'index'
6
+ NAME = 'name'
7
+ REPO_URL = 'repo_url'
8
+ DEFAULT_COLUMNS = [INDEX, NAME, REPO_URL].freeze
9
+
10
+ attr_accessor :column_name
11
+
12
+ def self.new_by_array(columns)
13
+ columns.map { |column| new(column) }
14
+ end
15
+
16
+ def self.create(columns)
17
+ if columns
18
+ new_by_array(columns)
19
+ else
20
+ new_by_array(DEFAULT_COLUMNS)
21
+ end
22
+ end
23
+
24
+ def initialize(column_name)
25
+ @column_name = column_name
26
+
27
+ set_lambda
28
+ end
29
+
30
+ def call(gem)
31
+ @lambda.call(gem)
32
+ end
33
+
34
+ def set_lambda
35
+ case @column_name
36
+ when NAME
37
+ @lambda = name
38
+ when REPO_URL
39
+ @lambda = repo_url
40
+ when INDEX
41
+ @lambda = index
42
+ end
43
+ end
44
+
45
+ def name
46
+ ->(gem) { gem.name }
47
+ end
48
+
49
+ def repo_url
50
+ ->(gem) { gem.repo_url }
51
+ end
52
+
53
+ def index
54
+ ->(gem) { gem.index }
55
+ end
56
+ end
57
+ 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.0
4
+ version: 0.1.4
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-28 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
42
- - lib/main.rb
71
+ - lib/in_dsl.rb
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,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Gemat
4
- class GetUrl
5
- attr_accessor :urls
6
-
7
- def initialize(dsl)
8
- @dsl = dsl
9
- @urls = {}
10
- end
11
-
12
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
13
- def run
14
- @dsl.dependencies.each do |gem|
15
- # break unless gem == @dsl.dependencies.first
16
-
17
- sleep 0.1
18
- p "start #{gem.name}..."
19
-
20
- client = HTTPClient.new
21
- request = client.get(rubygems_api(gem))
22
- response = JSON.parse(request.body)
23
- # puts JSON.pretty_generate(response)
24
-
25
- github_gem = github_url(response.dig('metadata', 'homepage_uri')) ||
26
- github_url(response['homepage_uri']) ||
27
- github_url(response['bug_tracker_uri']) ||
28
- github_url(response['source_code_uri'])
29
- next if github_gem.nil?
30
-
31
- user = github_gem[1]
32
- repo = github_gem[2]
33
- gh_url = "https://github.com/#{user}/#{repo}"
34
- @urls[gem.name] = gh_url
35
- end
36
- end
37
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
38
-
39
- def github_url(url)
40
- reg = %r{https://github.com/([\w\-]+)/([\w\-]+)}
41
- reg.match(url)
42
- end
43
-
44
- def rubygems_api(gem)
45
- "https://rubygems.org/api/v1/gems/#{gem.name}.json"
46
- end
47
- end
48
- end
data/lib/main.rb DELETED
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'httpclient'
4
- require 'json'
5
-
6
- require_relative 'dsl'
7
- require_relative 'get_url'
8
- require_relative 'csv_formatter'
9
-
10
- def main
11
- dsl = Gemat::Dsl.new
12
- url = Gemat::GetUrl.new(dsl)
13
- url.run
14
- Gemat::CsvFormatter.new(url).to_csv
15
- end
16
-
17
- main