usaidwat 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9f557c3aa3e4261f4f2c28783728e17c5043fdca
4
+ data.tar.gz: 9fa6307833d5f28c44425e9cd2469b46a67229d4
5
+ SHA512:
6
+ metadata.gz: bcda2502165ff5d8c73dbfa11ae4c593856c874514b88ae36c6c651bd568a8e1afcaabc746f7e74639f060a7b3f66bb840484a7544f71ae57a021dac8d4f4126
7
+ data.tar.gz: 4d2f7b4c5e44fd2025de35c64c6d68dd3fe40b8a22fe23a9a15bcb234442a1f672424630594dc15173997e417b243b80796b3461eea97c0caceb0134644fff2c
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in usaidwat.gemspec
4
4
  gemspec
5
+
6
+ group :optional do
7
+ gem 'nyan-cat-formatter'
8
+ end
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Michael Dippery
1
+ Copyright (c) 2012-2014 Michael Dippery
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -3,4 +3,12 @@ require "bundler/gem_tasks"
3
3
  desc "Clean built products"
4
4
  task :clean do
5
5
  rm_rf "pkg", :verbose => true
6
+ rm Dir.glob("*.gem"), :verbose => true
7
+ end
8
+
9
+ namespace :test do
10
+ desc "Run the fake web service"
11
+ task :server do
12
+ system "bundle exec ruby features/server/reddit.rb"
13
+ end
6
14
  end
@@ -40,19 +40,19 @@ Feature: Browse comments
40
40
  When I run `usaidwat -t mipadi`
41
41
  Then it should pass with:
42
42
  """
43
- apple 6
44
- AskReddit 61
45
- battlefield3 2
46
- books 2
47
- django 1
48
- Games 1
49
- nyc 1
50
- personalfinance 1
51
- photography 1
52
- programming 20
53
- redditcasual 1
54
- wikipedia 1
55
- worldnews 2
43
+ apple 6
44
+ AskReddit 61
45
+ battlefield3 2
46
+ books 2
47
+ django 1
48
+ Games 1
49
+ nyc 1
50
+ personalfinance 1
51
+ photography 1
52
+ programming 20
53
+ redditcasual 1
54
+ wikipedia 1
55
+ worldnews 2
56
56
  """
57
57
 
58
58
  Scenario: Tally comments when user has no comments
@@ -1,40 +1,46 @@
1
1
  module USaidWat
2
2
  class << self
3
3
  def application
4
- @application ||= USaidWat::Application.new
4
+ client = ENV['USAIDWAT_ENV'] == 'cucumber' ? USaidWat::Client::TestRedditor : USaidWat::Client::Redditor
5
+ @application ||= USaidWat::Application.new(client)
5
6
  end
6
7
  end
7
-
8
+
8
9
  class Application
10
+ def initialize(client)
11
+ @client = client
12
+ end
13
+
9
14
  def run(argv)
10
- @opts, args = handle_arguments(argv)
11
- @redditor = USaidWat::Client::Redditor.new(args.first)
12
- return tally_comments if @opts[:tally]
15
+ trap("INT") { puts; exit 0 }
16
+ opts, args = handle_arguments(argv)
17
+ @redditor = @client.new(args.first)
18
+ return tally_comments if opts[:tally]
13
19
  return list_comments_for_subreddit(args[1]) if args.length == 2
14
20
  return list_all_comments
15
21
  end
16
-
22
+
17
23
  def usage(code=0)
18
24
  puts "Usage: usaidwat [-t] <user> [<subreddit>]"
19
25
  exit code
20
26
  end
21
-
27
+
22
28
  def version(code=0)
23
29
  puts "usaidwat v#{USaidWat::VERSION}"
24
30
  exit 0
25
31
  end
26
-
32
+
27
33
  def quit(message, code=0)
28
34
  puts message
29
35
  exit code
30
36
  end
31
-
37
+
32
38
  def list_all_comments
33
39
  quit "#{@redditor.username} has no comments." if @redditor.comments.empty?
34
40
  formatter = USaidWat::CLI::CommentFormatter.new
35
41
  @redditor.comments.each { |c| print formatter.format(c) }
36
42
  end
37
-
43
+
38
44
  def list_comments_for_subreddit(subreddit)
39
45
  comments = @redditor.comments
40
46
  comments = comments.reject { |c| c.subreddit != subreddit }
@@ -42,7 +48,7 @@ module USaidWat
42
48
  formatter = USaidWat::CLI::CommentFormatter.new
43
49
  comments.each { |c| print formatter.format(c) }
44
50
  end
45
-
51
+
46
52
  def tally_comments
47
53
  quit "#{@redditor.username} has no comments." if @redditor.comments.empty?
48
54
  # Unfortunately Snooby cannot return comments for a specific
@@ -58,11 +64,11 @@ module USaidWat
58
64
  subreddits = buckets.keys.sort { |a,b| a.downcase <=> b.downcase }
59
65
  subreddits.each do |subreddit|
60
66
  tally = buckets[subreddit]
