confluencer 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.4.3
data/confluencer.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{confluencer}
8
- s.version = "0.4.2"
8
+ s.version = "0.4.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gabor Ratky"]
12
- s.date = %q{2010-05-13}
12
+ s.date = %q{2010-05-14}
13
13
  s.description = %q{ActiveRecord-like classes to access Confluence through XMLRPC.}
14
14
  s.email = %q{rgabo@rgabostyle.com}
15
15
  s.extra_rdoc_files = [
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
35
35
  "lib/confluence/record.rb",
36
36
  "lib/confluence/session.rb",
37
37
  "lib/confluence/space.rb",
38
+ "lib/confluence/user.rb",
38
39
  "lib/confluencer.rb",
39
40
  "script/console",
40
41
  "script/console_init.rb",
@@ -45,6 +46,7 @@ Gem::Specification.new do |s|
45
46
  "spec/confluence/record_spec.rb",
46
47
  "spec/confluence/session_spec.rb",
47
48
  "spec/confluence/space_spec.rb",
49
+ "spec/confluence/user_spec.rb",
48
50
  "spec/confluencer_spec.rb",
49
51
  "spec/spec.opts",
50
52
  "spec/spec_helper.rb"
@@ -61,6 +63,7 @@ Gem::Specification.new do |s|
61
63
  "spec/confluence/record_spec.rb",
62
64
  "spec/confluence/session_spec.rb",
63
65
  "spec/confluence/space_spec.rb",
66
+ "spec/confluence/user_spec.rb",
64
67
  "spec/confluencer_spec.rb",
65
68
  "spec/spec_helper.rb"
66
69
  ]
@@ -2,13 +2,28 @@ module Confluence
2
2
  class Bookmark < Page
3
3
  attr_accessor :bookmark_url, :description
4
4
 
5
+ BOOKMARK_REGEXP = /\{bookmark.*\}[^\{]*\{bookmark\}/
6
+ BOOKMARK_URL_REGEXP = /\{bookmark:url=([^\}]+)\}/
7
+ DESCRIPTION_REGEXP = /\{bookmark.*\}([^\{]*)\{bookmark\}/
8
+
5
9
  def initialize(hash)
6
- # set and delete bookmark_url and description
10
+ # set and delete bookmark_url and description coming from hash
7
11
  @bookmark_url = hash.delete :bookmark_url
8
12
  @description = hash.delete :description
9
13
 
10
14
  # initialize page
11
15
  super(hash)
16
+
17
+ if content
18
+ # if no bookmark_url from hash, initialize from content
19
+ unless @bookmark_url
20
+ @bookmark_url = content[BOOKMARK_URL_REGEXP, 1]
21
+ @description = content[DESCRIPTION_REGEXP, 1]
22
+ end
23
+
24
+ # remove {bookmark} macro from content
25
+ content.gsub!(BOOKMARK_REGEXP, "")
26
+ end
12
27
  end
13
28
 
14
29
  def [](attr)
@@ -40,11 +55,8 @@ module Confluence
40
55
  def to_hash
41
56
  page_hash = super
42
57
 
43
- if page_hash.key? "content"
44
- page_hash["content"] << "\n" << bookmark_content
45
- else
46
- page_hash["content"] = bookmark_content
47
- end
58
+ page_hash["content"] << "\n" unless page_hash["content"].empty?
59
+ page_hash["content"] << bookmark_content
48
60
 
49
61
  page_hash
50
62
  end
@@ -58,7 +70,7 @@ module Confluence
58
70
  def self.find_criteria(args)
59
71
  result = super(args) || begin
60
72
  if args.key? :space
61
- space = Space.find :space => args[:space]
73
+ space = Space.find :key => args[:space]
62
74
  space.bookmarks
63
75
  end
64
76
  end
@@ -1,10 +1,15 @@
1
1
  module Confluence
2
2
  class Page < Record
3
3
  class Details < Hash
4
+ REGEXP = /\{details:label=([^\}]+)\}([^\{}]*)\{details\}/m
5
+ PAIR_REGEXP = /([^:]+):([^\n]+)/m
6
+
4
7
  attr_reader :label
5
8
 
