vj-sdk 0.7.7 → 0.7.8

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/Gemfile CHANGED
@@ -9,12 +9,17 @@ def gems(names, version)
9
9
  end
10
10
 
11
11
  # DataObjects, DataMapper and Merb
12
- gem "merb-core", "1.1.0.pre"
12
+ gem "addressable"
13
13
  gem "jeweler", ">= 1.4.0"
14
14
  gem "rake", ">= 0.8.7"
15
- gem "rspec", "1.3.0"
16
- gem "mash"
15
+ gem "mash", ">= 0.0.3"
17
16
  gem "randexp"
18
- gem "ruby-hmac"
17
+ gem "ruby-hmac", ">= 0.3.2"
19
18
  gem "liquid", "2.0.0"
20
- gem "json", "1.4.6"
19
+ gem "json", "1.4.6"
20
+ gem "multipart-post", "~> 1.1.0"
21
+ gem "mime-types", "~> 1.16"
22
+
23
+ group :development do
24
+ gem "rspec", "~> 1.3.0"
25
+ end
data/Rakefile CHANGED
@@ -3,7 +3,7 @@ require 'bundler'
3
3
  require 'net/http'
4
4
 
5
5
  # BUNDLER TRANSFORM!
6
- require 'lib/bundler_runtime_patch' # Andre's OMG MEGA HAX to allow DataMapper to require successfully
6
+ require File.expand_path('../lib/bundler_runtime_patch', __FILE__) # Andre's OMG MEGA HAX to allow DataMapper to require successfully
7
7
  Bundler.require :default, :vj_core_dependencies
8
8
 
9
9
  begin
@@ -14,12 +14,6 @@ begin
14
14
  gem.email = "dan@videojuicer.com"
15
15
  gem.homepage = "http://github.com/videojuicer/vj-sdk"
16
16
  gem.authors = ["danski", "thejohnny", "knowtheory", "sixones", "btab", "lamp"]
17
-
18
- # Declare dependencies
19
- gem.add_dependency "json", ">= 1.0"
20
- gem.add_dependency "ruby-hmac", ">= 0.3.2"
21
- gem.add_dependency "mash", ">= 0.0.3"
22
- gem.add_dependency "liquid", "2.0.0"
23
17
  end
24
18
  rescue LoadError
25
19
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
- :minor: 7
4
- :patch: 7
5
3
  :build:
4
+ :minor: 7
5
+ :patch: 8
@@ -4,7 +4,7 @@ module Videojuicer
4
4
  proxy = Videojuicer::OAuth::RequestProxy.new(Videojuicer.current_scope)
5
5
 
6
6
  if options[:page]
7
- options[:offset] = Videojuicer::Resource::Collection.limit_from_page_number options.delete(:page), options[:limit]
7
+ options[:offset] = Videojuicer::Resource::Collection.offset_from_page_number options.delete(:page), options[:limit]
8
8
  end
9
9
 
10
10
  response = proxy.get("/assets", "asset" => options)
@@ -1,100 +1,126 @@
1
- # Cribbed almost entirely from Merb's multipart request helper.
2
- # Thanks, Yehuda!
3
-
4
1
  module Videojuicer
5
2
  module OAuth
6
- module Multipart
7
-
8
- require 'rubygems'
9
- gem "mime-types"
10
- require 'mime/types'
11
-
12
- class Param
13
- attr_accessor :key, :value
3
+ class Multipart
4
+ include Enumerable
14
5
 
15
- # ==== Parameters
16
- # key<~to_s>:: The parameter key.
17
- # value<~to_s>:: The parameter value.
18
- def initialize(key, value)
19
- @key = key
20
- @value = value
21
- end
6
+ # Initialize a Multipart object
7
+ #
8
+ # @param [#each] params
9
+ #
10
+ # @return [undefined]
11
+ #
12
+ # @api private
13
+ def initialize(params = {})
14
+ @params = []
15
+ process_params(params)
16
+ end
22
17
 