61
- printf "%-*s %s\n", longest_subreddit, subreddit, tally
67
+ printf "%-*s %3d\n", longest_subreddit, subreddit, tally
62
68
  end
63
69
  exit 0
64
70
  end
65
-
71
+
66
72
  private
67
73
  def handle_arguments(argv)
68
74
  usage(1) if argv.length == 0
@@ -1,32 +1,40 @@
1
1
  require 'snooby'
2
+ require 'usaidwat/service'
2
3
 
3
4
  module USaidWat
4
5
  module Client
5
6
  class ReachabilityError < RuntimeError; end
6
-
7
- class Redditor
7
+
8
+ class BaseRedditor
8
9
  attr_reader :username
9
-
10
+
10
11
  def initialize(username)
11
- enable_test_urls if ENV['USAIDWAT_ENV'] == 'cucumber'
12
12
  @username = username
13
- @service = Snooby::Client.new("usaidwat v#{USaidWat::VERSION}")
14
13
  end
15
-
14
+
16
15
  def comments
17
16
  @service.user(username).comments(100)
18
17
  rescue TypeError
19
18
  raise ReachabilityError, "Reddit unreachable"
20
19
  end
21
-
20
+
22
21
  def to_s
23
22
  "#{username}"
24
23
  end
25
-
26
- private
27
- def enable_test_urls
28
- Snooby::Paths.each { |k,v| Snooby::Paths[k] = v.sub(%r{http://www.reddit.com}, "http://localhost:4567") }
29
- end
24
+ end
25
+
26
+ class Redditor < BaseRedditor
27
+ def initialize(username)
28
+ @service = Snooby::Client.new("usaidwat v#{USaidWat::VERSION}")
29
+ super
30
+ end
31
+ end
32
+
33
+ class TestRedditor < BaseRedditor
34
+ def initialize(username)
35
+ @service = USaidWat::Service::MockService.new
36
+ super
37
+ end
30
38
  end
31
39
  end
32
40
  end
@@ -0,0 +1,34 @@
1
+ module USaidWat
2
+ module Service
3
+ class MockComment
4
+ attr_reader :subreddit, :body, :id, :link_id
5
+
6
+ def initialize(dict)
7
+ data = dict['data']
8
+ @subreddit = data['subreddit']
9
+ @body = data['body']
10
+ @id = data['id']
11
+ @link_id = data['link_id']
12
+ end
13
+ end
14
+
15
+ class MockUser
16
+ def initialize(username)
17
+ @username = username
18
+ end
19
+
20
+ def comments(n)
21
+ path = File.join(File.dirname(__FILE__), "..", "..", "features", "fixtures", "#{@username}.json")
22
+ json = IO.read(path)
23
+ json = JSON.parse(json)
24
+ json['data']['children'].map { |d| MockComment.new(d) }
25
+ end
26
+ end
27
+
28
+ class MockService
29
+ def user(username)
30
+ MockUser.new(username)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module USaidWat
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'usaidwat'
2
+ require 'usaidwat/service'
2
3
  require 'webmock/rspec'
3
4
 
4
5
 
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ module USaidWat
4
+ module Service
5
+ describe MockService do
6
+ let (:service) { MockService.new }
7
+
8
+ describe "#user" do
9
+ it "returns a mock user" do
10
+ service.user("mipadi").should respond_to(:comments)
11
+ end
12
+ end
13
+ end
14
+
15
+ describe MockUser do
16
+ let (:user) { MockUser.new("mipadi") }
17
+
18
+ describe "#comments" do
19
+ it "should return an array of comments" do
20
+ user.comments(100).should respond_to(:count)
21
+ user.comments(100).should respond_to(:reject)
22
+ user.comments(100).should respond_to(:empty?)
23
+ user.comments(100).should respond_to(:each)
24
+ user.comments(100).count.should == 100
25
+ end
26
+ end
27
+ end
28
+
29
+ describe MockComment do
30
+ let (:comment) { MockUser.new("mipadi").comments(100).first }
31
+
32
+ describe "#subreddit" do
33
+ it "should return a string denoting what subreddit it belongs to" do
34
+ comment.subreddit.should == "wikipedia"
35
+ end
36
+ end
37
+
38
+ describe "#body" do
39
+ it "should return the comment's body" do
40
+ comment.body.should == "Yep. My first experience with a Heisenbug occurred in a C++ program, and disappeared when I tried to print a variable with printf (only to reappear when that call was removed)."
41
+ end
42
+ end
43
+
44
+ describe "#id" do
45
+ it "should return an ID" do
46
+ comment.id.should == "c79peed"
47
+ end
48
+ end
49
+
50
+ describe "#link_id" do
51
+ it "should return a link ID" do
52
+ comment.link_id.should == "t3_142t4w"
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
data/usaidwat.gemspec CHANGED
@@ -24,5 +24,4 @@ Gem::Specification.new do |gem|
24
24
  gem.add_development_dependency('cucumber', '~> 1.2.1')
25
25
  gem.add_development_dependency('aruba', '~> 0.5.1')
26
26
  gem.add_development_dependency('webmock', '~> 1.9.0')
27
- gem.add_development_dependency('sinatra', '~> 1.3.1')
28
27
  end
metadata CHANGED
@@ -1,128 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: usaidwat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
5
- prerelease:
4
+ version: 0.1.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Michael Dippery
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-25 00:00:00.000000000 Z
11
+ date: 2014-04-18 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: snooby
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: 0.1.5
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: 0.1.5
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rainbow
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: 1.1.4
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: 1.1.4
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
47
  version: 2.12.0
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
54
  version: 2.12.0
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: cucumber
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
61
  version: 1.2.1
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
68
  version: 1.2.1
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: aruba
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ~>
73
+ - - "~>"
84
74
  - !ruby/object:Gem::Version
85
75
  version: 0.5.1
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ~>
80
+ - - "~>"
92
81
  - !ruby/object:Gem::Version
93
82
  version: 0.5.1
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: webmock
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ~>
87
+ - - "~>"
100
88
  - !ruby/object:Gem::Version
101
89
  version: 1.9.0
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ~>
94
+ - - "~>"
108
95
  - !ruby/object:Gem::Version
109
96
  version: 1.9.0
110
- - !ruby/object:Gem::Dependency
111
- name: sinatra
112
- requirement: !ruby/object:Gem::Requirement
113
- none: false
114
- requirements:
115
- - - ~>
116
- - !ruby/object:Gem::Version
117
- version: 1.3.1
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ~>
124
- - !ruby/object:Gem::Version
125
- version: 1.3.1
126
97
  description: View a user's last 100 Reddit comments, organized by subreddit.
127
98
  email:
128
99
  - michael@monkey-robot.com
@@ -131,7 +102,7 @@ executables:
131
102
  extensions: []
132
103
  extra_rdoc_files: []
133
104
  files:
134
- - .gitignore
105
+ - ".gitignore"
135
106
  - Gemfile
136
107
  - LICENSE.txt
137
108
  - README.textile
@@ -141,50 +112,50 @@ files:
141
112
  - features/fixtures/blank.json
142
113
  - features/fixtures/mipadi.json
143
114
  - features/help.feature
144
- - features/server/reddit.rb
145
115
  - features/step_definitions/reddit_steps.rb
146
116
  - features/support/aruba.rb
147
117
  - lib/usaidwat.rb
148
118
  - lib/usaidwat/application.rb
149
119
  - lib/usaidwat/client.rb
150
120
  - lib/usaidwat/formatter.rb
121
+ - lib/usaidwat/service.rb
151
122
  - lib/usaidwat/version.rb
152
123
  - spec/spec_helper.rb
153
124
  - spec/usaidwat/client_spec.rb
154
125
  - spec/usaidwat/formatter_spec.rb
126
+ - spec/usaidwat/service_spec.rb
155
127
  - usaidwat.gemspec
156
128
  homepage: https://github.com/mdippery/usaidwat
157
129
  licenses: []
130
+ metadata: {}
158
131
  post_install_message:
159
132
  rdoc_options: []
160
133
  require_paths:
161
134
  - lib
162
135
  required_ruby_version: !ruby/object:Gem::Requirement
163
- none: false
164
136
  requirements:
165
- - - ! '>='
137
+ - - ">="
166
138
  - !ruby/object:Gem::Version
167
139
  version: '0'
168
140
  required_rubygems_version: !ruby/object:Gem::Requirement
169
- none: false
170
141
  requirements:
171
- - - ! '>='
142
+ - - ">="
172
143
  - !ruby/object:Gem::Version
173
144
  version: '0'
174
145
  requirements: []
175
146
  rubyforge_project:
176
- rubygems_version: 1.8.24
147
+ rubygems_version: 2.2.2
177
148
  signing_key:
178
- specification_version: 3
149
+ specification_version: 4
179
150
  summary: Answers the age-old question, "Where does a Redditor comment the most?"
180
151
  test_files:
181
152
  - features/browse.feature
182
153
  - features/fixtures/blank.json
183
154
  - features/fixtures/mipadi.json
184
155
  - features/help.feature
185
- - features/server/reddit.rb
186
156
  - features/step_definitions/reddit_steps.rb
187
157
  - features/support/aruba.rb
188
158
  - spec/spec_helper.rb
189
159
  - spec/usaidwat/client_spec.rb
190
160
  - spec/usaidwat/formatter_spec.rb
161
+ - spec/usaidwat/service_spec.rb
@@ -1,14 +0,0 @@
1
- require 'sinatra/base'
2
-
3
- class Reddit < Sinatra::Base
4
- get '/user/*/comments.json' do
5
- user = params[:splat].first
6
- puts user
7
- root = File.expand_path('../../', __FILE__)
8
- json = File.read(File.join(root, 'fixtures', "#{user}.json"))
9
- content_type :json
10
- json
11
- end
12
-
13
- run! if app_file == $0
14
- end