confuddle 0.0.1
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 +18 -0
- data/.passwd_to_unfuddle.example.yml +7 -0
- data/README.md +40 -0
- data/bin/un +833 -0
- data/bin/un.cmd +1 -0
- data/confuddle.gemspec +22 -0
- data/lib/graft/README.rdoc +138 -0
- data/lib/graft/Rakefile +43 -0
- data/lib/graft/lib/graft/core_ext/hash.rb +9 -0
- data/lib/graft/lib/graft/json.rb +14 -0
- data/lib/graft/lib/graft/json/attribute.rb +18 -0
- data/lib/graft/lib/graft/json/model.rb +28 -0
- data/lib/graft/lib/graft/model.rb +43 -0
- data/lib/graft/lib/graft/version.rb +13 -0
- data/lib/graft/lib/graft/xml.rb +19 -0
- data/lib/graft/lib/graft/xml/attribute.rb +55 -0
- data/lib/graft/lib/graft/xml/model.rb +49 -0
- data/lib/graft/lib/graft/xml/type.rb +91 -0
- data/lib/graft/test/test_helper.rb +38 -0
- data/lib/graft/test/unit/core_ext/hash_test.rb +29 -0
- data/lib/graft/test/unit/json/attribute_test.rb +51 -0
- data/lib/graft/test/unit/json/model_test.rb +86 -0
- data/lib/graft/test/unit/xml/attribute_test.rb +161 -0
- data/lib/graft/test/unit/xml/model_test.rb +173 -0
- data/lib/graft/test/unit/xml/type_test.rb +65 -0
- data/lib/unfuzzle/.gitignore +4 -0
- data/lib/unfuzzle/README.rdoc +129 -0
- data/lib/unfuzzle/Rakefile +39 -0
- data/lib/unfuzzle/lib/unfuzzle.rb +87 -0
- data/lib/unfuzzle/lib/unfuzzle/comment.rb +37 -0
- data/lib/unfuzzle/lib/unfuzzle/component.rb +31 -0
- data/lib/unfuzzle/lib/unfuzzle/milestone.rb +54 -0
- data/lib/unfuzzle/lib/unfuzzle/person.rb +20 -0
- data/lib/unfuzzle/lib/unfuzzle/priority.rb +30 -0
- data/lib/unfuzzle/lib/unfuzzle/project.rb +62 -0
- data/lib/unfuzzle/lib/unfuzzle/request.rb +75 -0
- data/lib/unfuzzle/lib/unfuzzle/response.rb +25 -0
- data/lib/unfuzzle/lib/unfuzzle/severity.rb +31 -0
- data/lib/unfuzzle/lib/unfuzzle/ticket.rb +156 -0
- data/lib/unfuzzle/lib/unfuzzle/ticket_report.rb +29 -0
- data/lib/unfuzzle/lib/unfuzzle/time_entry.rb +75 -0
- data/lib/unfuzzle/lib/unfuzzle/version.rb +13 -0
- data/lib/unfuzzle/test/fixtures/component.xml +8 -0
- data/lib/unfuzzle/test/fixtures/components.xml +17 -0
- data/lib/unfuzzle/test/fixtures/milestone.xml +12 -0
- data/lib/unfuzzle/test/fixtures/milestones.xml +25 -0
- data/lib/unfuzzle/test/fixtures/project.xml +17 -0
- data/lib/unfuzzle/test/fixtures/projects.xml +35 -0
- data/lib/unfuzzle/test/fixtures/severities.xml +24 -0
- data/lib/unfuzzle/test/fixtures/severity.xml +8 -0
- data/lib/unfuzzle/test/fixtures/ticket.xml +25 -0
- data/lib/unfuzzle/test/fixtures/tickets.xml +51 -0
- data/lib/unfuzzle/test/test_helper.rb +60 -0
- data/lib/unfuzzle/test/unit/unfuzzle/component_test.rb +36 -0
- data/lib/unfuzzle/test/unit/unfuzzle/milestone_test.rb +100 -0
- data/lib/unfuzzle/test/unit/unfuzzle/priority_test.rb +25 -0
- data/lib/unfuzzle/test/unit/unfuzzle/project_test.rb +87 -0
- data/lib/unfuzzle/test/unit/unfuzzle/request_test.rb +104 -0
- data/lib/unfuzzle/test/unit/unfuzzle/response_test.rb +37 -0
- data/lib/unfuzzle/test/unit/unfuzzle/severity_test.rb +36 -0
- data/lib/unfuzzle/test/unit/unfuzzle/ticket_test.rb +181 -0
- data/lib/unfuzzle/test/unit/unfuzzle_test.rb +39 -0
- data/lib/unfuzzle/unfuzzle.gemspec +31 -0
- data/lib/version.rb +3 -0
- metadata +176 -0
@@ -0,0 +1,173 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
class EmptyXmlModel
|
4
|
+
include Graft::Xml::Model
|
5
|
+
end
|
6
|
+
|
7
|
+
class XmlModelWithAttributes
|
8
|
+
include Graft::Xml::Model
|
9
|
+
|
10
|
+
attribute :name
|
11
|
+
attribute :description, :from => 'desc'
|
12
|
+
attribute :rating, :from => 'rating@value'
|
13
|
+
attribute :size, :from => "node[@type='size']@value"
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
class XmlModelWithAttributeType
|
18
|
+
include Graft::Xml::Model
|
19
|
+
|
20
|
+
attribute :id, :type => :integer
|
21
|
+
end
|
22
|
+
|
23
|
+
class XmlModelTest < Test::Unit::TestCase
|
24
|
+
|
25
|
+
context "The EmptyXmlModel class" do
|
26
|
+
should "have an empty list of attributes if none are supplied" do
|
27
|
+
EmptyXmlModel.attributes.should == []
|
28
|
+
end
|
29
|
+
|
30
|
+
should "be able to return a collection of XML nodes" do
|
31
|
+
xml =<<-XML
|
32
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
33
|
+
<things>
|
34
|
+
<thing><id>1</id></thing>
|
35
|
+
<thing><id>2</id></thing>
|
36
|
+
</things>
|
37
|
+
XML
|
38
|
+
|
39
|
+
document = Hpricot.XML(xml)
|
40
|
+
|
41
|
+
EmptyXmlModel.expects(:data_from).with(xml).returns(document)
|
42
|
+
|
43
|
+
EmptyXmlModel.expects(:new).with((document/'things/thing').first).returns('model_1')
|
44
|
+
EmptyXmlModel.expects(:new).with((document/'things/thing').last).returns('model_2')
|
45
|
+
|
46
|
+
collection = EmptyXmlModel.collection_from(xml, 'things/thing')
|
47
|
+
collection.should == ['model_1', 'model_2']
|
48
|
+
end
|
49
|
+
|
50
|
+
should "be able to retrieve data from the source XML string" do
|
51
|
+
xml = '<name>Graft</name>'
|
52
|
+
Hpricot.expects(:XML).with(xml).returns('document')
|
53
|
+
|
54
|
+
EmptyXmlModel.data_from(xml).should == 'document'
|
55
|
+
end
|
56
|
+
|
57
|
+
should "be able to retrieve data from the source document data" do
|
58
|
+
document = Hpricot.XML('<name>Graft</name>')
|
59
|
+
EmptyXmlModel.data_from(document).should == document
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
context "The XmlModelWithAttributes class" do
|
65
|
+
should "know the names of all its attributes" do
|
66
|
+
XmlModelWithAttributes.attributes.map {|a| a.name.to_s }.should == %w(name description rating size)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "The XmlModelWithAttributeType class" do
|
71
|
+
should "know that it's attribute is of type :integer" do
|
72
|
+
attribute = XmlModelWithAttributeType.attributes.first
|
73
|
+
attribute.type_class.should == Graft::Xml::Type::Integer
|
74
|
+
end
|
75
|
+
|
76
|
+
should "be able to generate an XML representation of itself" do
|
77
|
+
|
78
|
+
m = XmlModelWithAttributeType.new
|
79
|
+
m.id = 1
|
80
|
+
|
81
|
+
xml = String.new
|
82
|
+
xml << '<?xml version="1.0" encoding="UTF-8"?>'
|
83
|
+
xml << '<model>'
|
84
|
+
xml << '<id>1</id>'
|
85
|
+
xml << '</model>'
|
86
|
+
|
87
|
+
m.to_xml('model').should == xml
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "An instance of the EmptyXmlModel class" do
|
93
|
+
|
94
|
+
should "return an empty hash when calling :to_hash" do
|
95
|
+
m = EmptyXmlModel.new
|
96
|
+
m.to_hash.should == {}
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
context "An instance of the XmlModelWithAttributes class" do
|
102
|
+
|
103
|
+
setup { @simple_xml = '<name>Graft</name>' }
|
104
|
+
|
105
|
+
should "have default reader method for :name" do
|
106
|
+
XmlModelWithAttributes.new.respond_to?(:name).should be(true)
|
107
|
+
end
|
108
|
+
|
109
|
+
should "be able to populate its data on initialization" do
|
110
|
+
xml = Hpricot.XML(@simple_xml)
|
111
|
+
XmlModelWithAttributes.new(xml).name.should == 'Graft'
|
112
|
+
end
|
113
|
+
|
114
|
+
should "have a reference to the original document" do
|
115
|
+
xml = Hpricot.XML(@simple_xml)
|
116
|
+
XmlModelWithAttributes.new(xml).source_data.should == xml
|
117
|
+
end
|
118
|
+
|
119
|
+
should "be able to populate from an XML string" do
|
120
|
+
XmlModelWithAttributes.new(@simple_xml).name.should == 'Graft'
|
121
|
+
end
|
122
|
+
|
123
|
+
should "return a hash representation of itself" do
|
124
|
+
m = XmlModelWithAttributes.new
|
125
|
+
|
126
|
+
m.name = 'name'
|
127
|
+
m.description = 'description'
|
128
|
+
m.rating = '5'
|
129
|
+
m.size = 'large'
|
130
|
+
|
131
|
+
m.to_hash.should == {
|
132
|
+
'name' => 'name',
|
133
|
+
'description' => 'description',
|
134
|
+
'rating' => '5',
|
135
|
+
'size' => 'large'
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
context "when populating data from an XML document" do
|
140
|
+
|
141
|
+
setup do
|
142
|
+
xml = <<-XML
|
143
|
+
<name>Graft</name>
|
144
|
+
<desc>A sweet Ruby library</desc>
|
145
|
+
<rating value="100" />
|
146
|
+
<node type="color" value="blue" />
|
147
|
+
<node type="size" value="large" />
|
148
|
+
XML
|
149
|
+
|
150
|
+
@model = XmlModelWithAttributes.new
|
151
|
+
@model.populate_from(Hpricot.XML(xml))
|
152
|
+
end
|
153
|
+
|
154
|
+
should "have the correct value for :name" do
|
155
|
+
@model.name.should == 'Graft'
|
156
|
+
end
|
157
|
+
|
158
|
+
should "have the correct value for :description" do
|
159
|
+
@model.description.should == 'A sweet Ruby library'
|
160
|
+
end
|
161
|
+
|
162
|
+
should "have the correct value for :rating" do
|
163
|
+
@model.rating.should == '100'
|
164
|
+
end
|
165
|
+
|
166
|
+
# should "have the correct value for :size" do
|
167
|
+
# @model.size.should == 'large'
|
168
|
+
# end
|
169
|
+
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Graft
|
4
|
+
module Xml
|
5
|
+
|
6
|
+
class StringTest < Test::Unit::TestCase
|
7
|
+
context "An instance of the Graft::Xml::Type::String class" do
|
8
|
+
|
9
|
+
should_convert 'a string', :to => 'a string'
|
10
|
+
should_convert '', :to => nil
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class BooleanTest < Test::Unit::TestCase
|
16
|
+
context "An instance of the Graft::Xml::Type::Boolean class" do
|
17
|
+
|
18
|
+
should_convert 'true', :to => true
|
19
|
+
should_convert 'false', :to => false
|
20
|
+
should_convert '0', :to => false
|
21
|
+
should_convert '1', :to => true
|
22
|
+
should_convert '', :to => nil
|
23
|
+
|
24
|
+
should_fail_when_converting 'foo'
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class IntegerTest < Test::Unit::TestCase
|
30
|
+
context "An instance of the Graft::Xml::Type::Integer class" do
|
31
|
+
|
32
|
+
should_convert '1', :to => 1
|
33
|
+
should_convert '', :to => nil
|
34
|
+
|
35
|
+
should_fail_when_converting 'foo'
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class DateTest < Test::Unit::TestCase
|
41
|
+
|
42
|
+
context "An instance of the Graft::Xml::Type::Date class" do
|
43
|
+
|
44
|
+
should_convert '2008-08-01', :to => Date.parse('2008-08-01')
|
45
|
+
should_convert '', :to => nil
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
class TimeTest < Test::Unit::TestCase
|
52
|
+
|
53
|
+
context "An instance of the Graft::Xml::Type::Time class" do
|
54
|
+
|
55
|
+
should_convert '2008-07-28T16:57:10Z', :to => Time.parse('2008-07-28T16:57:10Z')
|
56
|
+
should_convert '2008-12-25 18:26:55', :to => Time.parse('2008-12-25 18:26:55')
|
57
|
+
should_convert '1230274722', :to => Time.at(1230274722)
|
58
|
+
should_convert '', :to => nil
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
= Unfuzzle
|
2
|
+
|
3
|
+
== Description
|
4
|
+
|
5
|
+
The Unfuzzle gem provides an interface to the Unfuddle XML API
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
|
9
|
+
sudo gem install vigetlabs-unfuzzle --source=http://gems.github.com
|
10
|
+
|
11
|
+
== Usage
|
12
|
+
|
13
|
+
To get started, you'll need your Unfuddle subdomain and a valid username /
|
14
|
+
password combination:
|
15
|
+
|
16
|
+
require 'unfuzzle'
|
17
|
+
|
18
|
+
Unfuzzle.subdomain = 'viget'
|
19
|
+
Unfuzzle.username = 'bopbip'
|
20
|
+
Unfuzzle.password = 'bleep'
|
21
|
+
|
22
|
+
Once that is configured, you can start accessing data from the API.
|
23
|
+
|
24
|
+
=== Projects
|
25
|
+
|
26
|
+
Pulling back a list of projects is simple. Based on the currently logged-in
|
27
|
+
user, you can see which ones he has access to:
|
28
|
+
|
29
|
+
projects = Unfuzzle.projects # => [#<Unfuzzle::Project:0x11e9280 ...> , ...]
|
30
|
+
|
31
|
+
If you don't want all projects, you can find one by its slug (or short name):
|
32
|
+
|
33
|
+
Unfuzzle.project('salty') # => #<Unfuzzle::Project:0x11e9280 ...>
|
34
|
+
|
35
|
+
Or by ID:
|
36
|
+
|
37
|
+
Unfuzzle.project(1) # => #<Unfuzzle::Project:0x11e9280 ...>
|
38
|
+
|
39
|
+
There are a few attributes available for a project:
|
40
|
+
|
41
|
+
project = Unfuzzle.projects.first
|
42
|
+
project.id # => 123
|
43
|
+
project.slug # => "salty"
|
44
|
+
project.name # => "Salty Co."
|
45
|
+
project.archived? # => false
|
46
|
+
project.created_at.strftime('%Y-%m-%d') # => "2008-07-28"
|
47
|
+
|
48
|
+
To see a list of additional attributes, take a look at the documentation for
|
49
|
+
Project.
|
50
|
+
|
51
|
+
=== Milestones
|
52
|
+
|
53
|
+
Each project can have milestones. You can access these from a single project:
|
54
|
+
|
55
|
+
project.milestones # => [#<Unfuzzle::Milestone:0x10bdca8 ...>, ...]
|
56
|
+
|
57
|
+
Milestones have attributes:
|
58
|
+
|
59
|
+
milestone = project.milestones.first
|
60
|
+
milestone.id # => 1
|
61
|
+
milestone.name # => "Milestone #1"
|
62
|
+
milestone.due_on.strftime('%m/%d/%Y') # => "07/30/2008"
|
63
|
+
|
64
|
+
A full list is available in the Milestone documentation.
|
65
|
+
|
66
|
+
=== Tickets
|
67
|
+
|
68
|
+
Tickets exist for a project:
|
69
|
+
|
70
|
+
ticket = project.tickets.first
|
71
|
+
ticket.title # => "Ticket #23"
|
72
|
+
ticket.number # => 23
|
73
|
+
ticket.description # => "Yo dawg, I hear you like tickets in your project ..."
|
74
|
+
ticket.status # => "closed"
|
75
|
+
|
76
|
+
And can also be associated to a milestone for the project:
|
77
|
+
|
78
|
+
ticket = project.milestones.first.tickets.first
|
79
|
+
ticket.title # => "Ticket #1"
|
80
|
+
ticket.number # => 1
|
81
|
+
ticket.description # => "Wash my car"
|
82
|
+
ticket.status # => "closed"
|
83
|
+
|
84
|
+
Unfuddle has additional associations for a ticket, including component, severity,
|
85
|
+
and priority:
|
86
|
+
|
87
|
+
ticket.component # => #<Unfuzzle::Component:0x12c5b54 ...>
|
88
|
+
ticket.component_name # => "User Accounts"
|
89
|
+
ticket.severity # => #<Unfuzzle::Severity:0x12a357c ...>
|
90
|
+
ticket.severity_name # => "Development"
|
91
|
+
ticket.priority # => #<Unfuzzle::Priority:0x12811fc @id=3>
|
92
|
+
ticket.priority_name # => "Normal"
|
93
|
+
|
94
|
+
See the Ticket documentation for more information.
|
95
|
+
|
96
|
+
== Updating
|
97
|
+
|
98
|
+
Currently, only ticket updating is supported and only for a subset of the data:
|
99
|
+
|
100
|
+
ticket.title = 'This is a new title' # => "This is a new title"
|
101
|
+
ticket.update # => #<Unfuzzle::Response:0x1275280 ...>
|
102
|
+
|
103
|
+
This will update the title of the ticket. Other fields that can be updated include
|
104
|
+
description and status.
|
105
|
+
|
106
|
+
== License
|
107
|
+
|
108
|
+
Copyright (c) 2009 Patrick Reagan of Viget Labs (mailto:patrick.reagan@viget.com)
|
109
|
+
|
110
|
+
Permission is hereby granted, free of charge, to any person
|
111
|
+
obtaining a copy of this software and associated documentation
|
112
|
+
files (the "Software"), to deal in the Software without
|
113
|
+
restriction, including without limitation the rights to use,
|
114
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
115
|
+
copies of the Software, and to permit persons to whom the
|
116
|
+
Software is furnished to do so, subject to the following
|
117
|
+
conditions:
|
118
|
+
|
119
|
+
The above copyright notice and this permission notice shall be
|
120
|
+
included in all copies or substantial portions of the Software.
|
121
|
+
|
122
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
123
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
124
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
125
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
126
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
127
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
128
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
129
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
require './lib/unfuzzle/version'
|
6
|
+
|
7
|
+
task :default => :test
|
8
|
+
|
9
|
+
spec = Gem::Specification.new do |s|
|
10
|
+
s.name = 'unfuzzle'
|
11
|
+
s.version = Unfuzzle::Version.to_s
|
12
|
+
s.has_rdoc = true
|
13
|
+
s.extra_rdoc_files = %w(README.rdoc)
|
14
|
+
s.rdoc_options = %w(--main README.rdoc)
|
15
|
+
s.summary = "This gem provides an interface to the Unfuddle XML API"
|
16
|
+
s.author = 'Patrick Reagan'
|
17
|
+
s.email = 'patrick.reagan@viget.com'
|
18
|
+
s.homepage = 'http://www.viget.com/extend'
|
19
|
+
s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib,test}/**/*")
|
20
|
+
|
21
|
+
s.add_dependency('graft', '>= 0.1.1')
|
22
|
+
end
|
23
|
+
|
24
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
25
|
+
pkg.gem_spec = spec
|
26
|
+
end
|
27
|
+
|
28
|
+
Rake::TestTask.new do |t|
|
29
|
+
t.libs << 'test'
|
30
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
31
|
+
t.verbose = true
|
32
|
+
end
|
33
|
+
|
34
|
+
desc 'Generate the gemspec to serve this Gem from Github'
|
35
|
+
task :github do
|
36
|
+
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
37
|
+
File.open(file, 'w') {|f| f << spec.to_ruby }
|
38
|
+
puts "Created gemspec: #{file}"
|
39
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
require 'net/http'
|
5
|
+
require 'net/https'
|
6
|
+
require 'json'
|
7
|
+
require 'builder'
|
8
|
+
require File.dirname(__FILE__) + '/../../graft/lib/graft/xml'
|
9
|
+
|
10
|
+
Dir[File.dirname(__FILE__) + "/unfuzzle/*.rb"].each { |x| require x }
|
11
|
+
|
12
|
+
# = Unfuzzle: A simple wrapper around the Unfuddle JSON API
|
13
|
+
#
|
14
|
+
# == Quick Start
|
15
|
+
#
|
16
|
+
# To get started, you need to set the subdomain and a valid username /
|
17
|
+
# password combination:
|
18
|
+
#
|
19
|
+
# require 'rubygems'
|
20
|
+
# require 'unfuzzle'
|
21
|
+
#
|
22
|
+
# Unfuzzle.subdomain = 'viget'
|
23
|
+
# Unfuzzle.username = 'bopbip'
|
24
|
+
# Unfuzzle.password = 'bleep'
|
25
|
+
#
|
26
|
+
# From there, you can start accessing a list of projects:
|
27
|
+
#
|
28
|
+
# >> Unfuzzle.projects
|
29
|
+
# => [#<Unfuzzle::Project:0x5f5c44 @id=1, @name="BlipCo", ...>, ... ]
|
30
|
+
#
|
31
|
+
# Or a specific project by its 'short name':
|
32
|
+
#
|
33
|
+
# >> Unfuzzle.project('sample')
|
34
|
+
# => #<Unfuzzle::Project:0x123f888 @id=2, @name="Sample Project", ... >
|
35
|
+
#
|
36
|
+
# For more usage documentation, see README.doc.
|
37
|
+
#
|
38
|
+
module Unfuzzle
|
39
|
+
|
40
|
+
# Set the subdomain for all requests
|
41
|
+
def self.subdomain=(subdomain)
|
42
|
+
@subdomain = subdomain
|
43
|
+
end
|
44
|
+
|
45
|
+
# Set the username for all requests. Data retrieved from the API will be
|
46
|
+
# scoped to the data that this user has access to.
|
47
|
+
def self.username=(username)
|
48
|
+
@username = username
|
49
|
+
end
|
50
|
+
|
51
|
+
# Set the password for the supplied username
|
52
|
+
def self.password=(password)
|
53
|
+
@password = password
|
54
|
+
end
|
55
|
+
|
56
|
+
# Use SSL: yes or no
|
57
|
+
def self.use_ssl=(value)
|
58
|
+
@use_ssl = value
|
59
|
+
end
|
60
|
+
|
61
|
+
# Retrieve a project for the current user by its ID or slug
|
62
|
+
def self.project(id_or_slug)
|
63
|
+
id_or_slug.is_a?(String) ? Project.find_by_slug(id_or_slug) : Project.find_by_id(id_or_slug)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Get a list of all projects for this user
|
67
|
+
def self.projects
|
68
|
+
Project.all
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.subdomain # :nodoc:
|
72
|
+
@subdomain
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.username # :nodoc:
|
76
|
+
@username
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.password # :nodoc:
|
80
|
+
@password
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.use_ssl # :nodoc:
|
84
|
+
@use_ssl
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|