weary 0.2.0 → 0.2.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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -1,15 +1,52 @@
1
1
  module Weary
2
2
  class Resource
3
- attr_reader :name
4
- attr_accessor :domain, :with, :requires, :via, :format, :url, :authenticates, :follows
3
+ attr_accessor :name, :domain, :with, :requires, :via, :format, :url, :authenticates, :follows
5
4
 
6
5
  def initialize(name)
7
- @name = name
6
+ self.name = name
8
7
  self.via = :get
9
8
  self.authenticates = false
10
9
  self.follows = true
11
10
  self.with = []
12
- self.requires
11
+ self.requires = []
12
+ end
13
+
14
+ def name=(resource_name)
15
+ resource_name = resource_name.to_s unless resource_name.is_a?(String)
16
+ @name = resource_name.downcase.strip.gsub(/\s/,'_')
17
+ end
18
+
19
+ def via=(http_verb)
20
+ @via = case http_verb
21
+ when *Methods[:get]
22
+ :get
23
+ when *Methods[:post]
24
+ :post
25
+ when *Methods[:put]
26
+ :put
27
+ when *Methods[:delete]
28
+ :delete
29
+ else
30
+ raise ArgumentError, "#{http_verb} is not a supported method"
31
+ end
32
+ end
33
+
34
+ def format=(type)
35
+ type = type.downcase if type.is_a?(String)
36
+ @format = case type
37
+ when *ContentTypes[:json]
38
+ :json
39
+ when *ContentTypes[:xml]
40
+ :xml
41
+ when *ContentTypes[:html]
42
+ :html
43
+ when *ContentTypes[:yaml]
44
+ :yaml
45
+ when *ContentTypes[:plain]
46
+ :plain
47
+ else
48
+ raise ArgumentError, "#{type} is not a recognized format."
49
+ end
13
50
  end
14
51
 
15
52
  def with=(params)
@@ -36,11 +73,19 @@ module Weary
36
73
  end
37
74
 
38
75
  def authenticates?
39
- @authenticates == true
76
+ if @authenticates
77
+ true
78
+ else
79
+ false
80
+ end
40
81
  end
41
82
 
42
83
  def follows_redirects?
43
- @follows == true
84
+ if @follows
85
+ true
86
+ else
87
+ false
88
+ end
44
89
  end
45
90
 
46
91
  def to_hash
@@ -1,7 +1,7 @@
1
1
  module Weary
2
2
  class Response
3
3
 
4
- attr_reader :raw, :method, :code, :message, :header, :content_type, :cookie, :body
4
+ attr_reader :raw, :method, :code, :message, :header, :content_type, :cookie, :body, :format
5
5
  alias mime_type content_type
6
6
 
7
7
  def initialize(http_response, http_method)
@@ -42,10 +42,6 @@ module Weary
42
42
  end
43
43
  end
44
44
 
45
- def format
46
- @format
47
- end
48
-
49
45
  def follow_redirect
50
46
  if redirected?
51
47
  Request.new(@raw['location'], @method).perform
data/lib/weary.rb CHANGED
@@ -24,6 +24,11 @@ module Weary
24
24
  :put => [:put, :PUT, /\bput\b/i],
25
25
  :delete => [:delete, :del, :DELETE, :DEL, /\bdelete\b/i],
26
26
  :head => [:head, :HEAD, /\bhead\b/i] }
27
+ ContentTypes = { :json => [:json, 'json', 'application/json', 'text/json', 'application/javascript', 'text/javascript'],
28
+ :xml => [:xml, 'xml', 'text/xml', 'application/xml'],
29
+ :html => [:html, 'html', 'text/html'],
30
+ :yaml => [:yaml, 'yaml', 'application/x-yaml', 'text/yaml'],
31
+ :plain => [:plain, 'plain', 'text/plain'] }
27
32
  UserAgents = { } # will be a collection of user agent strings
28
33
 
29
34
  # Weary::Query quickly performs a GET request on a URL and parses the request.
@@ -47,8 +52,8 @@ module Weary
47
52
 
48
53
  # Sets a default format to make your Requests in.
49
54
  # Defaults to JSON.
50
- def as_format(format)
51
- @default_format = format.to_sym
55
+ def as_format(format)
56
+ @default_format = format
52
57
  end
53
58
 
54
59
  # Construct a URL pattern for your resources to follow.
@@ -147,8 +152,10 @@ module Weary
147
152
  if resource.via == (:post || :put)
148
153
  code << %Q{options[:body] = params unless params.empty? \n}
149
154
  else
150
- code << %Q{options[:query] = params unless params.empty? \n}
151
- code << %Q{url << "?" + options[:query].to_params unless options[:query].nil? \n}
155
+ code << %Q{
156
+ options[:query] = params unless params.empty?
157
+ url << "?" + options[:query].to_params unless options[:query].nil?
158
+ }
152
159
  end
153
160
  if resource.authenticates?
154
161
  code << %Q{options[:basic_auth] = {:username => "#{@username}", :password => "#{@password}"} \n}
