thingiverse 0.0.6 → 0.0.7
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/lib/thingiverse.rb +2 -2
- data/lib/thingiverse/categories.rb +1 -17
- data/lib/thingiverse/dynamic_attributes.rb +33 -0
- data/lib/thingiverse/files.rb +1 -20
- data/lib/thingiverse/images.rb +1 -17
- data/lib/thingiverse/tags.rb +1 -18
- data/lib/thingiverse/things.rb +25 -58
- data/lib/thingiverse/users.rb +2 -36
- metadata +5 -18
data/lib/thingiverse.rb
CHANGED
@@ -2,10 +2,10 @@ require 'rubygems'
|
|
2
2
|
require 'json'
|
3
3
|
require 'httparty'
|
4
4
|
require 'curb'
|
5
|
-
require 'active_model'
|
6
5
|
require 'cgi'
|
7
6
|
require 'uri'
|
8
7
|
|
8
|
+
require 'thingiverse/dynamic_attributes'
|
9
9
|
require 'thingiverse/connection'
|
10
10
|
require 'thingiverse/pagination'
|
11
11
|
require 'thingiverse/things'
|
@@ -16,5 +16,5 @@ require 'thingiverse/categories'
|
|
16
16
|
require 'thingiverse/tags'
|
17
17
|
|
18
18
|
module Thingiverse
|
19
|
-
VERSION = '0.0.
|
19
|
+
VERSION = '0.0.7'
|
20
20
|
end
|
@@ -1,22 +1,6 @@
|
|
1
1
|
module Thingiverse
|
2
2
|
class Categories
|
3
|
-
include
|
4
|
-
validates_presence_of :name
|
3
|
+
include Thingiverse::DynamicAttributes
|
5
4
|
|
6
|
-
attr_accessor :name, :url, :count, :things_url
|
7
|
-
def initialize(attributes={})
|
8
|
-
attributes.each do |name, value|
|
9
|
-
send("#{name}=", value)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def attributes
|
14
|
-
{
|
15
|
-
:name => name,
|
16
|
-
:url => url,
|
17
|
-
:count => count,
|
18
|
-
:things_url => things_url
|
19
|
-
}
|
20
|
-
end
|
21
5
|
end
|
22
6
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Thingiverse
|
2
|
+
module DynamicAttributes
|
3
|
+
def eigenclass
|
4
|
+
class << self; self; end
|
5
|
+
end
|
6
|
+
|
7
|
+
attr_reader :attributes
|
8
|
+
|
9
|
+
def initialize(attributes={})
|
10
|
+
@attributes = attributes
|
11
|
+
@attributes.each do |k,v|
|
12
|
+
add_attribute(k, v)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(method_sym, *arguments, &block)
|
17
|
+
method = (method_sym.instance_of? Symbol) ? method_sym.to_s : method_sym.clone
|
18
|
+
|
19
|
+
if method.end_with? "="
|
20
|
+
method.chomp! "="
|
21
|
+
@attributes[method] = arguments[0]
|
22
|
+
add_attribute(method, arguments[0])
|
23
|
+
else
|
24
|
+
super(method_sym, *arguments, &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_attribute(name, value)
|
29
|
+
eigenclass.class_eval{ attr_reader name.to_sym }
|
30
|
+
instance_variable_set("@#{name}", value)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/thingiverse/files.rb
CHANGED
@@ -1,25 +1,6 @@
|
|
1
1
|
module Thingiverse
|
2
2
|
class Files
|
3
|
-
include
|
4
|
-
validates_presence_of :name
|
3
|
+
include Thingiverse::DynamicAttributes
|
5
4
|
|
6
|
-
attr_accessor :id, :name, :thumbnail, :url, :public_url, :threejs_url, :download_url
|
7
|
-
def initialize(attributes={})
|
8
|
-
attributes.each do |name, value|
|
9
|
-
send("#{name}=", value)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def attributes
|
14
|
-
{
|
15
|
-
:id => id,
|
16
|
-
:name => name,
|
17
|
-
:thumbnail => thumbnail,
|
18
|
-
:url => url,
|
19
|
-
:public_url => public_url,
|
20
|
-
:threejs_url => threejs_url,
|
21
|
-
:download_url => download_url
|
22
|
-
}
|
23
|
-
end
|
24
5
|
end
|
25
6
|
end
|
data/lib/thingiverse/images.rb
CHANGED
@@ -1,22 +1,6 @@
|
|
1
1
|
module Thingiverse
|
2
2
|
class Images
|
3
|
-
include
|
4
|
-
validates_presence_of :name
|
3
|
+
include Thingiverse::DynamicAttributes
|
5
4
|
|
6
|
-
attr_accessor :id, :name, :url, :sizes
|
7
|
-
def initialize(attributes={})
|
8
|
-
attributes.each do |name, value|
|
9
|
-
send("#{name}=", value)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def attributes
|
14
|
-
{
|
15
|
-
:id => id,
|
16
|
-
:name => name,
|
17
|
-
:url => url,
|
18
|
-
:sizes => sizes
|
19
|
-
}
|
20
|
-
end
|
21
5
|
end
|
22
6
|
end
|
data/lib/thingiverse/tags.rb
CHANGED
@@ -1,24 +1,7 @@
|
|
1
1
|
module Thingiverse
|
2
2
|
class Tags
|
3
|
-
include
|
4
|
-
validates_presence_of :name
|
3
|
+
include Thingiverse::DynamicAttributes
|
5
4
|
|
6
|
-
attr_accessor :name, :url, :count, :things_url
|
7
|
-
def initialize(attributes={})
|
8
|
-
attributes.each do |name, value|
|
9
|
-
send("#{name}=", value)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def attributes
|
14
|
-
{
|
15
|
-
:name => name,
|
16
|
-
:url => url,
|
17
|
-
:count => count,
|
18
|
-
:things_url => things_url
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
5
|
def self.find(tag_name)
|
23
6
|
response = Thingiverse::Connection.get("/tags/#{tag_name}")
|
24
7
|
raise "#{response.code}: #{JSON.parse(response.body)['error']}" unless response.success?
|
data/lib/thingiverse/things.rb
CHANGED
@@ -1,48 +1,6 @@
|
|
1
1
|
module Thingiverse
|
2
2
|
class Things
|
3
|
-
include
|
4
|
-
validates_presence_of :name
|
5
|
-
|
6
|
-
attr_accessor :id, :name, :thumbnail, :url, :public_url, :creator, :added, :modified, :is_published, :is_wip
|
7
|
-
attr_accessor :ratings_enabled, :like_count, :description, :instructions, :license
|
8
|
-
attr_accessor :files_url, :images_url, :likes_url, :ancestors_url, :derivatives_url, :tags_url, :categories_url
|
9
|
-
attr_accessor :category, :ancestors, :tags
|
10
|
-
|
11
|
-
def initialize(params={})
|
12
|
-
params.each do |name, value|
|
13
|
-
send("#{name}=", value)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def attributes
|
18
|
-
{
|
19
|
-
:id => id.to_s,
|
20
|
-
:name => name.to_s,
|
21
|
-
:thumbnail => thumbnail.to_s,
|
22
|
-
:url => url.to_s,
|
23
|
-
:public_url => public_url.to_s,
|
24
|
-
:creator => creator.to_s,
|
25
|
-
:added => added.to_s,
|
26
|
-
:modified => modified.to_s,
|
27
|
-
:is_published => is_published != true ? false : true,
|
28
|
-
:is_wip => is_wip != true ? false : true,
|
29
|
-
:ratings_enabled => ratings_enabled != true ? false : true,
|
30
|
-
:like_count => like_count.to_s,
|
31
|
-
:description => description.to_s,
|
32
|
-
:instructions => instructions.to_s,
|
33
|
-
:license => license.to_s,
|
34
|
-
:files_url => files_url.to_s,
|
35
|
-
:images_url => images_url.to_s,
|
36
|
-
:likes_url => likes_url.to_s,
|
37
|
-
:ancestors_url => ancestors_url.to_s,
|
38
|
-
:derivatives_url => derivatives_url.to_s,
|
39
|
-
:tags_url => tags_url.to_s,
|
40
|
-
:categories_url => categories_url.to_s,
|
41
|
-
:category => category.to_s,
|
42
|
-
:ancestors => ancestors || [],
|
43
|
-
:tags => tags || []
|
44
|
-
}
|
45
|
-
end
|
3
|
+
include Thingiverse::DynamicAttributes
|
46
4
|
|
47
5
|
def user
|
48
6
|
response = Thingiverse::Connection.get("/users/#{creator['name']}")
|
@@ -62,12 +20,11 @@ module Thingiverse
|
|
62
20
|
Thingiverse::Pagination.new(Thingiverse::Connection.get(@categories_url, :query => query), Thingiverse::Categories)
|
63
21
|
end
|
64
22
|
|
65
|
-
def
|
23
|
+
def ancestors(query = {})
|
66
24
|
Thingiverse::Pagination.new(Thingiverse::Connection.get(@ancestors_url, :query => query), Thingiverse::Things)
|
67
25
|
end
|
68
26
|
|
69
|
-
|
70
|
-
def tag_records
|
27
|
+
def tags
|
71
28
|
response = Thingiverse::Connection.get(tags_url)
|
72
29
|
raise "#{response.code}: #{JSON.parse(response.body)['error']}" unless response.success?
|
73
30
|
response.parsed_response.collect do |attrs|
|
@@ -76,12 +33,10 @@ module Thingiverse
|
|
76
33
|
end
|
77
34
|
|
78
35
|
def save
|
79
|
-
if id.to_s == ""
|
80
|
-
thing = Thingiverse::Things.create(attributes)
|
36
|
+
if @id.to_s == ""
|
37
|
+
thing = Thingiverse::Things.create(@attributes)
|
81
38
|
else
|
82
|
-
|
83
|
-
|
84
|
-
response = Thingiverse::Connection.patch("/things/#{id}", :body => attributes.to_json)
|
39
|
+
response = Thingiverse::Connection.patch("/things/#{id}", :body => @attributes.to_json)
|
85
40
|
raise "#{response.code}: #{JSON.parse(response.body)['error']}" unless response.success?
|
86
41
|
|
87
42
|
thing = Thingiverse::Things.new(response.parsed_response)
|
@@ -91,15 +46,28 @@ module Thingiverse
|
|
91
46
|
send("#{name}=", value)
|
92
47
|
end
|
93
48
|
end
|
94
|
-
|
95
|
-
|
96
|
-
|
49
|
+
|
50
|
+
# file_or_string can be a File or a String.
|
51
|
+
# thingiverse_filename is optional if using a File (the File filename will be used by default) but is required if using a String
|
52
|
+
def upload(file_or_string, thingiverse_filename=nil)
|
53
|
+
# to support different File type objects (like Tempfile) lets look for .path
|
54
|
+
if file_or_string.respond_to?("path")
|
55
|
+
thingiverse_filename = File.basename(file_or_string.path) if thingiverse_filename.to_s == ""
|
56
|
+
file_data = File.read(file_or_string.path)
|
57
|
+
elsif file_or_string.is_a?(String)
|
58
|
+
file_data = file_or_string
|
59
|
+
else
|
60
|
+
raise ArgumentError, "file_or_string not of accepted type. Expected File or String. Actual: #{file_or_string.class}"
|
61
|
+
end
|
62
|
+
|
63
|
+
raise ArgumentError, "Unable to determine filename" if thingiverse_filename.to_s == ""
|
64
|
+
|
65
|
+
response = Thingiverse::Connection.post("/things/#{id}/files", :body => {:filename => thingiverse_filename}.to_json)
|
97
66
|
raise "#{response.code}: #{JSON.parse(response.body)['error']} #{response.headers['x-error']}" unless response.success?
|
98
67
|
|
99
68
|
parsed_response = JSON.parse(response.body)
|
100
69
|
action = parsed_response["action"]
|
101
70
|
query = parsed_response["fields"]
|
102
|
-
query["file"] = file
|
103
71
|
|
104
72
|
# stupid S3 requires params to be in a certain order... so can't use HTTParty :(
|
105
73
|
# prepare post data
|
@@ -114,7 +82,7 @@ module Thingiverse
|
|
114
82
|
post_data << Curl::PostField.content('Content-Type', query['Content-Type'])
|
115
83
|
post_data << Curl::PostField.content('Content-Disposition', query['Content-Disposition'])
|
116
84
|
|
117
|
-
post_data << Curl::PostField.file('file',
|
85
|
+
post_data << Curl::PostField.file('file', thingiverse_filename) { file_data }
|
118
86
|
|
119
87
|
# post
|
120
88
|
c = Curl::Easy.new(action) do |curl|
|
@@ -136,7 +104,7 @@ module Thingiverse
|
|
136
104
|
end
|
137
105
|
|
138
106
|
def publish
|
139
|
-
if id.to_s == ""
|
107
|
+
if @id.to_s == ""
|
140
108
|
raise "Cannot publish until thing is saved"
|
141
109
|
else
|
142
110
|
response = Thingiverse::Connection.post("/things/#{id}/publish")
|
@@ -162,7 +130,6 @@ module Thingiverse
|
|
162
130
|
|
163
131
|
def self.create(params)
|
164
132
|
thing = self.new(params)
|
165
|
-
raise "Invalid Parameters" unless thing.valid?
|
166
133
|
|
167
134
|
response = Thingiverse::Connection.post('/things', :body => thing.attributes.to_json)
|
168
135
|
raise "#{response.code}: #{JSON.parse(response.body)['error']} #{response.headers['x-error']}" unless response.success?
|
data/lib/thingiverse/users.rb
CHANGED
@@ -1,41 +1,7 @@
|
|
1
1
|
module Thingiverse
|
2
2
|
class Users
|
3
|
-
include
|
4
|
-
|
5
|
-
|
6
|
-
attr_accessor :id, :name, :full_name, :thumbnail, :url, :public_url, :bio, :location, :registered, :last_active
|
7
|
-
attr_accessor :email, :default_license, :is_following
|
8
|
-
attr_accessor :things_url, :copies_url, :likes_url, :downloads_url, :collections_url
|
9
|
-
|
10
|
-
def initialize(attributes={})
|
11
|
-
attributes.each do |name, value|
|
12
|
-
send("#{name}=", value)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def attributes
|
17
|
-
{
|
18
|
-
:id => id,
|
19
|
-
:name => name,
|
20
|
-
:full_name => full_name,
|
21
|
-
:thumbnail => thumbnail,
|
22
|
-
:url => url,
|
23
|
-
:public_url => public_url,
|
24
|
-
:bio => bio,
|
25
|
-
:location => location,
|
26
|
-
:registered => registered,
|
27
|
-
:last_active => last_active,
|
28
|
-
:things_url => things_url,
|
29
|
-
:copies_url => copies_url,
|
30
|
-
:likes_url => likes_url,
|
31
|
-
:email => email,
|
32
|
-
:default_license => default_license,
|
33
|
-
:downloads_url => downloads_url,
|
34
|
-
:collections_url => collections_url,
|
35
|
-
:is_following => is_following
|
36
|
-
}
|
37
|
-
end
|
38
|
-
|
3
|
+
include Thingiverse::DynamicAttributes
|
4
|
+
|
39
5
|
def self.find(user_name)
|
40
6
|
response = Thingiverse::Connection.get("/users/#{user_name}")
|
41
7
|
raise "#{response.code}: #{JSON.parse(response.body)['error']}" unless response.success?
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thingiverse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tony Buser
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-
|
18
|
+
date: 2013-05-02 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: json
|
@@ -59,20 +59,6 @@ dependencies:
|
|
59
59
|
version: "0"
|
60
60
|
type: :runtime
|
61
61
|
version_requirements: *id003
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: activemodel
|
64
|
-
prerelease: false
|
65
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
|
-
requirements:
|
68
|
-
- - ">="
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
hash: 3
|
71
|
-
segments:
|
72
|
-
- 0
|
73
|
-
version: "0"
|
74
|
-
type: :runtime
|
75
|
-
version_requirements: *id004
|
76
62
|
description: Thingiverse API
|
77
63
|
email: tony@makerbot.com
|
78
64
|
executables: []
|
@@ -84,6 +70,7 @@ extra_rdoc_files: []
|
|
84
70
|
files:
|
85
71
|
- lib/thingiverse/categories.rb
|
86
72
|
- lib/thingiverse/connection.rb
|
73
|
+
- lib/thingiverse/dynamic_attributes.rb
|
87
74
|
- lib/thingiverse/files.rb
|
88
75
|
- lib/thingiverse/images.rb
|
89
76
|
- lib/thingiverse/pagination.rb
|