git-trend 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8d005c8a154e363c7d06876ff9a0ff64cf999e0a
4
- data.tar.gz: eabc49916aacd96b7b3867e86df388865749e976
3
+ metadata.gz: f57110a790f167885bd1f37c5d6ab482e26f223b
4
+ data.tar.gz: 5b5dc73682fb47665d72651800df82270d45884a
5
5
  SHA512:
6
- metadata.gz: 022e010d212d9f848501812b5c2b521238f2ef93473b4c61d7126501faad83c55f18f76ee0d5e77ae59e5f356a34eaab8aea7b845597aa27ce57564296b293a2
7
- data.tar.gz: 41416f4de73265d2cb8f952812798792fd8f9ea200bd65e6d052ec450d90dea7de09174ed105cad5ef412973f7b8aa2b9da486db920ac9db58195b374a9d5d1b
6
+ metadata.gz: 35bcff208b8e7939bba39db0a4550d1c0577dcdd9a719fe6310df5745af195c483f3f5727ea3e826e41ac9ef8bcde1ee593f4b98de27e405ef4e03a26bb69ff2
7
+ data.tar.gz: 63d649e9d633ccc5878a25cbd17c1c27ffb5433cf6bf035999f749a76da7a32750e7779b738b3b76cd4fef18ff5a0bc4c2e3747e35e62cbab6143d8e342bf885
@@ -1,3 +1,8 @@
1
+ ## v0.0.8
2
+
3
+ * Upgrade simplecov 0.9.0 (5fbcbab)
4
+ * Fix gemspec homepage typo (9bd6b48)
5
+
1
6
  ## v0.0.7
2
7
 
3
8
  * Tweak help message.(Accent a green color in help) (9da3e5e)
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.email = ['terasawan@gmail.com']
25
25
  spec.summary = 'cli based; show Trending repository on github'
26
26
  spec.description = spec.summary
27
- spec.homepage = 'https://github.com/rochefort/github-trend'
27
+ spec.homepage = 'https://github.com/rochefort/git-trend'
28
28
  spec.license = 'MIT'
29
29
 
30
30
  spec.files = `git ls-files -z`.split("\x0")
@@ -43,7 +43,7 @@ Gem::Specification.new do |spec|
43
43
 
44
44
  spec.add_development_dependency 'rspec', '~> 3.0.0'
45
45
  spec.add_development_dependency 'rspec-its', '~> 1.0.1'
46
- spec.add_development_dependency 'simplecov', '~> 0.8.2'
46
+ spec.add_development_dependency 'simplecov', '~> 0.9.0'
47
47
  spec.add_development_dependency 'webmock', '~> 1.18.0'
48
48
 
49
49
  spec.add_development_dependency 'coveralls'
@@ -21,9 +21,8 @@ class String
21
21
  extraction
22
22
  end
23
23
 
24
- def mb_ljust(width, padding=' ')
24
+ def mb_ljust(width, padding = ' ')
25
25
  padding_size = [0, width - mb_width].max
26
26
  self + padding * padding_size
27
27
  end
28
-
29
28
  end
@@ -1,6 +1,5 @@
1
1
  module GitTrend
2
2
  module Rendering
3
-
4
3
  def self.included(base)
5
4
  base.extend(self)
6
5
  end
@@ -10,9 +9,9 @@ module GitTrend
10
9
  DEFAULT_RULED_LINE_SIZE = [3, 40, 10, 6, 5]
11
10
  DESCRIPTION_MIN_SIZE = 20
12
11
 
13
- def render(projects, describable=false)
12
+ def render(projects, describable = false)
14
13
  @describable = describable
15
- set_ruled_line_size(projects)
14
+ ruled_line_size(projects)
16
15
  render_to_header
17
16
  render_to_body(projects)
18
17
  end
@@ -27,74 +26,75 @@ module GitTrend
27
26
  end
28
27
 
29
28
  private
30
- def max_size_of(projects, attr)
31
- projects.max_by { |project| project.send(attr).size }.send(attr).size
32
- end
33
29
 
