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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 046379964fb65d48c57f0cd14578fb998a9f17db
4
- data.tar.gz: 552e82b1b68d889e45412f8b66cb919a9d3362ec
3
+ metadata.gz: a9c3b0583d0d6b10a7d9599f831de86d5c2bf45e
4
+ data.tar.gz: c969011d88502cb5776ce8269642e1ee87de2615
5
5
  SHA512:
6
- metadata.gz: 3c9fb8cd20db488cbc80d3f8c7193a760aec1f5a307b1050749e4d0d9a9714af57e989d89647081d126fdc99d0637d5eacd34a672ec014dab8eeb7bc8dd37d46
7
- data.tar.gz: f3b1e78b68e6de637992220ed92f425f3caadc4098e211332387635e24631c2f5d40ea0fefb891728f7c0937e6dc21260c9b9af15728ced021fd0545acb95784
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 utitlity to show [Trending repositories on GitHub](https://github.com/trending).
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 trendings
179
+ ### number of trending
186
180
 
187
181
  git trend -n <number>
188
182
 
@@ -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
- return macos_version >= '10.7' # 10.7 is lion
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 = 'cli based; show Trending repository on github'
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 'thor', '~> 0.19.1'
37
+ spec.add_dependency 'addressable', '~> 2.3.8'
38
38
  spec.add_dependency 'mechanize', '~> 2.7.3'
39
- spec.add_dependency 'addressable', '~> 2.3.6'
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.2.0'
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.9.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.20.4'
49
+ spec.add_development_dependency 'webmock', '~> 1.22.3'
49
50
 
50
51
  spec.add_development_dependency 'coveralls'
51
52
  end
@@ -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 options[:help]
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])
@@ -1,8 +1,6 @@
1
- class String
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.ascii_only? ? 1 : 2
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
@@ -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
- # header columns:
8
- # 'No.', 'Name', 'Lang', 'Star', 'Fork', ['Description']
9
- DEFAULT_RULED_LINE_SIZE = [3, 40, 10, 6]
10
- DESCRIPTION_MIN_SIZE = 20
11
-
12
- def render(projects, describable = false)
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 max_size_of(projects, attr)
32
- projects.max_by { |project| project.send(attr).size }.send(attr).size
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 ruled_line_size(projects)
36
- @ruled_line_size = DEFAULT_RULED_LINE_SIZE.dup
37
- max_name_size = max_size_of(projects, :name)
38
- if max_name_size > @ruled_line_size[1]
39
- @ruled_line_size[1] = max_name_size
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
- max_lang_size = max_size_of(projects, :lang)
43
- if max_lang_size > @ruled_line_size[2]
44
- @ruled_line_size[2] = max_lang_size
45
- end
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
- # setting description size
48
- if @describable
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 render_to_header
60
- f = @ruled_line_size
61
- if @describable
62
- fmt = "%#{f[0]}s %-#{f[1]}s %-#{f[2]}s %#{f[3]}s %-#{f[4]}s"
63
- else
64
- fmt = "%#{f[0]}s %-#{f[1]}s %-#{f[2]}s %#{f[3]}s"
65
- end
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 % @ruled_line_size.map { |field| '-'*field }
64
+ puts fmt % @columns_sizes.map { |column| '-' * column }
70
65
  end
71
66
 
72
- def render_to_body(projects)
73
- f = @ruled_line_size
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
- result = fmt % [i + 1, project.to_a].flatten
77
- result << ' ' + project.description.mb_slice(f.last).mb_ljust(f.last) if @describable
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 render_to_footer
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
@@ -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(/github.com\/trending\?l=(.+)/).to_a[1]
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.gsub("\n", '').strip }
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].gsub(',', '').to_i
50
+ star_count = meta_data[1].delete(',').to_i
60
51
  [lang, star_count]
61
52
  else
62
- star_count = meta_data[0].gsub(',', '').to_i
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
@@ -1,3 +1,3 @@
1
1
  module GitTrend
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
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.6
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-04-04 00:00:00.000000000 Z
11
+ date: 2015-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: thor
14
+ name: addressable
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.19.1
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: 0.19.1
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: addressable
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.3.6
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.3.6
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.2.0
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.2.0
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.9.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.9.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.20.4
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.20.4
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: cli based; show Trending repository on github
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: cli based; show Trending repository on github
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