git-trend 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -12
- data/git-trend.gemspec +8 -7
- data/lib/git_trend/cli.rb +1 -1
- data/lib/git_trend/ext/string.rb +3 -10
- data/lib/git_trend/rendering.rb +48 -51
- data/lib/git_trend/scraper.rb +16 -14
- data/lib/git_trend/version.rb +1 -1
- metadata +31 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9c3b0583d0d6b10a7d9599f831de86d5c2bf45e
|
4
|
+
data.tar.gz: c969011d88502cb5776ce8269642e1ee87de2615
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f7f47ea2d4c6f1b8587ded201212c0e0feb41d7b7fcc185c275320ecbbbed5cca46a12eb762c5e9b92f1511da402f97b27b022800e16c7bbd4f2116690abb21
|
7
|
+
data.tar.gz: 7550677c7a327d551e557afa4cec41ecaf0c4d5a86a4ad9bd19c6ac0067ac8a85ba46c16ef808556bf218aeee5dbe0bb9b9c9e45b117f26c93f4807ec932d534
|
data/README.md
CHANGED
@@ -7,21 +7,11 @@
|
|
7
7
|
|
8
8
|
# git-trend
|
9
9
|
|
10
|
-
git-trend is a command line
|
10
|
+
git-trend is a command line utility to show [Trending repositories on GitHub](https://github.com/trending).
|
11
11
|
|
12
12
|
|
13
13
|
## Installation
|
14
14
|
|
15
|
-
Add this line to your application's Gemfile:
|
16
|
-
|
17
|
-
gem 'git-trend'
|
18
|
-
|
19
|
-
And then execute:
|
20
|
-
|
21
|
-
$ bundle
|
22
|
-
|
23
|
-
Or install it yourself as:
|
24
|
-
|
25
15
|
$ gem install git-trend
|
26
16
|
|
27
17
|
## Usage
|
@@ -63,6 +53,7 @@ No. Name Lang Star Description
|
|
63
53
|
23 google/cadvisor Go 48 Analyzes resource usage and performance characteristics of running containers.
|
64
54
|
24 vladikoff/chromeos-apk JavaScript 46 Run Android APKs in Chrome OS OR Chrome in OS X, Linux and Windows.
|
65
55
|
25 nhanaswigs/htmljs JavaScript 47 HTML render engine and data binding (MVVM)
|
56
|
+
|
66
57
|
```
|
67
58
|
|
68
59
|
### daily trending without description
|
@@ -100,6 +91,7 @@ No. Name Lang Star
|
|
100
91
|
23 google/cadvisor Go 48
|
101
92
|
24 vladikoff/chromeos-apk JavaScript 46
|
102
93
|
25 nhanaswigs/htmljs JavaScript 47
|
94
|
+
|
103
95
|
```
|
104
96
|
|
105
97
|
### daily trending by language
|
@@ -137,6 +129,7 @@ No. Name Lang Star Description
|
|
137
129
|
23 fluent/fluentd Ruby 6 Fluentd data collector
|
138
130
|
24 caskroom/homebrew-cask Ruby 5 A CLI workflow for the administration of Mac applications distributed as binaries
|
139
131
|
25 cantino/huginn Ruby 5 Build agents that monitor and act on your behalf. Your agents are standing by!
|
132
|
+
|
140
133
|
```
|
141
134
|
|
142
135
|
### weekly/monthly trending
|
@@ -180,9 +173,10 @@ No. Name Lang Star Description
|
|
180
173
|
23 mechio/takana CoffeeScript 341 Takana lets you see your SCSS and CSS style changes live, in the browser, as you type them
|
181
174
|
24 davidtheclark/scalable-css-reading-list 331 Collected dispatches from The Quest for Scalable CSS
|
182
175
|
25 addyosmani/timing.js JavaScript 335 Navigation Timing API measurement helpers
|
176
|
+
|
183
177
|
```
|
184
178
|
|
185
|
-
### number of
|
179
|
+
### number of trending
|
186
180
|
|
187
181
|
git trend -n <number>
|
188
182
|
|
data/git-trend.gemspec
CHANGED
@@ -14,7 +14,7 @@ def or_over_mac_os_lion?
|
|
14
14
|
|
15
15
|
macos_full_version = `/usr/bin/sw_vers -productVersion`.chomp
|
16
16
|
macos_version = macos_full_version[/10\.\d+/]
|
17
|
-
|
17
|
+
macos_version >= '10.7' # 10.7 is lion
|
18
18
|
end
|
19
19
|
|
20
20
|
Gem::Specification.new do |spec|
|
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.version = GitTrend::VERSION
|
23
23
|
spec.authors = ['rochefort']
|
24
24
|
spec.email = ['terasawan@gmail.com']
|
25
|
-
spec.summary = '
|
25
|
+
spec.summary = 'CLI-Based tool that show Trending repository on github'
|
26
26
|
spec.description = spec.summary
|
27
27
|
spec.homepage = 'https://github.com/rochefort/git-trend'
|
28
28
|
spec.license = 'MIT'
|
@@ -34,18 +34,19 @@ Gem::Specification.new do |spec|
|
|
34
34
|
|
35
35
|
spec.post_install_message = install_message
|
36
36
|
|
37
|
-
spec.add_dependency '
|
37
|
+
spec.add_dependency 'addressable', '~> 2.3.8'
|
38
38
|
spec.add_dependency 'mechanize', '~> 2.7.3'
|
39
|
-
spec.add_dependency '
|
39
|
+
spec.add_dependency 'thor', '~> 0.19.1'
|
40
|
+
spec.add_dependency 'unicode-display_width', '~> 0.2.0'
|
40
41
|
|
41
42
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
42
43
|
spec.add_development_dependency 'rake'
|
43
44
|
|
44
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
45
|
+
spec.add_development_dependency 'rspec', '~> 3.4.0'
|
45
46
|
spec.add_development_dependency 'rspec-its', '~> 1.2.0'
|
46
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
47
|
+
spec.add_development_dependency 'simplecov', '~> 0.10.0'
|
47
48
|
spec.add_development_dependency 'safe_yaml', '~> 1.0.4' # for Ruby2.2.0
|
48
|
-
spec.add_development_dependency 'webmock', '~> 1.
|
49
|
+
spec.add_development_dependency 'webmock', '~> 1.22.3'
|
49
50
|
|
50
51
|
spec.add_development_dependency 'coveralls'
|
51
52
|
end
|
data/lib/git_trend/cli.rb
CHANGED
@@ -21,7 +21,7 @@ module GitTrend
|
|
21
21
|
option :number, aliases: '-n', required: false, type: :numeric, desc: 'Number of lines'
|
22
22
|
option :help, aliases: '-h', required: false, type: :boolean
|
23
23
|
def list
|
24
|
-
help(:list) and return if
|
24
|
+
help(:list) and return if options[:help]
|
25
25
|
scraper = Scraper.new
|
26
26
|
projects = scraper.get(options[:language], options[:since], options[:number])
|
27
27
|
render(projects, !!options[:description])
|
data/lib/git_trend/ext/string.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
|
2
|
-
def mb_width
|
3
|
-
each_char.inject(0) { |sum, c| sum += c.ascii_only? ? 1 : 2 }
|
4
|
-
end
|
1
|
+
require 'unicode/display_width'
|
5
2
|
|
3
|
+
class String
|
6
4
|
def mb_slice(width)
|
7
5
|
return '' if empty?
|
8
6
|
|
@@ -10,7 +8,7 @@ class String
|
|
10
8
|
extraction_size = 0
|
11
9
|
extraction = ''
|
12
10
|
each_char do |c|
|
13
|
-
char_size = c.
|
11
|
+
char_size = c.display_width
|
14
12
|
if extraction_size + char_size > max_size
|
15
13
|
extraction << '...'
|
16
14
|
break
|
@@ -20,9 +18,4 @@ class String
|
|
20
18
|
end
|
21
19
|
extraction
|
22
20
|
end
|
23
|
-
|
24
|
-
def mb_ljust(width, padding = ' ')
|
25
|
-
padding_size = [0, width - mb_width].max
|
26
|
-
self + padding * padding_size
|
27
|
-
end
|
28
21
|
end
|
data/lib/git_trend/rendering.rb
CHANGED
@@ -3,18 +3,15 @@ module GitTrend
|
|
3
3
|
def self.included(base)
|
4
4
|
base.extend(self)
|
5
5
|
end
|
6
|
+
HEADER_COLUMNS = %w(no. name lang star description)
|
7
|
+
DEFAULT_COLUMNS_SIZES = [3, 40, 10, 6, 20]
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@describable = describable
|
14
|
-
ruled_line_size(projects)
|
15
|
-
render_to_header
|
16
|
-
render_to_body(projects)
|
17
|
-
render_to_footer
|
9
|
+
def render(projects, enable_description = false)
|
10
|
+
@enable_description = enable_description
|
11
|
+
rule_columns_sizes(projects)
|
12
|
+
render_header
|
13
|
+
render_body(projects)
|
14
|
+
render_footer
|
18
15
|
end
|
19
16
|
|
20
17
|
def render_languages(languages)
|
@@ -28,65 +25,61 @@ module GitTrend
|
|
28
25
|
|
29
26
|
private
|
30
27
|
|
31
|
-
def
|
32
|
-
|
28
|
+
def rule_columns_sizes(projects)
|
29
|
+
@columns_sizes = DEFAULT_COLUMNS_SIZES.dup
|
30
|
+
rule_max_column_size(projects, :name)
|
31
|
+
rule_max_column_size(projects, :lang)
|
32
|
+
rule_max_description_size if @enable_description
|
33
|
+
@columns_sizes.pop unless @enable_description
|
33
34
|
end
|
34
35
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
if
|
39
|
-
@
|
36
|
+
def rule_max_description_size
|
37
|
+
terminal_width, _terminal_height = detect_terminal_size
|
38
|
+
description_width = terminal_width - @columns_sizes[0..-2].inject(&:+) - (@columns_sizes.size - 1)
|
39
|
+
if description_width >= DEFAULT_COLUMNS_SIZES.last
|
40
|
+
@columns_sizes[-1] = description_width
|
41
|
+
else
|
42
|
+
@enable_description = false
|
40
43
|
end
|
44
|
+
end
|
41
45
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
+
def rule_max_column_size(projects, attr)
|
47
|
+
index = HEADER_COLUMNS.index(attr.to_s)
|
48
|
+
max_size = max_size_of(projects, attr)
|
49
|
+
@columns_sizes[index] = max_size if max_size > @columns_sizes[index]
|
50
|
+
end
|
46
51
|
|
47
|
-
|
48
|
-
|
49
|
-
terminal_width, _terminal_height = detect_terminal_size
|
50
|
-
description_width = terminal_width - @ruled_line_size.inject(&:+) - @ruled_line_size.size
|
51
|
-
if description_width >= DESCRIPTION_MIN_SIZE
|
52
|
-
@ruled_line_size << description_width
|
53
|
-
else
|
54
|
-
@describable = false
|
55
|
-
end
|
56
|
-
end
|
52
|
+
def max_size_of(projects, attr)
|
53
|
+
projects.max_by { |project| project.send(attr).size }.send(attr).size
|
57
54
|
end
|
58
55
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
header = ['No.', 'Name', 'Lang', 'Star']
|
67
|
-
header << 'Description' if @describable
|
56
|
+
def render_header
|
57
|
+
header = HEADER_COLUMNS.map(&:capitalize)
|
58
|
+
header.pop unless @enable_description
|
59
|
+
f = @columns_sizes
|
60
|
+
fmt = "%#{f[0]}s %-#{f[1]}s %-#{f[2]}s %#{f[3]}s"
|
61
|
+
fmt << " %-#{f[4]}s" if @enable_description
|
62
|
+
|
68
63
|
puts fmt % header
|
69
|
-
puts fmt % @
|
64
|
+
puts fmt % @columns_sizes.map { |column| '-' * column }
|
70
65
|
end
|
71
66
|
|
72
|
-
def
|
73
|
-
f = @
|
67
|
+
def render_body(projects)
|
68
|
+
f = @columns_sizes
|
74
69
|
fmt = "%#{f[0]}s %-#{f[1]}s %-#{f[2]}s %#{f[3]}s"
|
70
|
+
fmt << " %-#{f[4]}s" if @enable_description
|
75
71
|
projects.each_with_index do |project, i|
|
76
|
-
|
77
|
-
|
72
|
+
data = [i + 1, project.to_a].flatten
|
73
|
+
data << project.description.mb_slice(f.last) if @enable_description
|
74
|
+
result = fmt % data
|
78
75
|
puts result
|
79
76
|
end
|
80
77
|
end
|
81
78
|
|
82
|
-
def
|
79
|
+
def render_footer
|
83
80
|
puts
|
84
81
|
end
|
85
82
|
|
86
|
-
def command_exists?(command)
|
87
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).any? { |d| File.exist? File.join(d, command) }
|
88
|
-
end
|
89
|
-
|
90
83
|
# https://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61-71
|
91
84
|
def detect_terminal_size
|
92
85
|
if (ENV['COLUMNS'] =~ /^\d+$/) && (ENV['LINES'] =~ /^\d+$/)
|
@@ -101,5 +94,9 @@ module GitTrend
|
|
101
94
|
rescue
|
102
95
|
nil
|
103
96
|
end
|
97
|
+
|
98
|
+
def command_exists?(command)
|
99
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).any? { |d| File.exist? File.join(d, command) }
|
100
|
+
end
|
104
101
|
end
|
105
102
|
end
|
data/lib/git_trend/scraper.rb
CHANGED
@@ -15,17 +15,8 @@ module GitTrend
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def get(language = nil, since = nil, number = nil)
|
18
|
-
projects = []
|
19
18
|
page = @agent.get(generate_url_for_get(language, since))
|
20
|
-
|
21
|
-
page.search('.repo-list-item').each do |content|
|
22
|
-
project = Project.new
|
23
|
-
meta_data = content.search('.repo-list-meta').text
|
24
|
-
project.lang, project.star_count = extract_lang_and_star_from_meta(meta_data)
|
25
|
-
project.name = content.search('.repo-list-name a').text.split.join
|
26
|
-
project.description = content.search('.repo-list-description').text.gsub("\n", '').strip
|
27
|
-
projects << project
|
28
|
-
end
|
19
|
+
projects = generate_project(page)
|
29
20
|
fail ScrapeException if projects.empty?
|
30
21
|
number ? projects[0...number] : projects
|
31
22
|
end
|
@@ -36,7 +27,7 @@ module GitTrend
|
|
36
27
|
page.search('div.select-menu-item a').each do |content|
|
37
28
|
href = content.attributes['href'].value
|
38
29
|
# objective-c++ =>
|
39
|
-
language = href.match(
|
30
|
+
language = href.match(%r{github.com/trending\?l=(.+)}).to_a[1]
|
40
31
|
languages << CGI.unescape(language) if language
|
41
32
|
end
|
42
33
|
languages
|
@@ -53,15 +44,26 @@ module GitTrend
|
|
53
44
|
end
|
54
45
|
|
55
46
|
def extract_lang_and_star_from_meta(text)
|
56
|
-
meta_data = text.split('•').map { |x| x.
|
47
|
+
meta_data = text.split('•').map { |x| x.delete("\n").strip }
|
57
48
|
if meta_data.size == 3
|
58
49
|
lang = meta_data[0]
|
59
|
-
star_count = meta_data[1].
|
50
|
+
star_count = meta_data[1].delete(',').to_i
|
60
51
|
[lang, star_count]
|
61
52
|
else
|
62
|
-
star_count = meta_data[0].
|
53
|
+
star_count = meta_data[0].delete(',').to_i
|
63
54
|
['', star_count]
|
64
55
|
end
|
65
56
|
end
|
57
|
+
|
58
|
+
def generate_project(page)
|
59
|
+
page.search('.repo-list-item').map do |content|
|
60
|
+
project = Project.new
|
61
|
+
meta_data = content.search('.repo-list-meta').text
|
62
|
+
project.lang, project.star_count = extract_lang_and_star_from_meta(meta_data)
|
63
|
+
project.name = content.search('.repo-list-name a').text.split.join
|
64
|
+
project.description = content.search('.repo-list-description').text.delete("\n").strip
|
65
|
+
project
|
66
|
+
end
|
67
|
+
end
|
66
68
|
end
|
67
69
|
end
|
data/lib/git_trend/version.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-trend
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rochefort
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: addressable
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.3.8
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.3.8
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: mechanize
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,19 +39,33 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.7.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: thor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.19.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.19.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: unicode-display_width
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: 2.
|
61
|
+
version: 0.2.0
|
48
62
|
type: :runtime
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: 2.
|
68
|
+
version: 0.2.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: bundler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +100,14 @@ dependencies:
|
|
86
100
|
requirements:
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: 3.
|
103
|
+
version: 3.4.0
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: 3.
|
110
|
+
version: 3.4.0
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rspec-its
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +128,14 @@ dependencies:
|
|
114
128
|
requirements:
|
115
129
|
- - "~>"
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
131
|
+
version: 0.10.0
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
138
|
+
version: 0.10.0
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: safe_yaml
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,14 +156,14 @@ dependencies:
|
|
142
156
|
requirements:
|
143
157
|
- - "~>"
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version: 1.
|
159
|
+
version: 1.22.3
|
146
160
|
type: :development
|
147
161
|
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
|
-
version: 1.
|
166
|
+
version: 1.22.3
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: coveralls
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,7 +178,7 @@ dependencies:
|
|
164
178
|
- - ">="
|
165
179
|
- !ruby/object:Gem::Version
|
166
180
|
version: '0'
|
167
|
-
description:
|
181
|
+
description: CLI-Based tool that show Trending repository on github
|
168
182
|
email:
|
169
183
|
- terasawan@gmail.com
|
170
184
|
executables:
|
@@ -221,10 +235,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
235
|
version: '0'
|
222
236
|
requirements: []
|
223
237
|
rubyforge_project:
|
224
|
-
rubygems_version: 2.4.5
|
238
|
+
rubygems_version: 2.4.5.1
|
225
239
|
signing_key:
|
226
240
|
specification_version: 4
|
227
|
-
summary:
|
241
|
+
summary: CLI-Based tool that show Trending repository on github
|
228
242
|
test_files:
|
229
243
|
- spec/fixtures/trending
|
230
244
|
- spec/fixtures/trending?l=objective-c%2B%2B
|