34
- def set_ruled_line_size(projects)
35
- @ruled_line_size = DEFAULT_RULED_LINE_SIZE.dup
36
- max_name_size = max_size_of(projects, :name)
37
- if max_name_size > @ruled_line_size[1]
38
- @ruled_line_size[1] = max_name_size
39
- end
30
+ def max_size_of(projects, attr)
31
+ projects.max_by { |project| project.send(attr).size }.send(attr).size
32
+ end
40
33
 
41
- max_lang_size = max_size_of(projects, :lang)
42
- if max_lang_size > @ruled_line_size[2]
43
- @ruled_line_size[2] = max_lang_size
44
- end
34
+ def ruled_line_size(projects)
35
+ @ruled_line_size = DEFAULT_RULED_LINE_SIZE.dup
36
+ max_name_size = max_size_of(projects, :name)
37
+ if max_name_size > @ruled_line_size[1]
38
+ @ruled_line_size[1] = max_name_size
39
+ end
45
40
 
46
- # setting description size
47
- if @describable
48
- terminal_width, _terminal_height = detect_terminal_size
49
- description_width = terminal_width - @ruled_line_size.inject(&:+) - @ruled_line_size.size
50
- if description_width >= DESCRIPTION_MIN_SIZE
51
- @ruled_line_size << description_width
52
- else
53
- @describable = false
54
- end
55
- end
41
+ max_lang_size = max_size_of(projects, :lang)
42
+ if max_lang_size > @ruled_line_size[2]
43
+ @ruled_line_size[2] = max_lang_size
56
44
  end
57
45
 
58
- def render_to_header
59
- f = @ruled_line_size
60
- if @describable
61
- fmt = "%#{f[0]}s %-#{f[1]}s %-#{f[2]}s %#{f[3]}s %#{f[4]}s %-#{f[5]}s"
46
+ # setting description size
47
+ if @describable
48
+ terminal_width, _terminal_height = detect_terminal_size
49
+ description_width = terminal_width - @ruled_line_size.inject(&:+) - @ruled_line_size.size
50
+ if description_width >= DESCRIPTION_MIN_SIZE
51
+ @ruled_line_size << description_width
62
52
  else
63
- fmt = "%#{f[0]}s %-#{f[1]}s %-#{f[2]}s %#{f[3]}s %#{f[4]}s"
53
+ @describable = false
64
54
  end
65
- header = ['No.', 'Name', 'Lang', 'Star', 'Fork']
66
- header << 'Description' if @describable
67
- puts fmt % header
68
- puts fmt % @ruled_line_size.map{ |field| '-'*field }
69
55
  end
56
+ end
70
57
 
71
- def render_to_body(projects)
72
- f = @ruled_line_size
58
+ def render_to_header
59
+ f = @ruled_line_size
60
+ if @describable
61
+ fmt = "%#{f[0]}s %-#{f[1]}s %-#{f[2]}s %#{f[3]}s %#{f[4]}s %-#{f[5]}s"
62
+ else
73
63
  fmt = "%#{f[0]}s %-#{f[1]}s %-#{f[2]}s %#{f[3]}s %#{f[4]}s"
74
- projects.each_with_index do |project, i|
75
- result = fmt % [i+1, project.to_a].flatten
76
- result << " " + project.description.mb_slice(f.last).mb_ljust(f.last) if @describable
77
- puts result
78
- end
79
64
  end
65
+ header = ['No.', 'Name', 'Lang', 'Star', 'Fork']
66
+ header << 'Description' if @describable
67
+ puts fmt % header
68
+ puts fmt % @ruled_line_size.map { |field| '-'*field }
69
+ end
80
70
 
81
- def command_exists?(command)
82
- ENV['PATH'].split(File::PATH_SEPARATOR).any? { |d| File.exists? File.join(d, command) }
71
+ def render_to_body(projects)
72
+ f = @ruled_line_size
73
+ fmt = "%#{f[0]}s %-#{f[1]}s %-#{f[2]}s %#{f[3]}s %#{f[4]}s"
74
+ projects.each_with_index do |project, i|
75
+ result = fmt % [i + 1, project.to_a].flatten
76
+ result << ' ' + project.description.mb_slice(f.last).mb_ljust(f.last) if @describable
77
+ puts result
83
78
  end