23
- # ==== Returns
24
- # String:: The parameter in a form suitable for a multipart request.
25
- def to_multipart
26
- return %(Content-Disposition: form-data; name="#{key}"\r\n\r\n#{value}\r\n)
27
- end
18
+ # Iterate over each parameter pair
19
+ #
20
+ # @example
21
+ # multipart = Multipart.new(params)
22
+ # multipart.each { |key, value| ... }
23
+ #
24
+ # @yield [key, value]
25
+ #
26
+ # @yieldparam [#to_s] key
27
+ # the parameter key
28
+ # @yieldparam [Object] value
29
+ # the parameter value
30
+ #
31
+ # @return [self]
32
+ #
33
+ # @api public
34
+ def each(&block)
35
+ @params.each(&block)
36
+ self
28
37
  end
29
38
 
30
- class FileParam
31
- attr_accessor :key, :filename, :content
39
+ private
32
40
 
33
- # ==== Parameters
34
- # key<~to_s>:: The parameter key.
35
- # filename<~to_s>:: Name of the file for this parameter.
36
- # content<~to_s>:: Content of the file for this parameter.
37
- def initialize(key, filename, content)
38
- @key = key
39
- @filename = filename
40
- @content = content
41
- end
41
+ # Recursively build a list of parameters from a nested Hash
42
+ #
43
+ # @param [#each] params
44
+ # the pair of parameter keys
45
+ # @param [#to_s] prefix
46
+ # optional prefix to each parameter key
47
+ #
48
+ # @return [undefined]
49
+ #
50
+ # @api private
51
+ def process_params(params, prefix = nil)
52
+ params.each do |key, value|
53
+ param_key = prefix ? "#{prefix}[#{key}]" : key.to_s
42
54
 
43
- # ==== Returns
44
- # String::
45
- # The file parameter in a form suitable for a multipart request.
46
- def to_multipart
47
- return %(Content-Disposition: form-data; name="#{key}"; filename="#{filename}"\r\n) + "Content-Type: #{MIME::Types.type_for(@filename).first}\r\n\r\n" + content + "\r\n"
55
+ if value.respond_to?(:path)
56
+ append_file(param_key, value)
57
+ else
58
+ case value
59
+ when Hash then append_hash(param_key, value)
60
+ when Array then append_array(param_key, value)
61
+ else append_object(param_key, value)
62
+ end
63
+ end
48
64
  end
49
65
  end
50
66
 
51
- class Post
52
- BOUNDARY = '----------0xKhTmLbOuNdArY'
53
- CONTENT_TYPE = "multipart/form-data, boundary=" + BOUNDARY
67
+ # Append the nested hash parameters
68
+ #
69
+ # @param [#to_s] prefix
70
+ #
71
+ # @param [Hash] hash
72
+ #
73
+ # @return [undefined]
74
+ #
75
+ # @api private
76
+ def append_hash(prefix, hash)
77
+ process_params(hash, prefix)
78
+ end
54
79
 
55
- # ==== Parameters
56
- # params<Hash>:: Optional params for the controller.
57
- def initialize(params = {})
58
- @multipart_params = []
59
- push_params(params)
80
+ # Append the nested array parameters
81
+ #
82
+ # @param [#to_s] prefix
83
+ #
84
+ # @param [Array] array
85
+ #
86
+ # @return [undefined]
87
+ #
88
+ # @api private
89
+ def append_array(prefix, array)
90
+ array.each_with_index do |value, index|
91
+ @params << [ "#{prefix}[#{index}]", value ]
60
92
  end
93
+ end
61
94
 
62
- # Saves the params in an array of multipart params as Param and
63
- # FileParam objects.
64
- #
65
- # ==== Parameters
66
- # params<Hash>:: The params to add to the multipart params.
67
- # prefix<~to_s>:: An optional prefix for the request string keys.
68
- def push_params(params, prefix = nil)
69
- params.sort_by {|k| k.to_s}.each do |key, value|
70
- param_key = prefix.nil? ? key : "#{prefix}[#{key}]"
71
- if value.respond_to?(:read)
72
- @multipart_params << FileParam.new(param_key, value.path, value.read)
73
- value.rewind
74
- else
75
- if value.is_a?(Hash) || value.is_a?(Mash)
76
- value.keys.each do |k|
77
- push_params(value, param_key)
78
- end
79
- else
80
- @multipart_params << Param.new(param_key, value)
81
- end
82
- end
83
- end
84
- end
95
+ # Append the file parameter
96
+ #
97
+ # @param [#to_s] key
98
+ #
99
+ # @param [#read] file
100
+ #
101
+ # @return [undefined]
102
+ #
103
+ # @api private
104
+ def append_file(key, file)
105
+ filename = file.path
106
+ content_type = MIME::Types.type_for(filename).first
85
107
 
86
- # ==== Returns
87
- # Array[String, String]:: The query and the content type.
88
- def to_multipart
89
- # Split into FileParam and Param objects and leave FileParams to the end of the chain
90
- file_params = @multipart_params.select {|p| p.is_a?(FileParam) }
91
- regular_params = @multipart_params.select {|p| p.is_a?(Param) }
92
- all_params = regular_params+file_params
93
- query = all_params.collect { |param| "--" + BOUNDARY + "\r\n" + param.to_multipart }.join("") + "--" + BOUNDARY + "--"
94
- return query, CONTENT_TYPE
95
- end
96
- end
97
-
98
- end
99
- end
100
- end
108
+ @params << [ key, UploadIO.new(file, content_type, filename) ]
109
+ end
110
+
111
+ # Append the parameter
112
+ #
113
+ # @param [#to_s] key
114
+ #
115
+ # @param [Object] object
116
+ #
117
+ # @return [undefined]
118
+ #
119
+ # @api private
120
+ def append_object(key, object)
121
+ @params << [ key, object ]
122
+ end
123
+
124
+ end # module Multipart
125
+ end # module OAuth
126
+ end # module Videojuicer
@@ -53,49 +53,57 @@ module Videojuicer
53
53
  def make_request(method, host, port, path, params={})
54
54
  # Strip the files from the parameters to determine what, from the whole bundle, needs signing
55
55
  signature_params, multipart_params = split_by_signature_eligibility(params)
56
-
56
+
57
+ query_string = nil
58
+
57
59
  if multipart_params.any?
58
60
  # Sign the params and include the as multipart
59
61
  multipart_params = flatten_params(
60
62
  authify_params(method, path, signature_params).deep_merge(multipart_params)
61
63
  )
62
- query_string = ""
63
64
  else
64
65
  # Use the query string
65
66
  query_string = authified_query_string(method, path, signature_params)
66
67
  end
67
-
68
- # Generate the HTTP Request and handle the response
69
- url = "#{host_stub(protocol, host, port)}#{path}"
70
- request = request_class_for_method(method).new("#{path}?#{query_string}")
71
- # Generate the multipart body and headers
72
- if multipart_params.any?
73
- post_body, content_type = Multipart::Post.new(multipart_params).to_multipart
74
- request.content_length = post_body.length
75
- request.content_type = content_type
76
- request.body = post_body
68
+
69
+ uri = Addressable::URI.new(
70
+ :scheme => protocol,
71
+ :host => host,
72
+ :port => port,
73
+ :path => path,
74
+ :query => query_string
75
+ )
76
+
77
+ klass = request_class_for_method(method)
78
+
79
+ if multipart_params.any?
80
+ request = klass::Multipart.new(
81
+ uri.request_uri,
82
+ Videojuicer::OAuth::Multipart.new(multipart_params)
83
+ )
77
84
  else
78
- # Send a content-length on POST and PUT to avoid an HTTP 411 response
85
+ request = klass.new(uri.request_uri)
86
+
79
87
  case method
80
88
  when :post, :put
81
- request = request_class_for_method(method).new("#{path}")
82
- request.content_type = "application/x-www-form-urlencoded"
83
- request.body = query_string
89
+ # Send a content-length on POST and PUT to avoid an HTTP 411 response
90
+ query_string = uri.query.to_s
91
+ request = klass.new(uri.path)
92
+ request.content_type = 'application/x-www-form-urlencoded'
84
93
  request.content_length = query_string.length
94
+ request.body = query_string
85
95
  end
86
96
  end
87
-
88
-
89
- begin
90
- #response = HTTPClient.send(method, url, multipart_params)
91
- response = Net::HTTP.start(host, port) {|http| http.request(request) }
92
- rescue EOFError => e
93
- raise "EOF error when accessing #{url.inspect}"
94
- rescue Errno::ECONNREFUSED => e
95
- raise "Could not connect to #{url.inspect}"
97
+
98
+ response = Net::HTTP.start(uri.host, uri.port) do |http|
99
+ http.request(request)
96
100
  end
97
-
98
- return handle_response(response, request)
101
+
102
+ handle_response(response, request)
103
+ rescue EOFError => e
104
+ raise "EOF error when accessing #{uri.inspect}"
105
+ rescue Errno::ECONNREFUSED => e
106
+ raise "Could not connect to #{uri.inspect}"
99
107
  end
100
108
 
101
109
  def host_stub(_protocol=protocol, _host=host, _port=port)
@@ -120,6 +120,20 @@ module Videojuicer
120
120
  proxy_for(config).delete(resource_path)
121
121
  end
122
122
 
123
+ # Converts model attributes and errors (if any) to a json string
124
+ #
125
+ #
126
+ # @return [String]
127
+ #
128
+ #
129
+ # @api public
130
+ def to_json
131
+ JSON.generate({
132
+ :attributes => @attributes,
133
+ :errors => errors
134
+ })
135
+ end
136
+
123
137
  module ClassMethods
124
138
 
125
139
  # Finds all objects matching the criteria. Also allows filterable methods.
@@ -21,8 +21,18 @@ module Videojuicer
21
21
  self.limit = limit
22
22
  end
23
23
 
24
- #I was unsure of where to put this, please suggest other alternatives.
25
- def self.limit_from_page_number page, limit
24
+ # Provides an offset when given a page number
25
+ #
26
+ #
27
+ # @param [Integer] page
28
+ # @param [Integer] limit
29
+ #
30
+ #
31
+ # @return [Integer]
32
+ #
33
+ #
34
+ # @api public
35
+ def self.offset_from_page_number page, limit
26
36
  page = page.to_i
27
37
  return 0 if page == 1
28
38
  (page - 1) * limit.to_i
data/lib/videojuicer.rb CHANGED
@@ -2,10 +2,13 @@ $:.unshift File.dirname(__FILE__) # For use/testing when no gem is installed
2
2
 
3
3
  # Gem and stdlib dependencies
4
4
  require 'rubygems'
5
+ require 'addressable/uri'
5
6
  require 'cgi'
6
7
  require 'json'
7
8
  require 'hmac-sha1'
9
+ require 'mime/types'
8
10
  require 'net/http'
11
+ require 'net/http/post/multipart'
9
12
  require 'liquid'
10
13
 
11
14
  # Core ext
@@ -39,17 +39,17 @@ describe Videojuicer::Resource::Collection do
39
39
  end
40
40
 
41
41
  it "provides a correct offset for a page number and limit when the page is 1" do
42
- offset = Videojuicer::Resource::Collection.limit_from_page_number 1, 20
42
+ offset = Videojuicer::Resource::Collection.offset_from_page_number 1, 20
43
43
  offset.should == 0
44
44
  end
45
45
 
46
46
  it "should provide a correct offset" do
47
- offset = Videojuicer::Resource::Collection.limit_from_page_number 2, 20
47
+ offset = Videojuicer::Resource::Collection.offset_from_page_number 2, 20
48
48
  offset.should == 20
49
49
  end
50
50
 
51
51
  it "should be able to take a string as a page and limit argument" do
52
- offset = Videojuicer::Resource::Collection.limit_from_page_number "2", "20"
52
+ offset = Videojuicer::Resource::Collection.offset_from_page_number "2", "20"
53
53
  offset.should == 20
54
54
  end
55
55
 
@@ -0,0 +1,97 @@
1
+ require 'helpers/spec_helper'
2
+
3
+ describe Videojuicer::OAuth::Multipart do
4
+ describe '.new' do
5
+ context 'with no parameters' do
6
+ subject { described_class.new }
7
+
8
+ it { should be_kind_of(described_class) }
9
+
10
+ its(:to_a) { should be_empty }
11
+ end
12
+
13
+ context 'with non-nested parameters' do
14
+ subject { described_class.new(params) }
15
+
16
+ let(:params) { { :a => 1 } }
17
+
18
+ it { should be_kind_of(described_class) }
19
+
20
+ its(:to_a) { should == [ [ 'a', 1 ] ] }
21
+ end
22
+
23
+ context 'with a nested Hash' do
24
+ subject { described_class.new(params) }
25
+
26
+ let(:params) { { :a => { :b => 2 } } }
27
+
28
+ it { should be_kind_of(described_class) }
29
+
30
+ its(:to_a) { should == [ [ 'a[b]', 2 ] ] }
31
+ end
32
+
33
+ context 'with a nested Array' do
34
+ subject { described_class.new(params) }
35
+
36
+ let(:params) { { :a => [ 1, 2, 3 ] } }
37
+
38
+ it { should be_kind_of(described_class) }
39
+
40
+ its(:to_a) { should == [ [ 'a[0]', 1 ], [ 'a[1]', 2 ], [ 'a[2]', 3 ] ] }
41
+ end
42
+
43
+ context 'with a file' do
44
+ subject { described_class.new(params) }
45
+
46
+ let(:params) { { :file => file } }
47
+ let(:file) { File.open(__FILE__) }
48
+ let(:content_type) { MIME::Types['application/x-ruby'] }
49
+
50
+ before do
51
+ # need to allow the UploadIO instances to be comparable
52
+ UploadIO.class_eval do
53
+ def ==(other)
54
+ content_type == other.content_type &&
55
+ original_filename == other.original_filename &&
56
+ local_path == other.local_path
57
+ io == other.io
58
+ end
59
+ end
60
+ end
61
+
62
+ it { should be_kind_of(described_class) }
63
+
64
+ it 'wraps the file in an UploadIO instance' do
65
+ Hash[ subject.to_a ]['file'].should == UploadIO.new(file, content_type, __FILE__)
66
+ end
67
+ end
68
+ end
69
+
70
+ describe '#each' do
71
+ subject { object.each { |*yieldparams| yields << yieldparams } }
72
+
73
+ let(:yields) { [] }
74
+
75
+ context 'with no parameters' do
76
+ let(:object) { described_class.new }
77
+
78
+ it { should equal(object) }
79
+
80
+ it 'yields nothing' do
81
+ expect { subject }.to_not change { yields.dup }
82
+ end
83
+ end
84
+
85
+ context 'with parameters' do
86
+ let(:object) { described_class.new(:a => 1) }
87
+
88
+ it { should equal(object) }
89
+
90
+ it 'yields the parameters' do
91
+ expect { subject }.to change { yields.dup }.
92
+ from([]).
93
+ to([ [ [ 'a', 1 ] ] ])
94
+ end
95
+ end
96
+ end
97
+ end
@@ -163,5 +163,19 @@ shared_examples_for "a RESTFUL resource model" do
163
163
  lambda {@record.reload}.should raise_error(Videojuicer::Exceptions::NoResource)
164
164
  end
165
165
  end
166
+
167
+ describe "klass#to_json" do
168
+
169
+ before :each do
170
+ @record = @klass.new
171
+ end
172
+
173
+ it "should provide a valid json string" do
174
+ @record.to_json.class.should == String
175
+ tmp = JSON.parse @record.to_json
176
+ tmp['attributes'].should_not be_nil
177
+ tmp['errors'].length.should == 0
178
+ end
179
+ end
166
180
 
167
181
  end
data/vj-sdk.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{vj-sdk}
8
- s.version = "0.7.7"
8
+ s.version = "0.7.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["danski", "thejohnny", "knowtheory", "sixones", "btab", "lamp"]
12
- s.date = %q{2011-03-30}
12
+ s.date = %q{2011-04-12}
13
13
  s.email = %q{dan@videojuicer.com}
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE",
@@ -88,6 +88,7 @@ Gem::Specification.new do |s|
88
88
  "spec/helpers/spec_fixtures.rb",
89
89
  "spec/helpers/spec_helper.rb",
90
90
  "spec/insert_spec.rb",
91
+ "spec/multipart_spec.rb",
91
92
  "spec/presentation_spec.rb",
92
93
  "spec/preset_spec.rb",
93
94
  "spec/property_registry_spec.rb",
@@ -130,6 +131,7 @@ Gem::Specification.new do |s|
130
131
  "spec/helpers/spec_fixtures.rb",
131
132
  "spec/helpers/spec_helper.rb",
132
133
  "spec/insert_spec.rb",
134
+ "spec/multipart_spec.rb",
133
135
  "spec/presentation_spec.rb",
134
136
  "spec/preset_spec.rb",
135
137
  "spec/property_registry_spec.rb",
@@ -151,21 +153,42 @@ Gem::Specification.new do |s|
151
153
  s.specification_version = 3
152
154
 
153
155
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
154
- s.add_runtime_dependency(%q<json>, [">= 1.0"])
155
- s.add_runtime_dependency(%q<ruby-hmac>, [">= 0.3.2"])
156
+ s.add_runtime_dependency(%q<addressable>, [">= 0"])
157
+ s.add_runtime_dependency(%q<jeweler>, [">= 1.4.0"])
158
+ s.add_runtime_dependency(%q<rake>, [">= 0.8.7"])
156
159
  s.add_runtime_dependency(%q<mash>, [">= 0.0.3"])
160
+ s.add_runtime_dependency(%q<randexp>, [">= 0"])
161
+ s.add_runtime_dependency(%q<ruby-hmac>, [">= 0.3.2"])
157
162
  s.add_runtime_dependency(%q<liquid>, ["= 2.0.0"])
163
+ s.add_runtime_dependency(%q<json>, ["= 1.4.6"])
164
+ s.add_runtime_dependency(%q<multipart-post>, ["~> 1.1.0"])
165
+ s.add_runtime_dependency(%q<mime-types>, ["~> 1.16"])
166
+ s.add_development_dependency(%q<rspec>, ["~> 1.3.0"])
158
167
  else
159
- s.add_dependency(%q<json>, [">= 1.0"])
160
- s.add_dependency(%q<ruby-hmac>, [">= 0.3.2"])
168
+ s.add_dependency(%q<addressable>, [">= 0"])
169
+ s.add_dependency(%q<jeweler>, [">= 1.4.0"])
170
+ s.add_dependency(%q<rake>, [">= 0.8.7"])
161
171
  s.add_dependency(%q<mash>, [">= 0.0.3"])
172
+ s.add_dependency(%q<randexp>, [">= 0"])
173
+ s.add_dependency(%q<ruby-hmac>, [">= 0.3.2"])
162
174
  s.add_dependency(%q<liquid>, ["= 2.0.0"])
175
+ s.add_dependency(%q<json>, ["= 1.4.6"])
176
+ s.add_dependency(%q<multipart-post>, ["~> 1.1.0"])
177
+ s.add_dependency(%q<mime-types>, ["~> 1.16"])
178
+ s.add_dependency(%q<rspec>, ["~> 1.3.0"])
163
179
  end
164
180
  else
165
- s.add_dependency(%q<json>, [">= 1.0"])
166
- s.add_dependency(%q<ruby-hmac>, [">= 0.3.2"])
181
+ s.add_dependency(%q<addressable>, [">= 0"])
182
+ s.add_dependency(%q<jeweler>, [">= 1.4.0"])
183
+ s.add_dependency(%q<rake>, [">= 0.8.7"])
167
184
  s.add_dependency(%q<mash>, [">= 0.0.3"])
185
+ s.add_dependency(%q<randexp>, [">= 0"])
186
+ s.add_dependency(%q<ruby-hmac>, [">= 0.3.2"])
168
187
  s.add_dependency(%q<liquid>, ["= 2.0.0"])
188
+ s.add_dependency(%q<json>, ["= 1.4.6"])
189
+ s.add_dependency(%q<multipart-post>, ["~> 1.1.0"])
190
+ s.add_dependency(%q<mime-types>, ["~> 1.16"])
191
+ s.add_dependency(%q<rspec>, ["~> 1.3.0"])
169
192
  end
170
193
  end
171
194
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vj-sdk
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 7
9
- - 7
10
- version: 0.7.7
9
+ - 8
10
+ version: 0.7.8
11
11
  platform: ruby
12
12
  authors:
13
13
  - danski
@@ -20,44 +20,57 @@ autorequire:
20
20
  bindir: bin
21
21
  cert_chain: []
22
22
 
23
- date: 2011-03-30 00:00:00 +01:00
23
+ date: 2011-04-12 00:00:00 +01:00
24
24
  default_executable:
25
25
  dependencies:
26
26
  - !ruby/object:Gem::Dependency
27
- name: json
27
+ version_requirements: &id001 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ hash: 3
33
+ segments:
34
+ - 0
35
+ version: "0"
28
36
  prerelease: false
29
- requirement: &id001 !ruby/object:Gem::Requirement
37
+ type: :runtime
38
+ requirement: *id001
39
+ name: addressable
40
+ - !ruby/object:Gem::Dependency
41
+ version_requirements: &id002 !ruby/object:Gem::Requirement
30
42
  none: false
31
43
  requirements:
32
44
  - - ">="
33
45
  - !ruby/object:Gem::Version
34
- hash: 15
46
+ hash: 7
35
47
  segments:
36
48
  - 1
49
+ - 4
37
50
  - 0
38
- version: "1.0"
51
+ version: 1.4.0
52
+ prerelease: false
39
53
  type: :runtime
40
- version_requirements: *id001
54
+ requirement: *id002
55
+ name: jeweler
41
56
  - !ruby/object:Gem::Dependency
42
- name: ruby-hmac
43
- prerelease: false
44
- requirement: &id002 !ruby/object:Gem::Requirement
57
+ version_requirements: &id003 !ruby/object:Gem::Requirement
45
58
  none: false
46
59
  requirements:
47
60
  - - ">="
48
61
  - !ruby/object:Gem::Version
49
- hash: 23
62
+ hash: 49
50
63
  segments:
51
64
  - 0
52
- - 3
53
- - 2
54
- version: 0.3.2
65
+ - 8
66
+ - 7
67
+ version: 0.8.7
68
+ prerelease: false
55
69
  type: :runtime
56
- version_requirements: *id002
70
+ requirement: *id003
71
+ name: rake
57
72
  - !ruby/object:Gem::Dependency
58
- name: mash
59
- prerelease: false
60
- requirement: &id003 !ruby/object:Gem::Requirement
73
+ version_requirements: &id004 !ruby/object:Gem::Requirement
61
74
  none: false
62
75
  requirements:
63
76
  - - ">="
@@ -68,12 +81,42 @@ dependencies:
68
81
  - 0
69
82
  - 3
70
83
  version: 0.0.3
84
+ prerelease: false
71
85
  type: :runtime
72
- version_requirements: *id003
86
+ requirement: *id004
87
+ name: mash
73
88
  - !ruby/object:Gem::Dependency
74
- name: liquid
89
+ version_requirements: &id005 !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ hash: 3
95
+ segments:
96
+ - 0
97
+ version: "0"
75
98
  prerelease: false
76
- requirement: &id004 !ruby/object:Gem::Requirement
99
+ type: :runtime
100
+ requirement: *id005
101
+ name: randexp
102
+ - !ruby/object:Gem::Dependency
103
+ version_requirements: &id006 !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ hash: 23
109
+ segments:
110
+ - 0
111
+ - 3
112
+ - 2
113
+ version: 0.3.2
114
+ prerelease: false
115
+ type: :runtime
116
+ requirement: *id006
117
+ name: ruby-hmac
118
+ - !ruby/object:Gem::Dependency
119
+ version_requirements: &id007 !ruby/object:Gem::Requirement
77
120
  none: false
78
121
  requirements:
79
122
  - - "="
@@ -84,8 +127,73 @@ dependencies:
84
127
  - 0
85
128
  - 0
86
129
  version: 2.0.0
130
+ prerelease: false
131
+ type: :runtime
132
+ requirement: *id007
133
+ name: liquid
134
+ - !ruby/object:Gem::Dependency
135
+ version_requirements: &id008 !ruby/object:Gem::Requirement
136
+ none: false
137
+ requirements:
138
+ - - "="
139
+ - !ruby/object:Gem::Version
140
+ hash: 11
141
+ segments:
142
+ - 1
143
+ - 4
144
+ - 6
145
+ version: 1.4.6
146
+ prerelease: false
147
+ type: :runtime
148
+ requirement: *id008
149
+ name: json
150
+ - !ruby/object:Gem::Dependency
151
+ version_requirements: &id009 !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ~>
155
+ - !ruby/object:Gem::Version
156
+ hash: 19
157
+ segments:
158
+ - 1
159
+ - 1
160
+ - 0
161
+ version: 1.1.0
162
+ prerelease: false
87
163
  type: :runtime
88
- version_requirements: *id004
164
+ requirement: *id009
165
+ name: multipart-post
166
+ - !ruby/object:Gem::Dependency
167
+ version_requirements: &id010 !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ~>
171
+ - !ruby/object:Gem::Version
172
+ hash: 47
173
+ segments:
174
+ - 1
175
+ - 16
176
+ version: "1.16"
177
+ prerelease: false
178
+ type: :runtime
179
+ requirement: *id010
180
+ name: mime-types
181
+ - !ruby/object:Gem::Dependency
182
+ version_requirements: &id011 !ruby/object:Gem::Requirement
183
+ none: false
184
+ requirements:
185
+ - - ~>
186
+ - !ruby/object:Gem::Version
187
+ hash: 27
188
+ segments:
189
+ - 1
190
+ - 3
191
+ - 0
192
+ version: 1.3.0
193
+ prerelease: false
194
+ type: :development
195
+ requirement: *id011
196
+ name: rspec
89
197
  description:
90
198
  email: dan@videojuicer.com
91
199
  executables: []
@@ -168,6 +276,7 @@ files:
168
276
  - spec/helpers/spec_fixtures.rb
169
277
  - spec/helpers/spec_helper.rb
170
278
  - spec/insert_spec.rb
279
+ - spec/multipart_spec.rb
171
280
  - spec/presentation_spec.rb
172
281
  - spec/preset_spec.rb
173
282
  - spec/property_registry_spec.rb
@@ -239,6 +348,7 @@ test_files:
239
348
  - spec/helpers/spec_fixtures.rb
240
349
  - spec/helpers/spec_helper.rb
241
350
  - spec/insert_spec.rb
351
+ - spec/multipart_spec.rb
242
352
  - spec/presentation_spec.rb
243
353
  - spec/preset_spec.rb
244
354
  - spec/property_registry_spec.rb