@@ -161,6 +168,7 @@ module Weary
161
168
  end
162
169
  }
163
170
  class_eval code
171
+ return code
164
172
  end
165
173
 
166
174
  end
@@ -0,0 +1,61 @@
1
+ require 'rubygems'
2
+ gem 'rspec'
3
+ require 'spec'
4
+ require File.join(File.dirname(__FILE__), '../..', 'lib', 'weary')
5
+
6
+ describe Weary::Resource do
7
+ before do
8
+ @test = Weary::Resource.new("test")
9
+ end
10
+
11
+ it 'defaults to a GET request' do
12
+ @test.via.should == :get
13
+ end
14
+ it 'should add requirements to the "with" array' do
15
+ @test.requires = [:foo, :bar]
16
+ @test.with.should == [:foo, :bar]
17
+ end
18
+
19
+ it 'with paramaters could be comma delimited strings' do
20
+ @test.with = "foo", "bar"
21
+ @test.with.should == [:foo, :bar]
22
+ end
23
+
24
+ it 'authenticates? should be boolean' do
25
+ @test.authenticates = "foobar"
26
+ @test.authenticates?.should == true
27
+ @test.authenticates = false
28
+ @test.authenticates?.should == false
29
+ end
30
+
31
+ it 'follows_redirects? should be boolean' do
32
+ @test.follows = "false"
33
+ @test.follows_redirects?.should == true
34
+ @test.follows = false
35
+ @test.follows_redirects?.should == false
36
+ end
37
+
38
+ it 'should be intelligent about crafting names' do
39
+ @test.name = "foo bar \n"
40
+ @test.name.should == "foo_bar"
41
+ end
42
+
43
+ it 'should only allow specified http methods' do
44
+ @test.via = "Post"
45
+ @test.via.should == :post
46
+ lambda { @test.via = :foobar }.should raise_error
47
+ end
48
+
49
+
50
+ it 'format should be a symbol' do
51
+ @test.format = "xml"
52
+ @test.format.class.should == Symbol
53
+ end
54
+
55
+ it 'format should be an allowed format' do
56
+ @test.format = 'text/json'
57
+ @test.format.should == :json
58
+ lambda { @test.format = :foobar }.should raise_error
59
+ end
60
+
61
+ end
data/spec/weary_spec.rb CHANGED
@@ -9,40 +9,41 @@ describe Weary do
9
9
  @test.instance_eval { extend Weary }
10
10
  end
11
11
 
12
- describe "default domain" do
12
+ describe 'default domain' do
13
13
  it 'should be set with a url' do
14
- @test.on_domain("http://twitter.com/")
15
- @test.domain.should == "http://twitter.com/"
14
+ @test.on_domain 'http://twitter.com/'
15
+ @test.domain.should == 'http://twitter.com/'
16
16
  end
17
17
 
18
18
  it 'should raise an exception when a url is not present' do
19
19
  lambda { @test.on_domain("foobar") }.should raise_error
20
20
  end
21
-
21
+
22
22
  it 'should only take the first url given' do
23
23
  @test.on_domain("with http://google.com/ and http://yahoo.com/")
24
24
  @test.domain.should == "http://google.com/"
25
25
  end
26
26
  end
27
27
 
28
- describe "default format" do
28
+ describe 'default format' do
29
29
  it 'can be set' do
30
- @test.as_format("xml")
31
- @test.instance_variable_defined?(:@default_format).should == true
30
+ @test.as_format(:xml)
31
+ @test.instance_variable_get(:@default_format).should == :xml
32
32
  end
33
33
 
34
- it 'should be a symbol' do
35
- @test.as_format("xml")
36
- @test.instance_variable_get(:@default_format).class.should == Symbol
34
+ it 'should be a recognized format' do
35
+ @test.as_format('text/yaml')
36
+ @test.on_domain('http://foobar.com/')
37
+ @test.get('foobar').format.should == :yaml
37
38
  end
38
39
  end
39
40
 
40
- describe "default url pattern" do
41
+ describe 'default url pattern' do
41
42
  it 'can be set' do
42
43
  @test.construct_url("<domain><resource>.<format>")
43
44
  @test.instance_variable_defined?(:@url_pattern).should == true
44
45
  end
45
-
46
+
46
47
  it 'should be a string' do
47
48
  @test.construct_url(123)
48
49
  @test.instance_variable_get(:@url_pattern).class.should == String
@@ -50,76 +51,44 @@ describe Weary do
50
51
  end
51
52
 
52
53
  describe "basic authentication credentials" do
54
+ # i want to change this to be more specific about it being
55
+ # basic authentication
53
56
  it "should accept a username and password" do
54
57
  @test.authenticates_with("foo","bar")
55
58
  @test.instance_variable_get(:@username).should == "foo"
56
59
  @test.instance_variable_get(:@password).should == "bar"
57
- end
60
+ end
58
61
  end
59
62
 
60
- describe "resource declaration" do
63
+ describe 'resource declaration' do
61
64
  before do
62
- @test.on_domain "http://twitter.com/"
65
+ @test.on_domain "http://foobar.com/"
63
66
  end