6
- def initialize(label)
7
- @label = label
9
+ def initialize(args)
10
+ @label = args[:label]
11
+
12
+ parse(args[:content])
8
13
  end
9
14
 
10
15
  def to_s
@@ -12,14 +17,48 @@ module Confluence
12
17
  content = "{details:label=#{label}}\n"
13
18
 
14
19
  each_pair do |key, value|
15
- content << "#{key}=#{value}\n"
20
+ content << "#{key}:#{value}\n"
16
21
  end
17
22
 
18
23
  # end of details macro
19
- content << "{details}"
24
+ content << "{details}\n"
25
+ end
26
+
27
+ private
28
+
29
+ def parse(content)
30
+ if content && content =~ REGEXP
31
+ # match label and the key/value pairs
32
+ @label, pairs = content.match(REGEXP).captures
33
+
34
+ pairs.strip.lines.each do |line|
35
+ if line =~ PAIR_REGEXP
36
+ self[$1.to_sym] = $2.strip
37
+ end
38
+ end
39
+ end
20
40
  end
21
41
  end
22
42
 
43
+ class DetailsCollection < Hash
44
+ def initialize(content)
45
+ if content
46
+ content.gsub!(Details::REGEXP) do |content|
47
+ self[$1.to_sym] = Details.new(:content => content)
48
+ ""
49
+ end
50
+ end
51
+ end
52
+
53
+ def [](key)
54
+ super(key) or self[key] = Details.new(:label => key)
55
+ end
56
+
57
+ def to_s
58
+ values.join("\n")
59
+ end
60
+ end
61
+
23
62
  extend Findable
24
63
 
25
64
  record_attr_accessor :id => :page_id
@@ -29,26 +68,14 @@ module Confluence
29
68
  record_attr_accessor :created, :modified, :version
30
69
  record_attr_accessor :url
31
70
 
71
+ attr_accessor :details
72
+
32
73
  def initialize(hash)
33
74
  super(hash)
34
75
 
35
- @details = []
36
- end
37
-
38
- def details(label = :all)
39
- return @details if label == :all
40
-
41
- unless result = @details.find {|d| d.label == label}
42
- @details << (result = Details.new(label))
43
- end
44
-
45
- result
76
+ @details = DetailsCollection.new(content)
46
77
  end
47
-
48
- def details=(value)
49
- @details = value
50
- end
51
-
78
+
52
79
  def children(klass = self.class)
53
80
  children = client.getChildren(page_id)
54
81
  children.collect { |child| klass.find(:id => child["id"]) } if children
@@ -86,10 +113,10 @@ module Confluence
86
113
  record_hash = super
87
114
 
88
115
  # always include content in hash
89
- record_hash['content'] ||= ''
116
+ record_hash["content"] ||= ""
90
117
 
91
118
  # prepend details sections before content
92
- record_hash['content'].insert(0, details_content + "\n") if details_content
119
+ record_hash["content"].insert(0, details.to_s)
93
120
 
94
121
  # result
95
122
  record_hash
@@ -97,10 +124,6 @@ module Confluence
97
124
 
98
125
  private
99
126
 
100
- def details_content
101
- @details.join("\n") unless @details.empty?
102
- end
103
-
104
127
  def self.find_all
105
128
  raise ArgumentError, "Cannot find all pages, find by id or title instead."
106
129
  end
@@ -26,6 +26,24 @@ module Confluence
26
26
  end
27
27
  end
28
28
 
29
+ def get_page(args)
30
+ args[:parent_title] ||= "Home"
31
+
32
+ # check if page already exists
33
+ find_page(args) or begin
34
+ # page does not exist yet, create it
35
+ page = Confluence::Page.new :space => self.key, :title => args[:title]
36
+
37
+ # look for the parent by title, set parentId if found
38
+ if parent_page = find_page(:title => args[:parent_title])
39
+ page.parent_id = parent_page.page_id
40
+ end
41
+
42
+ # store the page
43
+ page.store
44
+ end
45
+ end
46
+
29
47
  private
30
48
 
31
49
  def self.find_all