79
+ end
84
80
 
85
- # https://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61-71
86
- def detect_terminal_size
87
- if (ENV['COLUMNS'] =~ /^\d+$/) && (ENV['LINES'] =~ /^\d+$/)
88
- [ENV['COLUMNS'].to_i, ENV['LINES'].to_i]
89
- elsif (RUBY_PLATFORM =~ /java/ || (!STDIN.tty? && ENV['TERM'])) && command_exists?('tput')
90
- [`tput cols`.to_i, `tput lines`.to_i]
91
- elsif STDIN.tty? && command_exists?('stty')
92
- `stty size`.scan(/\d+/).map { |s| s.to_i }.reverse
93
- else
94
- nil
95
- end
96
- rescue
81
+ def command_exists?(command)
82
+ ENV['PATH'].split(File::PATH_SEPARATOR).any? { |d| File.exist? File.join(d, command) }
83
+ end
84
+
85
+ # https://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61-71
86
+ def detect_terminal_size
87
+ if (ENV['COLUMNS'] =~ /^\d+$/) && (ENV['LINES'] =~ /^\d+$/)
88
+ [ENV['COLUMNS'].to_i, ENV['LINES'].to_i]
89
+ elsif (RUBY_PLATFORM =~ /java/ || (!STDIN.tty? && ENV['TERM'])) && command_exists?('tput')
90
+ [`tput cols`.to_i, `tput lines`.to_i]
91
+ elsif STDIN.tty? && command_exists?('stty')
92
+ `stty size`.scan(/\d+/).map { |s| s.to_i }.reverse
93
+ else
97
94
  nil
98
95
  end
96
+ rescue
97
+ nil
98
+ end
99
99
  end
100
100
  end
@@ -3,19 +3,16 @@ require 'addressable/uri'
3
3
 
4
4
  module GitTrend
5
5
  class Scraper
6
-
7
6
  BASE_HOST = 'https://github.com'
8
7
  BASE_URL = "#{BASE_HOST}/trending"
9
8
 
10
9
  def initialize
11
10
  @agent = Mechanize.new
12
11
  proxy = URI.parse(ENV['http_proxy']) if ENV['http_proxy']
13
- if proxy
14
- @agent.set_proxy(proxy.host, proxy.port, proxy.user, proxy.password)
15
- end
12
+ @agent.set_proxy(proxy.host, proxy.port, proxy.user, proxy.password) if proxy
16
13
  end
17
14
 
18
- def get(language=nil, since=nil)
15
+ def get(language = nil, since = nil)
19
16
  projects = []
20
17
  page = @agent.get(generate_url_for_get(language, since))
21
18
 
@@ -46,16 +43,17 @@ module GitTrend
46
43
  end
47
44
 
48
45
  private
49
- def generate_url_for_get(language, since)
50
- uri = Addressable::URI.parse(BASE_URL)
51
- if language or since
52
- uri.query_values = { l: language, since: since}.delete_if{ |k,v| v.nil? }
53
- end
54
- uri.to_s
55
- end
56
46
 
57
- def meta_count(elm)
58
- elm.empty? ? 0 : elm[0].parent.text.strip.gsub(',', '').to_i
47
+ def generate_url_for_get(language, since)
48
+ uri = Addressable::URI.parse(BASE_URL)
49
+ if language || since
50
+ uri.query_values = { l: language, since: since }.delete_if { |_k, v| v.nil? }
59
51
  end
52
+ uri.to_s
53
+ end
54
+
55
+ def meta_count(elm)
56
+ elm.empty? ? 0 : elm[0].parent.text.strip.gsub(',', '').to_i
57
+ end
60
58
  end
61
59
  end
@@ -1,3 +1,3 @@
1
1
  module GitTrend
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.8'
3
3
  end
