mhennemeyer-rwriteboard 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,46 @@
1
+ = RWriteboard
2
+
3
+ by Matthias Hennemeyer <mhennemeyer@gmail.com>
4
+
5
+ == Introduction
6
+
7
+ Fetch a writeboard by path and password.
8
+
9
+
10
+
11
+ == Usage
12
+
13
+ require 'rwriteboard'
14
+
15
+ Create a local reference to a writeboard:
16
+ Writeboard.create({
17
+ :name => "some name",
18
+ :path => "/sadfasdfasdf", # the custom part of the url
19
+ :password => "123123"
20
+ })
21
+
22
+ Use it to read the title and the body of the writeboard:
23
+ title = ""
24
+ body = ""
25
+ Writeboard.find(:name => "some name") do |writeboard|
26
+ writeboard.get
27
+ title = writeboard.title
28
+ body = writeboard.body
29
+ end
30
+
31
+ Use it to change the title of the writeboard:
32
+ Writeboard.find(:name => "some name") do |writeboard|
33
+ writeboard.title = "some other title"
34
+ writeboard.post_without_revision
35
+ end
36
+
37
+
38
+
39
+
40
+
41
+ == INSTALL:
42
+
43
+ $ sudo gem install mhennmemeyer-rwriteboard
44
+
45
+
46
+ Copyright (c) 2008 Matthias Hennemeyer, released under the MIT license
@@ -0,0 +1,96 @@
1
+ require 'rubygems'
2
+ require 'net/http'
3
+
4
+ class Writeboard
5
+
6
+ attr_accessor :password,
7
+ :path,
8
+ :session,
9
+ :cookie,
10
+ :http,
11
+ :name,
12
+ :header,
13
+ :title,
14
+ :body
15
+
16
+ @@writeboards ||= []
17
+
18
+ def @@writeboards.find(hash)
19
+ memo = self
20
+ hash.each do |k,v|
21
+ memo = memo.detect {|wb| wb.send(k.to_sym) == v}
22
+ end
23
+ memo
24
+ end
25
+
26
+ def initialize(hash)
27
+ self.password = hash[:password]
28
+ self.path = hash[:path]
29
+ self.name = hash[:name]
30
+ end
31
+
32
+ def get
33
+ response_body = self.http.get(self.path, self.cookie).body
34
+ self.title = response_body.scan(%r{<div class="writeboardtitle">(.*?)</div>}m).to_s.strip_tags
35
+ self.body = response_body.scan(%r{<div class="writeboardbody">(.*?)</div>}m).to_s.strip_tags
36
+ self
37
+ end
38
+
39
+ def logged_in
40
+ Net::HTTP.start('123.writeboard.com') do |http|
41
+ login_path = self.path + "/login"
42
+ self.header = "password=#{self.password}"
43
+ login_response = http.post(login_path, self.header)
44
+ cookie = {'Cookie' => login_response.response['Set-Cookie']}
45
+ self.http = http
46
+ self.cookie = cookie
47
+ self.session = cookie['Cookie'][1]
48
+ yield self
49
+ end
50
+ end
51
+
52
+ def post_without_revision(hash={})
53
+ raise "There is no connection" unless self.http
54
+ set_attributes_from_hash(hash)
55
+ self.get unless self.title && self.body
56
+ postdata = "minor_edit=1" + "&" +
57
+ "commit=Save over the current version" + "&" +
58
+ "version[body]=#{self.body.gsub(%r(\\n), "<br />")}" + "&" +
59
+ "version[title]=#{self.title}"
60
+ self.http.post(self.path + "/v/create", postdata, self.cookie)
61
+ end
62
+
63
+ def set_attributes_from_hash(hash)
64
+ hash.each {|k,v| self.send(k.to_s.concat("=").to_sym, v)}
65
+ end
66
+
67
+ def self.create(hash)
68
+ password = hash[:password]
69
+ path = hash[:path] || hash[:id] || hash[:address] || ""
70
+ path = "/" + path unless path =~ /^\//
71
+ name = hash[:name] || self.count + 1
72
+ wb = self.new(:password => password, :path => path, :name => name)
73
+ @@writeboards << wb
74
+ if block_given?
75
+ wb.logged_in do |_wb|
76
+ yield _wb
77
+ end
78
+ end
79
+ wb
80
+ end
81
+
82
+ def self.find(hash)
83
+ writeboard = self.writeboards.find(hash)
84
+ writeboard.logged_in do |wb|
85
+ yield wb
86
+ end
87
+ end
88
+
89
+ def self.count
90
+ @@writeboards.size
91
+ end
92
+
93
+ def self.writeboards
94
+ @@writeboards
95
+ end
96
+ end
@@ -0,0 +1,20 @@
1
+ String.module_eval do
2
+ def compact
3
+ self.gsub(%r(([ \t\f\r])+), " ").gsub(%r(\n+),"\n").gsub(%r(^\s+), "").gsub(%r(\s+$),"")
4
+ end
5
+
6
+ def cut_runner_output
7
+ self.split(%r(### RUNNER OUTPUT ###)).first.chomp
8
+ end
9
+
10
+ def replace_newlines
11
+ self.gsub(%r(<br />), '\n')
12
+ end
13
+
14
+ def remove_tags
15
+ self.gsub(%r(<[^>]*>), "")
16
+ end
17
+ def strip_tags
18
+ self.replace_newlines.remove_tags.compact
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "rwriteboard"
3
+ s.version = "0.1.0"
4
+ s.date = "2008-11-15"
5
+ s.summary = "Interface to writeboard"
6
+ s.email = "mhennemeyer@gmail.com"
7
+ s.homepage = "http://github.com/mhennemeyer/rwriteboard"
8
+ s.description = "RWriteboard is used to fetch and post writeboard contents"
9
+ s.has_rdoc = false
10
+ s.authors = ["Matthias Hennemeyer"]
11
+ s.files = [
12
+ "README",
13
+ "rwriteboard.gemspec",
14
+ "lib/rwriteboard.rb",
15
+ "lib/string_extension.rb"]
16
+ s.test_files = ["spec/rwriteboard_spec.rb",
17
+ "spec/string_extension_spec.rb"]
18
+ end
@@ -0,0 +1,80 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ def password
4
+ "HG3pJX7N0z7sY12"
5
+ end
6
+ def path
7
+ "/e97e5d84cd8d39ca6"
8
+ end
9
+
10
+ describe Writeboard do
11
+ before(:all) do
12
+ Writeboard.create({
13
+ :name => "Feature1",
14
+ :password => password,
15
+ :path => path
16
+ })
17
+ end
18
+
19
+ describe ".create(hash)" do
20
+ it "should add the writeboard with name, password and address to the @@writeboards collection" do
21
+ Writeboard.writeboards.detect {|wb| wb.name == "Feature1"}.password.should eql(password)
22
+ end
23
+ it "should yield the logged in writeboard if block given" do
24
+ Writeboard.create({
25
+ :name => "Feature1",
26
+ :password => password,
27
+ :path => path
28
+ }) do |wb|
29
+ wb.password.should eql(password)
30
+ end
31
+ end
32
+ end
33
+
34
+ describe ".find(hash)" do
35
+ it "should yield the writeboard, identified by hash and logged in" do
36
+ Writeboard.find :name => "Feature1" do |wb|
37
+ wb.password.should eql(password)
38
+ wb.path.should eql(path)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "#get" do
44
+ it "should get the writeboard" do
45
+ Writeboard.find :name => "Feature1" do |wb|
46
+ wb.get.password.should eql(password)
47
+ wb.get.path.should eql(path)
48
+ end
49
+ end
50
+ it "should set the writeboards title" do
51
+ Writeboard.find :name => "Feature1" do |wb|
52
+ wb.get.title.should eql("first writeboard")
53
+ end
54
+ end
55
+ it "should set the writeboards body" do
56
+ Writeboard.find :name => "Feature1" do |wb|
57
+ wb.get.body.should eql('Feature: FeatureTitle\n In order to gain profits')
58
+ end
59
+ end
60
+ end
61
+
62
+ describe "post_without_revision" do
63
+ it "should post to the writeboard and make no new revision" do
64
+ Writeboard.find :name => "Feature1" do |wb|
65
+ wb.post_without_revision(:body => 'Feature: FeatureTitle\n In order to gain profits')
66
+ wb.get.body.should eql('Feature: FeatureTitle\n In order to gain profits')
67
+ end
68
+ end
69
+
70
+ it "should get what it posts" do
71
+ Writeboard.find :name => "Feature1" do |wb|
72
+ string = 'Feature: FeatureTitle\n In order to gain profits'
73
+ wb.post_without_revision(:body => string)
74
+ wb.get.body.should eql(string)
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "String" do
4
+
5
+ describe "#compact" do
6
+ it "should replace any whitespace character except newline with a single space" do
7
+ string = " sdlkj sdf \t sdfsdf \t \t \t"
8
+ string.compact.should eql("sdlkj sdf sdfsdf")
9
+ end
10
+
11
+ it "should replace multiple newlines with one newline" do
12
+ string = " \n sdlkj sdf \t \n \n sdfsdf \n \n \t"
13
+ string.compact.should eql("sdlkj sdf\nsdfsdf")
14
+ end
15
+ end
16
+
17
+ describe "#remove_tags" do
18
+ it "should remove all tags from a string" do
19
+ html = "<sdf>lksjdlkjasd<kjsadf/><sdf>"
20
+ html.remove_tags.should eql("lksjdlkjasd")
21
+ end
22
+ end
23
+
24
+ describe "#replace_newlines" do
25
+ it "should replace all <br /> tags with '\\n'" do
26
+ html = "Hello<br />"
27
+ html.replace_newlines.should eql('Hello\n')
28
+ end
29
+ end
30
+
31
+ describe "#cut_runner_output" do
32
+ it "should cut away ### RUNNER OUTPUT ### and any subsequent characters" do
33
+ html = '\nFeature: FeatureTitle\nIn order to gain profits\n
34
+ Scenario: On the new calculation Page\nGiven I am on the new calculation page\n
35
+ ### RUNNER OUTPUT ###\nPending Scenarios:\n1) FeatureTitle\nIn order to gain profits (On the new calculation Page\n
36
+ Given I am on the new calculation page)\n'
37
+
38
+ html.cut_runner_output.should eql('\nFeature: FeatureTitle\nIn order to gain profits\n
39
+ Scenario: On the new calculation Page\nGiven I am on the new calculation page\n')
40
+ end
41
+ end
42
+
43
+ describe "#strip_tags" do
44
+ it "should remove all tags except <br /> from a string" do
45
+ html = <<-END
46
+ <div class="standard_form">
47
+ <h3> Sorry, this commit is taking too long to generate. </h3>
48
+ <p>
49
+ View it locally:<br /> <code>$ git show 9a3a2ef</code>
50
+
51
+
52
+ </p>
53
+ </div>
54
+ END
55
+ string = "Sorry, this commit is taking too long to generate. " +
56
+ "View it locally:\n$ git show 9a3a2ef"
57
+ string.strip_tags.should eql(string)
58
+ end
59
+ end
60
+ end
61
+
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mhennemeyer-rwriteboard
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Matthias Hennemeyer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-11-15 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: RWriteboard is used to fetch and post writeboard contents
17
+ email: mhennemeyer@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README
26
+ - rwriteboard.gemspec
27
+ - lib/rwriteboard.rb
28
+ - lib/string_extension.rb
29
+ has_rdoc: false
30
+ homepage: http://github.com/mhennemeyer/rwriteboard
31
+ post_install_message:
32
+ rdoc_options: []
33
+
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "0"
41
+ version:
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ requirements: []
49
+
50
+ rubyforge_project:
51
+ rubygems_version: 1.2.0
52
+ signing_key:
53
+ specification_version: 2
54
+ summary: Interface to writeboard
55
+ test_files:
56
+ - spec/rwriteboard_spec.rb
57
+ - spec/string_extension_spec.rb