previews 0.0.2
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.
- data/.gitignore +6 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README.md +12 -0
- data/Rakefile +31 -0
- data/bin/previews +83 -0
- data/features/previews.feature +11 -0
- data/features/step_definitions/previews_steps.rb +1 -0
- data/features/support/env.rb +9 -0
- data/lib/previews.rb +42 -0
- data/lib/previews/array.rb +41 -0
- data/lib/previews/hirb_vertical_table.rb +30 -0
- data/lib/previews/version.rb +3 -0
- data/previews.gemspec +26 -0
- data/test/tc_something.rb +7 -0
- metadata +116 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Ivan K.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# previews
|
2
|
+
Read user reviews of linux packages.
|
3
|
+
|
4
|
+
**Author:** Ivan K.
|
5
|
+
|
6
|
+
[Source on Github](https://github.com/divout/previews)
|
7
|
+
|
8
|
+
## Installation:
|
9
|
+
gem install previews
|
10
|
+
## Usage:
|
11
|
+
previews vlc --sort-rating asc --lang es
|
12
|
+
Type `previews --help` for full list of options.
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'rake/clean'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'cucumber'
|
5
|
+
require 'cucumber/rake/task'
|
6
|
+
gem 'rdoc' # we need the installed RDoc gem, not the system one
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
include Rake::DSL
|
10
|
+
|
11
|
+
Bundler::GemHelper.install_tasks
|
12
|
+
|
13
|
+
Rake::TestTask.new do |t|
|
14
|
+
t.pattern = 'test/tc_*.rb'
|
15
|
+
end
|
16
|
+
|
17
|
+
CUKE_RESULTS = 'results.html'
|
18
|
+
CLEAN << CUKE_RESULTS
|
19
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
20
|
+
t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} --format progress -x"
|
21
|
+
t.fork = false
|
22
|
+
end
|
23
|
+
|
24
|
+
Rake::RDocTask.new do |rd|
|
25
|
+
|
26
|
+
rd.main = "README.rdoc"
|
27
|
+
|
28
|
+
rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
|
29
|
+
end
|
30
|
+
|
31
|
+
task :default => [:test,:features]
|
data/bin/previews
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), *%w[.. lib])
|
4
|
+
|
5
|
+
require 'optparse'
|
6
|
+
require 'previews'
|
7
|
+
|
8
|
+
HEADERS = { 'origin' => 'Origin',
|
9
|
+
'rating' => 'Rating',
|
10
|
+
'app_name' => 'Application Name',
|
11
|
+
'language' => 'Language',
|
12
|
+
'reviewer_username' => 'Username',
|
13
|
+
'reviewer_displayname' => 'From',
|
14
|
+
'summary' => 'Summary',
|
15
|
+
'review_text' => 'Review',
|
16
|
+
'version' => 'Version',
|
17
|
+
'date_created' => 'Date',
|
18
|
+
'package_name' => 'Package Name',
|
19
|
+
'distroseries' => 'distroseries' }
|
20
|
+
|
21
|
+
options = {
|
22
|
+
:fields => ['rating', 'reviewer_displayname', 'summary', 'review_text'],
|
23
|
+
:release => 'oneiric',
|
24
|
+
:locale => 'en',
|
25
|
+
:package => ARGV[0],
|
26
|
+
:system_less => true,
|
27
|
+
:sort_field => nil,
|
28
|
+
:sort_direction => nil
|
29
|
+
}
|
30
|
+
|
31
|
+
OptionParser.new do |opts|
|
32
|
+
opts.banner = 'Usage: previews PACKAGE [options]'
|
33
|
+
|
34
|
+
opts.separator ""
|
35
|
+
opts.separator "Options:"
|
36
|
+
|
37
|
+
sort_options = ['asc', 'desc', 'ASC', 'DESC']
|
38
|
+
opts.on('-d', '--sort-date DIRECTION', sort_options, 'Sort reviews by date. DIRECTION could be DESC or ASC') do |direction|
|
39
|
+
options[:sort_field] = 'date_created'
|
40
|
+
options[:sort_direction] = direction.downcase
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.on('-t', '--sort-rating DIRECTION', sort_options, 'Sort reviews by rating. DIRECTION could be DESC or ASC') do |direction|
|
44
|
+
options[:sort_field] = 'rating'
|
45
|
+
options[:sort_direction] = direction.downcase
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on('-u', '--sort-usefulness DIRECTION', sort_options, 'Sort reviews by usefulness. DIRECTION could be DESC or ASC', 'Default is DESC') do |direction|
|
49
|
+
options[:sort_field] = 'usefulness'
|
50
|
+
options[:sort_direction] = direction.downcase
|
51
|
+
end
|
52
|
+
|
53
|
+
opts.on('-s', '--[no-]less', 'Set `less` for displaying reviews. By default it is true') do |less|
|
54
|
+
options[:system_less] = less
|
55
|
+
end
|
56
|
+
opts.on('-l', '--lang LANGUAGE', "Set language of reviews. Default is #{options[:locale]}") do |locale|
|
57
|
+
options[:locale] = locale
|
58
|
+
end
|
59
|
+
|
60
|
+
opts.on('-r', '--release RELEASE', "Set the release for package. Default is #{options[:release]}" ) do |release|
|
61
|
+
options[:release] = release
|
62
|
+
end
|
63
|
+
|
64
|
+
opts.on('-f', '--fields A,B,C', Array, 'Set the fields you want to display.', "Available fields: #{HEADERS.keys.join(', ')}") do |fields|
|
65
|
+
options[:fields] = fields.map(&:strip)
|
66
|
+
end
|
67
|
+
|
68
|
+
opts.on( '-h', '--help', 'Show this message' ) do
|
69
|
+
puts opts
|
70
|
+
exit
|
71
|
+
end
|
72
|
+
|
73
|
+
if ARGV.empty?
|
74
|
+
puts opts
|
75
|
+
exit
|
76
|
+
end
|
77
|
+
end.parse!
|
78
|
+
|
79
|
+
reviews = Previews::PackageReviews.new(options[:locale], options[:release], options[:package]).reviews
|
80
|
+
reviews.parse_date_time
|
81
|
+
reviews.sort_with!(options[:sort_field], options[:sort_direction]) if options[:sort_field]
|
82
|
+
reviews.replace_rating_with("★", "☆")
|
83
|
+
reviews.print_with(options[:fields], options[:system_less])
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: My bootstrapped app kinda works
|
2
|
+
In order to get going on coding my awesome app
|
3
|
+
I want to have aruba and cucumber setup
|
4
|
+
So I don't have to do it myself
|
5
|
+
|
6
|
+
Scenario: App just runs
|
7
|
+
When I get help for "previews"
|
8
|
+
Then the exit status should be 0
|
9
|
+
And the banner should be present
|
10
|
+
And the banner should document that this app takes no options
|
11
|
+
And the banner should document that this app takes no arguments
|
@@ -0,0 +1 @@
|
|
1
|
+
# Put your step defintions here
|
data/lib/previews.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'json'
|
3
|
+
require 'net/http'
|
4
|
+
require 'previews/version'
|
5
|
+
require 'previews/array'
|
6
|
+
require 'previews/hirb_vertical_table'
|
7
|
+
|
8
|
+
module Previews
|
9
|
+
class PackageReviews
|
10
|
+
def initialize(locale, release, package)
|
11
|
+
@url = "http://reviews.ubuntu.com/reviews/api/1.0/reviews/filter/#{locale}/ubuntu/#{release}/any/#{package}/"
|
12
|
+
@reviews = []
|
13
|
+
end
|
14
|
+
|
15
|
+
# Return Array of Hases
|
16
|
+
def reviews
|
17
|
+
download_reviews
|
18
|
+
@reviews.flatten!
|
19
|
+
|
20
|
+
@reviews
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
# Get all reviews
|
25
|
+
# Return Array of Hashes
|
26
|
+
def download_reviews
|
27
|
+
page = 1
|
28
|
+
loop do
|
29
|
+
@reviews << download_page(page)
|
30
|
+
break if @reviews.last.empty?
|
31
|
+
page += 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get the one page of reviews.
|
36
|
+
# Return Array of Hashes
|
37
|
+
def download_page(page_number)
|
38
|
+
print '.'
|
39
|
+
JSON.parse(Net::HTTP.get(URI(@url + "page/#{page_number}/")))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Array
|
2
|
+
# Using Hirb to print reviews.
|
3
|
+
# :fields is fields to display
|
4
|
+
# print out :vertical table
|
5
|
+
# HEADERS is Hash of headers
|
6
|
+
# passing system_less as a option
|
7
|
+
def print_with(fields, system_less)
|
8
|
+
extend Hirb::Console
|
9
|
+
table self, :fields => fields,
|
10
|
+
:vertical => true,
|
11
|
+
:headers => HEADERS,
|
12
|
+
:system_less => system_less
|
13
|
+
end
|
14
|
+
|
15
|
+
# By default reviews sorted by usefulness. We can reverse it to sort by ascending
|
16
|
+
# For others fields we sorting by comparing each element of Array
|
17
|
+
def sort_with!(field, direction)
|
18
|
+
self if 'usefulness' == field && 'desc' == direction
|
19
|
+
self.reverse! if 'usefulness' == field && 'asc' == direction
|
20
|
+
if 'asc' == direction
|
21
|
+
self.sort! { |review1, review2| review1[field] <=> review2[field]}
|
22
|
+
elsif 'desc' == direction
|
23
|
+
self.sort! { |review1, review2| review2[field] <=> review1[field]}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Parses all 'date_created' fields to DateTime object
|
28
|
+
def parse_date_time
|
29
|
+
self.each do |review|
|
30
|
+
review['date_created'] = DateTime.parse(review['date_created'])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Replace each review's rating into some symbols
|
35
|
+
# Usage: array.replace_rating_with("★", "☆")
|
36
|
+
def replace_rating_with(up, empty)
|
37
|
+
self.each do |review|
|
38
|
+
review['rating'] = up * review['rating'] + empty * (5 - review['rating'])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'hirb'
|
2
|
+
|
3
|
+
class Hirb::Helpers::VerticalTable < Hirb::Helpers::Table
|
4
|
+
# Method should return an Array
|
5
|
+
def render_rows
|
6
|
+
i = 0
|
7
|
+
rows = ''
|
8
|
+
longest_header = Hirb::String.size @headers.values.sort_by {|e| Hirb::String.size(e) }.last
|
9
|
+
delimiter = "-" * longest_header
|
10
|
+
@rows.map do |row|
|
11
|
+
row = "\n#{delimiter} #{i+1}. review #{delimiter}\n" +
|
12
|
+
@fields.map {|f|
|
13
|
+
if !@options[:hide_empty] || (@options[:hide_empty] && !row[f].empty?)
|
14
|
+
"#{Hirb::String.rjust(@headers[f], longest_header)}: #{row[f]}"
|
15
|
+
else
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
}.compact.join("\n")
|
19
|
+
i+= 1
|
20
|
+
rows += row
|
21
|
+
end
|
22
|
+
rows = "#{@rows.size} review(s)" + rows
|
23
|
+
if @options[:system_less] && system("which less 2>&1 > /dev/null")
|
24
|
+
IO.popen('less', 'w') { |io| io.puts rows }
|
25
|
+
[]
|
26
|
+
else
|
27
|
+
[rows]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/previews.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "previews/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "previews"
|
7
|
+
s.version = Previews::VERSION
|
8
|
+
s.authors = ["Ivan K"]
|
9
|
+
s.email = ["divout@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Read user reviews of linux packages.}
|
12
|
+
s.description = %q{previews lets you read user reviews of linux packages from your console.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "previews"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency('rdoc')
|
22
|
+
s.add_development_dependency('aruba')
|
23
|
+
s.add_development_dependency('rake','~> 0.9.2')
|
24
|
+
s.add_dependency('methadone')
|
25
|
+
s.add_dependency('hirb', '~> 0.6.0')
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: previews
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ivan K
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-18 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rdoc
|
16
|
+
requirement: &16007560 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *16007560
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: aruba
|
27
|
+
requirement: &16007020 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *16007020
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rake
|
38
|
+
requirement: &16005920 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.9.2
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *16005920
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: methadone
|
49
|
+
requirement: &16005460 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *16005460
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: hirb
|
60
|
+
requirement: &16004920 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.6.0
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *16004920
|
69
|
+
description: previews lets you read user reviews of linux packages from your console.
|
70
|
+
email:
|
71
|
+
- divout@gmail.com
|
72
|
+
executables:
|
73
|
+
- previews
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- .gitignore
|
78
|
+
- Gemfile
|
79
|
+
- MIT-LICENSE
|
80
|
+
- README.md
|
81
|
+
- Rakefile
|
82
|
+
- bin/previews
|
83
|
+
- features/previews.feature
|
84
|
+
- features/step_definitions/previews_steps.rb
|
85
|
+
- features/support/env.rb
|
86
|
+
- lib/previews.rb
|
87
|
+
- lib/previews/array.rb
|
88
|
+
- lib/previews/hirb_vertical_table.rb
|
89
|
+
- lib/previews/version.rb
|
90
|
+
- previews.gemspec
|
91
|
+
- test/tc_something.rb
|
92
|
+
homepage: ''
|
93
|
+
licenses: []
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
requirements: []
|
111
|
+
rubyforge_project: previews
|
112
|
+
rubygems_version: 1.8.10
|
113
|
+
signing_key:
|
114
|
+
specification_version: 3
|
115
|
+
summary: Read user reviews of linux packages.
|
116
|
+
test_files: []
|