@@ -24,7 +24,7 @@ RSpec.describe GitTrend::CLI do
24
24
  before do
25
25
  stub_request_get("trending?l=#{language}")
26
26
  end
27
- let(:language) {'ruby'}
27
+ let(:language) { 'ruby' }
28
28
 
29
29
  it 'display daily ranking by language' do
30
30
  res = <<-'EOS'.unindent
@@ -56,15 +56,15 @@ RSpec.describe GitTrend::CLI do
56
56
  | 24 sferik/twitter Ruby 0 1
57
57
  | 25 rightscale/rightscale_cookbooks Ruby 0 1
58
58
  EOS
59
- expect { @cli.invoke(:list, [], {language: language}) }.to output(res).to_stdout
59
+ expect { @cli.invoke(:list, [], language: language) }.to output(res).to_stdout
60
60
  end
61
61
  end
62
62
 
63
63
  context 'with objective-c++ (including + sign)' do
64
64
  before do
65
- stub_request_get("trending?l=objective-c%2B%2B")
65
+ stub_request_get('trending?l=objective-c%2B%2B')
66
66
  end
67
- let(:language) {'objective-c++'}
67
+ let(:language) { 'objective-c++' }
68
68
 
69
69
  it 'display daily ranking by language' do
70
70
  res = <<-'EOS'.unindent
@@ -96,7 +96,7 @@ RSpec.describe GitTrend::CLI do
96
96
  | 24 Yonsm/CeleWare Objective-C++ 0 0
97
97
  | 25 ccrma/miniAudicle Objective-C++ 0 0
98
98
  EOS
99
- expect { @cli.invoke(:list, [], {language: language}) }.to output(res).to_stdout
99
+ expect { @cli.invoke(:list, [], language: language) }.to output(res).to_stdout
100
100
  end
101
101
  end
102
102
  end
@@ -106,7 +106,7 @@ RSpec.describe GitTrend::CLI do
106
106
  before do
107
107
  stub_request_get("trending?since=#{since}")
108
108
  end
109
- let(:since) {'weekly'}
109
+ let(:since) { 'weekly' }
110
110
 
111
111
  it 'display daily ranking since weekly' do
112
112
  res = <<-'EOS'.unindent
@@ -138,7 +138,7 @@ RSpec.describe GitTrend::CLI do
138
138
  | 24 mbostock/d3 JavaScript 307 113
139
139
  | 25 maxpow4h/swiftz Swift 350 20
140
140
  EOS
141
- expect { @cli.invoke(:list, [], {since: since}) }.to output(res).to_stdout
141
+ expect { @cli.invoke(:list, [], since: since) }.to output(res).to_stdout
142
142
  end
143
143
  end
144
144
 
@@ -146,7 +146,7 @@ RSpec.describe GitTrend::CLI do
146
146
  before do
147
147
  stub_request_get("trending?since=#{since}")
148
148
  end
149
- let(:since) {'monthly'}
149
+ let(:since) { 'monthly' }
150
150
 
151
151
  it 'display daily ranking since monthly' do
152
152
  res = <<-'EOS'.unindent
@@ -178,7 +178,7 @@ RSpec.describe GitTrend::CLI do
178
178
  | 24 julianshapiro/velocity JavaScript 1081 71
179
179
  | 25 babun/babun Shell 1068 46
180
180
  EOS
181
- expect { @cli.invoke(:list, [], {since: since}) }.to output(res).to_stdout
181
+ expect { @cli.invoke(:list, [], since: since) }.to output(res).to_stdout
182
182
  end
183
183
  end
184
184
  end
@@ -192,7 +192,7 @@ RSpec.describe GitTrend::CLI do
192
192
 
193
193
  context 'terminal width is enough' do
194
194
  before do
195
- stub_request_get("trending")
195
+ stub_request_get('trending')
196
196
  ENV['COLUMNS'] = '140'
197
197
  ENV['LINES'] = '40'
198
198
  end