64
67
 
65
- it "should adds a new resource" do
66
- @test.declare_resource("resource")
68
+ it 'should add a new resource' do
69
+ @test.get "resource"
67
70
  @test.resources[0].has_key?(:resource).should == true
68
71
  end
69
72
 
70
- it "should default to a GET request" do
71
- @test.declare_resource("resource")[:resource][:via].should == :get
72
- end
73
-
74
- it "should default to JSON if no format is defined" do
75
- @test.declare_resource("resource")[:resource][:format].should == :json
73
+ it 'should instantiate a Resource object' do
74
+ @test.get("resource").class.should == Weary::Resource
76
75
  end
77
76
 
78
- it "should use the declared format, if a specific format is not defined" do
79
- @test.as_format :xml
80
- @test.declare_resource("resource")[:resource][:format].should == :xml
77
+ it 'should craft code to be evaluated' do
78
+ r = @test.get("resource")
79
+ @test.send(:craft_methods, r).class.should == String
81
80
  end
82
81
 
83
- it "should override the default format with it's own format" do
84
- @test.as_format :xml
85
- @test.declare_resource("resource",{:format => :yaml})[:resource][:format].should == :yaml
86
- end
87
-
88
- it "should form a url if there is a default pattern" do
89
- @test.declare_resource("resource")[:resource][:url].should == "http://twitter.com/resource.json"
90
- end
91
-
92
- it "should override the default pattern with it's own url" do
93
- @test.declare_resource("resource",{:url => "http://foobar.com/<resource>"})[:resource][:url].should == "http://foobar.com/resource"
94
- end
95
-
96
- it "should be able to contain a set of allowed parameters" do
97
- @test.declare_resource("resource",{:with => [:id]})[:resource][:with].empty?.should == false
98
- end
99
-
100
- it "should be able to contain a set of required parameters" do
101
- @test.declare_resource("resource",{:requires => [:id]})[:resource][:requires].empty?.should == false
102
- end
103
-
104
- it "should merge required parameters into allowed parameters" do
105
- @test.declare_resource("resource",{:requires => [:id]})[:resource][:with].empty?.should == false
106
- end
107
-
108
- it "should authenticate with username and password" do
109
- @test.authenticates_with("foo","bar")
110
- @test.declare_resource("resource",{:authenticates => true})[:resource][:authenticates].should == true
111
- end
112
-
113
- it "should raise an exception if authentication is required but no credentials are supplied" do
114
- lambda do
115
- @test.declare_resource("resource",{:authenticates => true})
116
- end.should raise_error
117
- end
118
-
119
- it "should create a method for an instantiated object" do
120
- @test.declare_resource("resource")
82
+ it 'should define new instance methods' do
83
+ @test.get("resource")
121
84
  @test.public_method_defined?(:resource).should == true
122
85
  end
123
86
 
124
- end
87
+ it 'should use sensible default formats' do
88
+ @test.get("resource").format.should == :json
89
+ @test.as_format(:xml)
90
+ @test.post("foo").format.should == :xml
91
+ end
92
+ end
93
+
125
94
  end
data/weary.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{weary}
5
- s.version = "0.2.0"
5
+ s.version = "0.2.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Mark Wunsch"]
9
- s.date = %q{2009-06-11}
9
+ s.date = %q{2009-06-12}
10
10
  s.description = %q{The Weary need REST: a tiny DSL that makes the consumption of RESTful web services simple.}
11
11
  s.email = %q{mark@markwunsch.com}
12
12
  s.extra_rdoc_files = [
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
27
27
  "lib/weary/resource.rb",
28
28
  "lib/weary/response.rb",
29
29
  "spec/weary/request_spec.rb",
30
+ "spec/weary/resource_spec.rb",
30
31
  "spec/weary_spec.rb",
31
32
  "weary.gemspec"
32
33
  ]
@@ -38,6 +39,7 @@ Gem::Specification.new do |s|
38
39
  s.summary = %q{A little DSL for consuming RESTful web services}
39
40
  s.test_files = [
40
41
  "spec/weary/request_spec.rb",
42
+ "spec/weary/resource_spec.rb",
41
43
  "spec/weary_spec.rb",
42
44
  "examples/repo.rb",
43
45
  "examples/status.rb"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Wunsch
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-11 00:00:00 -04:00
12
+ date: 2009-06-12 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -45,6 +45,7 @@ files:
45
45
  - lib/weary/resource.rb
46
46
  - lib/weary/response.rb
47
47
  - spec/weary/request_spec.rb
48
+ - spec/weary/resource_spec.rb
48
49
  - spec/weary_spec.rb
49
50
  - weary.gemspec
50
51
  has_rdoc: true
@@ -77,6 +78,7 @@ specification_version: 3
77
78
  summary: A little DSL for consuming RESTful web services
78
79
  test_files:
79
80
  - spec/weary/request_spec.rb
81
+ - spec/weary/resource_spec.rb
80
82
  - spec/weary_spec.rb
81
83
  - examples/repo.rb
82
84
  - examples/status.rb