@@ -0,0 +1,19 @@
1
+ module Confluence
2
+ class User < Record
3
+ extend Findable
4
+
5
+ record_attr_accessor :name, :fullname, :email, :url
6
+
7
+ private
8
+
9
+ def self.find_all
10
+ client.getActiveUsers(true).collect { |name| User.find :name => name }
11
+ end
12
+
13
+ def self.find_criteria(args)
14
+ if args.key? :name
15
+ User.new(client.getUser(args[:name]))
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/confluencer.rb CHANGED
@@ -11,6 +11,7 @@ require 'confluence/session'
11
11
 
12
12
  require 'confluence/findable'
13
13
  require 'confluence/record'
14
+ require 'confluence/user'
14
15
  require 'confluence/space'
15
16
  require 'confluence/page'
16
17
  require 'confluence/bookmark'
@@ -1,6 +1,8 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
2
 
3
3
  describe Confluence::Bookmark do
4
+ include SessionHelperMethods
5
+
4
6
  it "should initialize bookmark_url and description from hash" do
5
7
  bookmark = Confluence::Bookmark.new :bookmark_url => 'http://github.com/rgabo/confluencer', :description => 'Home sweet home'
6
8
 
@@ -8,6 +10,15 @@ describe Confluence::Bookmark do
8
10
  bookmark.description.should == 'Home sweet home'
9
11
  end
10
12
 
13
+ it "should initialize bookmark_url and descrition from content" do
14
+ bookmark = Confluence::Bookmark.new "content" => "{bookmark:url=http://github.com/rgabo/confluencer}Home sweet home{bookmark}"
15
+
16
+ bookmark.bookmark_url.should == 'http://github.com/rgabo/confluencer'
17
+ bookmark.description.should == 'Home sweet home'
18
+
19
+ bookmark.content.should_not include "bookmark"
20
+ end
21
+
11
22
  it "should get and set bookmark_url and description using #[]" do
12
23
  bookmark = Confluence::Bookmark.new :bookmark_url => 'http://github.com/rgabo/confluencer', :description => 'Home sweet home'
13
24
 
@@ -32,4 +43,11 @@ describe Confluence::Bookmark do
32
43
  bookmark.to_hash.key?('description').should be_false
33
44
  bookmark.to_hash.key?('title').should be_true
34
45
  end
46
+
47
+ it "should find bookmarks by space" do
48
+ new_session do
49
+ bookmarks = Confluence::Bookmark.find :space => "confluencer"
50
+ bookmarks.should_not be_empty
51
+ end
52
+ end
35
53
  end
@@ -1,5 +1,50 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
2
 
3
+ describe Confluence::Page::Details do
4
+ it "should initialize with a label" do
5
+ details = Confluence::Page::Details.new :label => :confluencer
6
+ details.label.should == :confluencer
7
+ end
8
+
9
+ it "should return {details} macro" do
10
+ details = Confluence::Page::Details.new :label => :confluencer
11
+ details[:creator] = "rgabo"
12
+
13
+ details.to_s.should == <<-DETAILS
14
+ {details:label=confluencer}
15
+ creator:rgabo
16
+ {details}
17
+ DETAILS
18
+ end
19
+
20
+ it "should initialize with macro content" do
21
+ details = Confluence::Page::Details.new :content => <<-DETAILS
22
+ {details:label=confluencer}
23
+ creator:rgabo
24
+ {details}
25
+ DETAILS
26
+
27
+ details.label.should == "confluencer"
28
+ details[:creator].should == "rgabo"
29
+ end
30
+ end
31
+
32
+ describe Confluence::Page::DetailsCollection do
33
+ it "should scan content for details" do
34
+ hash = Confluence::Page::DetailsCollection.new <<-CONTENT
35
+ {details:label=confluencer}
36
+ creator:rgabo
37
+ {details}
38
+
39
+ {details:label=ruby}
40
+ creator=matz
41
+ {details}
42
+ CONTENT
43
+
44
+ hash.should include(:confluencer)
45
+ end
46
+ end
47
+
3
48
  describe Confluence::Page do
4
49
  include SessionHelperMethods
5
50
 
@@ -94,27 +139,34 @@ describe Confluence::Page do
94
139
  page = store_test_page
95
140
 