@@ -227,19 +227,19 @@ RSpec.describe GitTrend::CLI do
227
227
  | 24 PistonDevelopers/piston-workspace Shell 45 0 Git submodules of Piston projects
228
228
  | 25 maxpow4h/swiftz Swift 43 1 Functional programming in Swift
229
229
  EOS
230
- expect { @cli.invoke(:list, [], {description: 'description'}) }.to output(res).to_stdout
230
+ expect { @cli.invoke(:list, [], description: 'description') }.to output(res).to_stdout
231
231
  end
232
232
  end
233
-
233
+
234
234
  context 'terminal width is tiny' do
235
235
  before do
236
- stub_request_get("trending")
236
+ stub_request_get('trending')
237
237
  ENV['COLUMNS'] = '100' # it is not enough for description.
238
238
  ENV['LINES'] = '40'
239
239
  end
240
240
 
241
241
  it 'display daily ranking about the same as no option' do
242
- expect { @cli.invoke(:list, [], {description: 'description'}) }.to output(dummy_result_no_options).to_stdout
242
+ expect { @cli.invoke(:list, [], description: 'description') }.to output(dummy_result_no_options).to_stdout
243
243
  end
244
244
  end
245
245
  end
@@ -249,8 +249,8 @@ RSpec.describe GitTrend::CLI do
249
249
  before do
250
250
  stub_request_get("trending?l=#{language}&since=#{since}")
251
251
  end
252
- let(:language) {'ruby'}
253
- let(:since) {'weekly'}
252
+ let(:language) { 'ruby' }
253
+ let(:since) { 'weekly' }
254
254
 
255
255
  it 'display daily ranking since weekly' do
256
256
  res = <<-'EOS'.unindent
@@ -282,7 +282,7 @@ RSpec.describe GitTrend::CLI do
282
282
  | 24 chloerei/campo Ruby 35 9
283
283
  | 25 jordansissel/fpm Ruby 35 4
284
284
  EOS
285
- expect { @cli.invoke(:list, [], {language: language, since: since}) }.to output(res).to_stdout
285
+ expect { @cli.invoke(:list, [], language: language, since: since) }.to output(res).to_stdout
286
286
  end
287
287
  end
288
288
  end
@@ -492,47 +492,48 @@ RSpec.describe GitTrend::CLI do
492
492
  end
493
493
 
494
494
  private
495
- def stub_request_get(stub_url)
496
- url = Scraper::BASE_HOST.dup
497
- url << "/#{stub_url}" if stub_url
498
- uri = URI.parse(url)
499
495
 
500
- stub_request(:get, uri).
501
- to_return(
502
- :status => 200,
503
- :headers => {content_type: 'text/html'},
504
- :body => load_http_stub(stub_url))
505
- end
496
+ def stub_request_get(stub_url)
497
+ url = Scraper::BASE_HOST.dup
498
+ url << "/#{stub_url}" if stub_url
499
+ uri = URI.parse(url)
506
500
 
