qrush-beardo 0.1.0

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.
@@ -0,0 +1,24 @@
1
+ h1. beardo
2
+
3
+ "Co-ops are run by dirty hippies; dirty hippies have beards; therefore, this app is called beardo."
4
+
5
+ h2. No, seriously.
6
+
7
+ This is a command line interface for "Co-op":http://coopapp.com, since some of us are too cool to use the web interface.
8
+ It started as a "boston.rb":http://bostonrb.org hackfest project, so blame the pizza and beer if there's bugs.
9
+
10
+ h2. Wait, what?
11
+
12
+ It uses "rest-client":http://github.com/adamwiggins/rest-client as a wrapper around the "Co-op API":http://coopapp.com/api.
13
+
14
+ h2. Do I need a beard, too?
15
+
16
+ No, you don't. All you need is a @.beardorc@ in your @HOME@ directory, with the following info (in YAML format):
17
+
18
+ <pre>
19
+ email: dirty@hippie.com
20
+ password: drumcircle
21
+ group: 422
22
+ </pre>
23
+
24
+ Then, run @coop "your-message-here"@ and your status on Co-op should be updated.
@@ -0,0 +1,30 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'spec/rake/spectask'
4
+
5
+ desc "Run all specs"
6
+ Spec::Rake::SpecTask.new('spec') do |t|
7
+ t.spec_opts = ['--colour']
8
+ t.spec_files = FileList['spec/*_spec.rb']
9
+ end
10
+
11
+ begin
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |s|
14
+ s.name = "beardo"
15
+ s.summary = "A command line client for Harvest Co-op"
16
+ s.email = "nick@quaran.to"
17
+ s.homepage = "http://github.com/qrush/beardo"
18
+ s.description = "Communicate with co-workers through the best interface available: your terminal"
19
+ s.authors = ["Nick Quaranto", "Mike Burns"]
20
+ s.add_dependency('adamwiggins-rest-client', '>= 0.9.2')
21
+ s.executables = ["bd", "coop"]
22
+ s.files = FileList["[A-Z]*", "{bin,lib,spec}/**/*"]
23
+ end
24
+ rescue LoadError
25
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
26
+ end
27
+
28
+
29
+ task :default => :spec
30
+
data/TODO ADDED
@@ -0,0 +1,21 @@
1
+ With config file:
2
+ [ ] I post my status to Co-op when I run beardo status with a status
3
+ [ ] I see the status ID when I run beardo status with a status
4
+ [ ] I am prompted for my email, password, and groups with my existing
5
+ email and groups as the default when I run beardo init.
6
+ [ ] With too flexible permissions I am prompted to change the
7
+ permissions when I run beardo init.
8
+ [ ] With too few permission I am prompted to change the permissions
9
+ when I run beardo init.
10
+ [ ] I run beardo status with a status then beardo undo to remove that status.
11
+
12
+ Without config file:
13
+ [ ] I am prompted for my email, password, and groups then my status is
14
+ posted to Co-op when I run beardo status with a status.
15
+ [ ] I am shown all commands when I run beardo help.
16
+ [ ] I am prompted for my email, password, and groups when I run beardo init.
17
+
18
+ Random:
19
+ [ ] I am shown help text when I run beardo status without a status.
20
+
21
+
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 0
3
+ :minor: 1
4
+ :patch: 0
data/bin/bd ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
+ require 'beardo'
5
+
6
+ help = <<HELP
7
+ Beardo is a simple command line interface to Co-op (http://coopapp.com)
8
+
9
+ Basic command line usage:
10
+ bd "your status message"
11
+ HELP
12
+
13
+ status = ""
14
+
15
+ opts = OptionParser.new do |parser|
16
+ parser.banner = help
17
+ parser.on("--status", "Set your co-op status") do |s|
18
+ status = ARGV.first
19
+ end
20
+ end
21
+
22
+ opts.parse!
23
+
24
+ Beardo.run(status)
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ARGV.unshift "--status"
4
+ load File.join(File.dirname(__FILE__), "bd")
@@ -0,0 +1,40 @@
1
+ require 'rubygems'
2
+ require 'yaml'
3
+ require 'rest_client'
4
+ require 'optparse'
5
+
6
+ class Beardo
7
+ attr_accessor :group, :email, :password
8
+
9
+ def initialize(config)
10
+ self.group = config['group']
11
+ self.email = config['email']
12
+ self.password = config['password']
13
+ end
14
+
15
+ def post(message)
16
+ resource = RestClient::Resource.new("http://coopapp.com", {
17
+ :user => self.email, :password => self.password
18
+ })
19
+ resource["groups/#{self.group}/statuses"].post("<status>#{message}</status>", :content_type => 'application/xml')
20
+ end
21
+
22
+ class << self
23
+ def config_path
24
+ ENV['HOME']
25
+ end
26
+
27
+ def config_file
28
+ File.join(config_path, '.beardorc')
29
+ end
30
+
31
+ def run(message)
32
+ beardo = Beardo.new(read_config)
33
+ beardo.post(message)
34
+ end
35
+
36
+ def read_config
37
+ YAML.load_file(config_file)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,96 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'beardo'
4
+
5
+ def create_config
6
+ @config = { 'email' => 'ralph@robotsinc.com',
7
+ 'password' => 'robot',
8
+ 'group' => 1337 }
9
+ end
10
+
11
+ describe "beardo command line interface" do
12
+ describe "running from the executable" do
13
+ before do
14
+ create_config
15
+ @beardo = Object.new
16
+ stub(Beardo).new { @beardo }
17
+ stub(Beardo).read_config { @config }
18
+ stub(@beardo).post { true }
19
+ @rest_client = Object.new
20
+ stub(RestClient::Resource).new { @rest_client }
21
+ stub(@rest_client).post { true }
22
+ end
23
+
24
+ it "should read in configuration options" do
25
+ mock(Beardo).read_config { @config }
26
+ Beardo.run('')
27
+ end
28
+
29
+ it "should create a new instance of a Beardo on .run" do
30
+ mock(Beardo).new(@config) { @beardo }
31
+ Beardo.run('')
32
+ end
33
+
34
+ it "should post to coop on .run" do
35
+ @beardo = Object.new
36
+ mock(@beardo).post('work sucks') { true }
37
+ Beardo.run('work sucks')
38
+ end
39
+
40
+ end
41
+
42
+ it "should default to the home directory for config_path" do
43
+ Beardo.config_path.should == ENV['HOME']
44
+ end
45
+
46
+ it "should default to .beardorc for config_file" do
47
+ Beardo.config_file.should =~ /.beardorc$/
48
+ end
49
+
50
+ it "should read config from YAML" do
51
+ @config_file = "file"
52
+ stub(Beardo).config_file { @config_file }
53
+ mock(YAML).load_file(@config_file)
54
+ Beardo.read_config
55
+ end
56
+
57
+ describe "temporary directory exists" do
58
+ before do
59
+ @config_path = File.join('/', 'tmp', 'beardo')
60
+ begin
61
+ stub(Beardo).config_path { @config_path }
62
+ stub(Beardo).config_file { File.join(@config_path, '.beardorc') }
63
+ Dir.mkdir(@config_path)
64
+ rescue Errno::EEXIST
65
+ end
66
+ end
67
+
68
+ it "should produce correct configs when send .read_config" do
69
+ File.open(Beardo.config_file, 'w') do |f|
70
+ f.puts(@config.to_yaml)
71
+ end
72
+ Beardo.read_config.should == @config
73
+ end
74
+
75
+ after do
76
+ FileUtils.rm_rf(@config_path)
77
+ end
78
+ end
79
+ end
80
+
81
+ describe "instance methods" do
82
+ before do
83
+ create_config
84
+ @rest_client = Object.new
85
+ end
86
+
87
+ it "should send the message to Coop on #post" do
88
+ mock(@rest_client)["groups/#{@config['group']}/statuses"].stub!.post("<status>f this</status>", :content_type => "application/xml")
89
+ mock(RestClient::Resource).
90
+ new("http://coopapp.com",
91
+ {:user => @config['email'],
92
+ :password => @config['password']}) { @rest_client }
93
+ @beardo = Beardo.new(@config)
94
+ @beardo.post('f this')
95
+ end
96
+ end
@@ -0,0 +1,44 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'bin')
3
+
4
+ describe "the beardo executable" do
5
+ before do
6
+ ARGV.clear
7
+ stub(Beardo).run("") { true }
8
+ end
9
+
10
+ it "should take in some arguments" do
11
+ mock(Beardo).run("") { true }
12
+ load "bd"
13
+ end
14
+
15
+ it "should parse options with optparse" do
16
+ @args = []
17
+ @opts = Object.new
18
+ stub(OptionParser).new { @opts }
19
+ mock(@opts).parse! { true }
20
+ load "bd"
21
+ end
22
+
23
+ it "should parse --status properly" do
24
+ @status = "work sucks"
25
+ ARGV << "--status"
26
+ ARGV << @status
27
+ mock(Beardo).run(@status) { true }
28
+ load "bd"
29
+ end
30
+ end
31
+
32
+ describe "the coop executable" do
33
+ before do
34
+ ARGV.clear
35
+ end
36
+
37
+ it "should pipe requests into bd" do
38
+ @status = "makin' some copies"
39
+ ARGV << @status
40
+ mock(Beardo).run(@status)
41
+ load "coop"
42
+ end
43
+
44
+ end
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+ require 'redgreen'
4
+ require 'rr'
5
+ require 'fileutils'
6
+
7
+ Spec::Runner.configure do |config|
8
+ config.mock_with :rr
9
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qrush-beardo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nick Quaranto
8
+ - Mike Burns
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-04-08 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: adamwiggins-rest-client
18
+ type: :runtime
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 0.9.2
25
+ version:
26
+ description: "Communicate with co-workers through the best interface available: your terminal"
27
+ email: nick@quaran.to
28
+ executables:
29
+ - bd
30
+ - coop
31
+ extensions: []
32
+
33
+ extra_rdoc_files:
34
+ - README.textile
35
+ files:
36
+ - Rakefile
37
+ - README.textile
38
+ - TODO
39
+ - VERSION.yml
40
+ - bin/bd
41
+ - bin/coop
42
+ - lib/beardo.rb
43
+ - spec/beardo_spec.rb
44
+ - spec/executable_spec.rb
45
+ - spec/spec_helper.rb
46
+ has_rdoc: true
47
+ homepage: http://github.com/qrush/beardo
48
+ post_install_message:
49
+ rdoc_options:
50
+ - --inline-source
51
+ - --charset=UTF-8
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ requirements: []
67
+
68
+ rubyforge_project:
69
+ rubygems_version: 1.2.0
70
+ signing_key:
71
+ specification_version: 2
72
+ summary: A command line client for Harvest Co-op
73
+ test_files: []
74
+