96
141
  # set :creator in {details:label=bender} to 'rgabo'
97
- page.details(:confluencer)[:creator] = 'rgabo'
142
+ page.details[:confluencer][:creator] = 'rgabo'
98
143
 
99
- page.details(:confluencer)[:creator].should == 'rgabo'
144
+ page.details[:confluencer][:creator].should == 'rgabo'
100
145
  end
101
146
 
102
147
  it "should include metadata in content of the page" do
103
148
  page = store_test_page
104
149
 
105
150
  # set :creator in {details:label=bender} to 'rgabo'
106
- page.details(:confluencer)[:creator] = 'rgabo'
151
+ page.details[:confluencer][:creator] = 'rgabo'
107
152
 
108
- page.to_hash['content'].should include("{details:label=confluencer}\ncreator=rgabo\n{details}")
153
+ page.to_hash['content'].should include("{details:label=confluencer}\ncreator:rgabo\n{details}")
109
154
  end
110
155
 
111
156
  it "should copy metadata from one page to another" do
112
157
  page = create_test_page
113
- page.details(:confluencer)[:creator] = 'rgabo'
158
+ page.details[:confluencer][:creator] = 'rgabo'
114
159
 
115
160
  new_page = create_test_page
116
161
  new_page.details = page.details
117
162
 
118
- new_page.details(:confluencer)[:creator].should == 'rgabo'
163
+ new_page.details[:confluencer][:creator].should == 'rgabo'
164
+ end
165
+
166
+ it "should parse metadata from content" do
167
+ page = Confluence::Page.new "content" => "{details:label=confluencer}\ncreator:rgabo\n{details}\nh3. Some other content"
168
+
169
+ page.details[:confluencer][:creator].should == "rgabo"
119
170
  end
120
171
  end
172
+
@@ -46,4 +46,17 @@ describe Confluence::Space do
46
46
  bookmark.remove
47
47
  end
48
48
  end
49
+
50
+ it "should get a page and create if it does not exist" do
51
+ new_session do
52
+ # get page with random name
53
+ random_page = test_space.get_page :title => "RandomPage #{rand(10000)}"
54
+
55
+ random_page.should_not be_nil
56
+ random_page.space == test_space.key
57
+
58
+ # remove random_page afterwards
59
+ random_page.remove
60
+ end
61
+ end
49
62
  end
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
+
3
+ describe Confluence::User do
4
+ include SessionHelperMethods
5
+
6
+ it "should find all users" do
7
+ new_session do
8
+ users = Confluence::User.find :all
9
+ users.should_not be_empty
10
+ end
11
+ end
12
+
13
+ it "should find a user by its name" do
14
+ new_session do
15
+ # find all users
16
+ users = Confluence::User.find :all
17
+
18
+ # find first user by name
19
+ first_user = Confluence::User.find :name => users.first.name
20
+
21
+ first_user.name.should == users.first.name
22
+ end
23
+ end
24
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 4
8
- - 2
9
- version: 0.4.2
8
+ - 3
9
+ version: 0.4.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Gabor Ratky
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-13 00:00:00 +02:00
17
+ date: 2010-05-14 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -73,6 +73,7 @@ files:
73
73
  - lib/confluence/record.rb
74
74
  - lib/confluence/session.rb
75
75
  - lib/confluence/space.rb
76
+ - lib/confluence/user.rb
76
77
  - lib/confluencer.rb
77
78
  - script/console
78
79
  - script/console_init.rb
@@ -83,6 +84,7 @@ files:
83
84
  - spec/confluence/record_spec.rb
84
85
  - spec/confluence/session_spec.rb
85
86
  - spec/confluence/space_spec.rb
87
+ - spec/confluence/user_spec.rb
86
88
  - spec/confluencer_spec.rb
87
89
  - spec/spec.opts
88
90
  - spec/spec_helper.rb
@@ -123,5 +125,6 @@ test_files:
123
125
  - spec/confluence/record_spec.rb
124
126
  - spec/confluence/session_spec.rb
125
127
  - spec/confluence/space_spec.rb
128
+ - spec/confluence/user_spec.rb
126
129
  - spec/confluencer_spec.rb
127
130
  - spec/spec_helper.rb