507
- def dummy_result_no_options
508
- <<-'EOS'.unindent
509
- |No. Name Lang Star Fork
510
- |--- -------------------------------------------------- ------------ ------ -----
511
- | 1 prat0318/json_resume Ruby 264 15
512
- | 2 andlabs/ui Go 185 8
513
- | 3 jessepollak/card CSS 174 9
514
- | 4 fullstackio/FlappySwift Swift 148 44
515
- | 5 grant/swift-cheat-sheet 153 13
516
- | 6 Flolagale/mailin Python 155 3
517
- | 7 numbbbbb/the-swift-programming-language-in-chinese JavaScript 120 31
518
- | 8 hippyvm/hippyvm PHP 113 1
519
- | 9 neovim/neovim C 83 8
520
- | 10 hiphopapp/hiphop CoffeeScript 77 8
521
- | 11 interagent/http-api-design 78 4
522
- | 12 austinzheng/swift-2048 Swift 69 16
523
- | 13 mdznr/What-s-New Objective-C 72 2
524
- | 14 daneden/animate.css CSS 65 6
525
- | 15 davidmerfield/randomColor JavaScript 66 3
526
- | 16 dawn/dawn Ruby 62 2
527
- | 17 greatfire/wiki 54 9
528
- | 18 swift-jp/swift-guide CSS 45 9
529
- | 19 addyosmani/psi JavaScript 49 0
530
- | 20 mtford90/silk Python 47 0
531
- | 21 agaue/agaue Go 47 0
532
- | 22 mentionapp/mntpulltoreact Objective-C 46 1
533
- | 23 mikepenz/AboutLibraries Java 45 0
534
- | 24 PistonDevelopers/piston-workspace Shell 45 0
535
- | 25 maxpow4h/swiftz Swift 43 1
536
- EOS
537
- end
501
+ stub_request(:get, uri)
502
+ .to_return(
503
+ status: 200,
504
+ headers: { content_type: 'text/html' },
505
+ body: load_http_stub(stub_url))
506
+ end
507
+
508
+ def dummy_result_no_options
509
+ <<-'EOS'.unindent
510
+ |No. Name Lang Star Fork
511
+ |--- -------------------------------------------------- ------------ ------ -----
512
+ | 1 prat0318/json_resume Ruby 264 15
513
+ | 2 andlabs/ui Go 185 8
514
+ | 3 jessepollak/card CSS 174 9
515
+ | 4 fullstackio/FlappySwift Swift 148 44
516
+ | 5 grant/swift-cheat-sheet 153 13
517
+ | 6 Flolagale/mailin Python 155 3
518
+ | 7 numbbbbb/the-swift-programming-language-in-chinese JavaScript 120 31
519
+ | 8 hippyvm/hippyvm PHP 113 1
520
+ | 9 neovim/neovim C 83 8
521
+ | 10 hiphopapp/hiphop CoffeeScript 77 8
522
+ | 11 interagent/http-api-design 78 4
523
+ | 12 austinzheng/swift-2048 Swift 69 16
524
+ | 13 mdznr/What-s-New Objective-C 72 2
525
+ | 14 daneden/animate.css CSS 65 6
526
+ | 15 davidmerfield/randomColor JavaScript 66 3
527
+ | 16 dawn/dawn Ruby 62 2
528
+ | 17 greatfire/wiki 54 9
529
+ | 18 swift-jp/swift-guide CSS 45 9
530
+ | 19 addyosmani/psi JavaScript 49 0
531
+ | 20 mtford90/silk Python 47 0
532
+ | 21 agaue/agaue Go 47 0
533
+ | 22 mentionapp/mntpulltoreact Objective-C 46 1
534
+ | 23 mikepenz/AboutLibraries Java 45 0
535
+ | 24 PistonDevelopers/piston-workspace Shell 45 0
536
+ | 25 maxpow4h/swiftz Swift 43 1
537
+ EOS
538
+ end
538
539
  end
@@ -19,10 +19,10 @@ RSpec.describe GitTrend::Scraper do
19
19
  context 'when a network error occurred' do
20
20
  before do
21
21
  @scraper = Scraper.new
22
- stub_request(:get, Scraper::BASE_URL).
23
- to_return(:status => 500, :body => '[]')
22
+ stub_request(:get, Scraper::BASE_URL)
23
+ .to_return(status: 500, body: '[]')
24
24
  end
25
- it { expect{ @scraper.get }.to raise_error(Exception) }
25
+ it { expect { @scraper.get }.to raise_error(Exception) }
26
26
  end
27
27
  end
28
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-trend
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - rochefort
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-26 00:00:00.000000000 Z
11
+ date: 2014-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.8.2
117
+ version: 0.9.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 0.8.2
124
+ version: 0.9.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: webmock
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -185,7 +185,7 @@ files:
185
185
  - spec/git_trend/cli_spec.rb
186
186
  - spec/git_trend/scraper_spec.rb
187
187
  - spec/spec_helper.rb
188
- homepage: https://github.com/rochefort/github-trend
188
+ homepage: https://github.com/rochefort/git-trend
189
189
  licenses:
190
190
  - MIT
191
191
  metadata: {}