moo 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +19 -0
- data/README.mkd +96 -0
- data/data/moo/templates/businesscard_bottom_image_dual_column_text_landscape.xml +361 -0
- data/data/moo/templates/businesscard_bottom_image_single_column_text_landscape.xml +231 -0
- data/data/moo/templates/businesscard_bottom_image_single_column_text_portrait.xml +361 -0
- data/data/moo/templates/businesscard_full_details_image_landscape.xml +77 -0
- data/data/moo/templates/businesscard_full_details_image_portrait.xml +75 -0
- data/data/moo/templates/businesscard_full_image_landscape.xml +73 -0
- data/data/moo/templates/businesscard_full_image_portrait.xml +73 -0
- data/data/moo/templates/businesscard_full_text_landscape.xml +343 -0
- data/data/moo/templates/businesscard_full_text_portrait.xml +342 -0
- data/data/moo/templates/businesscard_left_image_landscape.xml +363 -0
- data/data/moo/templates/businesscard_right_image_landscape.xml +363 -0
- data/data/moo/templates/businesscard_top_image_dual_column_text_landscape.xml +361 -0
- data/data/moo/templates/businesscard_top_image_single_column_text_landscape.xml +231 -0
- data/data/moo/templates/businesscard_top_image_single_column_text_portrait.xml +361 -0
- data/data/moo/templates/minicard_bottom_image_landscape.xml +155 -0
- data/data/moo/templates/minicard_full_details_image_landscape.xml +75 -0
- data/data/moo/templates/minicard_full_details_image_portrait.xml +74 -0
- data/data/moo/templates/minicard_full_image_landscape.xml +75 -0
- data/data/moo/templates/minicard_full_image_portrait.xml +74 -0
- data/data/moo/templates/minicard_full_text_landscape.xml +221 -0
- data/data/moo/templates/minicard_left_image_landscape.xml +238 -0
- data/data/moo/templates/minicard_right_image_landscape.xml +239 -0
- data/data/moo/templates/minicard_top_image_landscape.xml +154 -0
- data/data/moo/templates/postcard_full_details_image_landscape.xml +77 -0
- data/data/moo/templates/postcard_full_details_image_portrait.xml +76 -0
- data/data/moo/templates/postcard_full_image_landscape.xml +77 -0
- data/data/moo/templates/postcard_full_image_portrait.xml +77 -0
- data/data/moo/templates/postcard_full_text_portrait.xml +76 -0
- data/data/moo/templates/sticker_image.xml +76 -0
- data/lib/moo.rb +4 -0
- data/lib/moo/client.rb +111 -0
- data/lib/moo/core_ext/object.rb +7 -0
- data/lib/moo/core_ext/string.rb +6 -0
- data/lib/moo/model.rb +20 -0
- data/lib/moo/model/bounding_box.rb +70 -0
- data/lib/moo/model/box_data.rb +38 -0
- data/lib/moo/model/card.rb +12 -0
- data/lib/moo/model/colour.rb +100 -0
- data/lib/moo/model/data.rb +11 -0
- data/lib/moo/model/fixed_image_data.rb +40 -0
- data/lib/moo/model/font.rb +66 -0
- data/lib/moo/model/image_basket.rb +21 -0
- data/lib/moo/model/image_basket_item.rb +88 -0
- data/lib/moo/model/image_data.rb +64 -0
- data/lib/moo/model/multi_line_text_data.rb +8 -0
- data/lib/moo/model/pack.rb +50 -0
- data/lib/moo/model/side.rb +72 -0
- data/lib/moo/model/template.rb +78 -0
- data/lib/moo/model/text_data.rb +72 -0
- metadata +160 -0
data/lib/moo/model.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# side data dependencies
|
2
|
+
require 'moo/model/bounding_box'
|
3
|
+
require 'moo/model/font'
|
4
|
+
require 'moo/model/colour'
|
5
|
+
|
6
|
+
# side data
|
7
|
+
require 'moo/model/data'
|
8
|
+
require 'moo/model/box_data'
|
9
|
+
require 'moo/model/fixed_image_data'
|
10
|
+
require 'moo/model/image_data'
|
11
|
+
require 'moo/model/multi_line_text_data'
|
12
|
+
require 'moo/model/text_data'
|
13
|
+
|
14
|
+
# pack model
|
15
|
+
require 'moo/model/pack'
|
16
|
+
require 'moo/model/card'
|
17
|
+
require 'moo/model/side'
|
18
|
+
require 'moo/model/template'
|
19
|
+
require 'moo/model/image_basket'
|
20
|
+
require 'moo/model/image_basket_item'
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'json'
|
2
|
+
module Moo
|
3
|
+
module Model
|
4
|
+
class BoundingBox
|
5
|
+
attr_accessor :centre, :width, :height, :angle
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@centre = [0,0]
|
9
|
+
@width, @height, @angle = 0, 0, 0
|
10
|
+
yield self if block_given?
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_json
|
14
|
+
to_hash.to_json
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_hash
|
18
|
+
{
|
19
|
+
:center => {
|
20
|
+
:x => @centre[0],
|
21
|
+
:y => @centre[1]
|
22
|
+
},
|
23
|
+
:width => @width,
|
24
|
+
:height => @height,
|
25
|
+
:angle => @angle
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def from_json(json)
|
30
|
+
hash = JSON.parse(json, :symbolize_names => true)
|
31
|
+
@centre = [hash[:center][:x], hash[:center][:y]]
|
32
|
+
@width = hash[:width]
|
33
|
+
@height = hash[:height]
|
34
|
+
@angle = hash[:angle]
|
35
|
+
end
|
36
|
+
|
37
|
+
def centre=value
|
38
|
+
unless value.is_a? Enumerable
|
39
|
+
raise ArgumentError, "value must be Enumerable, #{value.class} given"
|
40
|
+
end
|
41
|
+
if value.is_a? Hash
|
42
|
+
@centre = [value[:x], value[:y]]
|
43
|
+
else
|
44
|
+
@centre = value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def width=value
|
49
|
+
unless value.is_a? Numeric
|
50
|
+
raise ArgumentError, "value must be Numeric, #{value.class} given"
|
51
|
+
end
|
52
|
+
@width = value
|
53
|
+
end
|
54
|
+
|
55
|
+
def height=value
|
56
|
+
unless value.is_a? Numeric
|
57
|
+
raise ArgumentError, "value must be Numeric, #{value.class} given"
|
58
|
+
end
|
59
|
+
@height = value
|
60
|
+
end
|
61
|
+
|
62
|
+
def angle=value
|
63
|
+
unless value.is_a? Numeric
|
64
|
+
raise ArgumentError, "value must be Numeric, #{value.class} given"
|
65
|
+
end
|
66
|
+
@angle = value
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'json'
|
2
|
+
module Moo
|
3
|
+
module Model
|
4
|
+
class BoxData < Data
|
5
|
+
attr_reader :colour
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
yield self if block_given?
|
9
|
+
end
|
10
|
+
|
11
|
+
def colour=(value)
|
12
|
+
unless value.kind_of? Colour
|
13
|
+
raise ArgumentError, "expected Colour, got '#{value.class}'"
|
14
|
+
end
|
15
|
+
@colour = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_json
|
19
|
+
to_hash.to_json
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_hash
|
23
|
+
{
|
24
|
+
:linkId => link_id,
|
25
|
+
:type => 'boxData',
|
26
|
+
:colour => colour.to_hash
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def from_json json
|
31
|
+
hash = JSON.parse json, :symbolize_names => true
|
32
|
+
@link_id = hash[:linkId]
|
33
|
+
@colour = Colour.new
|
34
|
+
@colour.from_json(hash[:colour].to_json)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'json'
|
2
|
+
module Moo
|
3
|
+
module Model
|
4
|
+
class Colour
|
5
|
+
attr_accessor :type, :c, :m, :y, :k, :r, :g, :b
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
yield self if block_given?
|
9
|
+
end
|
10
|
+
|
11
|
+
def type=new_type
|
12
|
+
unless ['cmyk','rgb','CMYK','RGB'].include? new_type
|
13
|
+
raise ArgumentError,
|
14
|
+
"type must be either 'cmyk' or 'rgb', '#{new_type}' given"
|
15
|
+
end
|
16
|
+
@type = new_type.upcase
|
17
|
+
end
|
18
|
+
|
19
|
+
def c=value
|
20
|
+
validate_numeric 'c', value, 0, 100.0
|
21
|
+
@c = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def m=value
|
25
|
+
validate_numeric 'm', value, 0, 100.0
|
26
|
+
@m = value
|
27
|
+
end
|
28
|
+
|
29
|
+
def y=value
|
30
|
+
validate_numeric 'y', value, 0, 100.0
|
31
|
+
@y = value
|
32
|
+
end
|
33
|
+
|
34
|
+
def k=value
|
35
|
+
validate_numeric 'k', value, 0, 100.0
|
36
|
+
@k = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def r=value
|
40
|
+
validate_numeric 'r', value, 0, 255
|
41
|
+
@r = value
|
42
|
+
end
|
43
|
+
|
44
|
+
def g=value
|
45
|
+
validate_numeric 'g', value, 0, 255
|
46
|
+
@g = value
|
47
|
+
end
|
48
|
+
|
49
|
+
def b=value
|
50
|
+
validate_numeric 'b', value, 0, 255
|
51
|
+
@b = value
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_json
|
55
|
+
self.to_hash.to_json
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_hash
|
59
|
+
if @type == 'RGB'
|
60
|
+
return {
|
61
|
+
:type => 'RGB',
|
62
|
+
:r => @r,
|
63
|
+
:g => @g,
|
64
|
+
:b => @b
|
65
|
+
}
|
66
|
+
elsif @type == 'CMYK'
|
67
|
+
return {
|
68
|
+
:type => 'CMYK',
|
69
|
+
:c => @c,
|
70
|
+
:m => @m,
|
71
|
+
:y => @y,
|
72
|
+
:k => @k
|
73
|
+
}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def from_json json
|
78
|
+
hash = JSON.parse json, :symbolize_names => true
|
79
|
+
keys = [:type]
|
80
|
+
if hash[:type] == 'RGB'
|
81
|
+
keys << :r << :g << :b
|
82
|
+
elsif hash[:type] == 'CMYK'
|
83
|
+
keys << :c << :m << :y << :k
|
84
|
+
end
|
85
|
+
keys.each { |k| send (k.to_s + '=').to_sym, hash[k] }
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
def validate_numeric field, value, from = -1000, to = 1000
|
90
|
+
unless value.is_a? Numeric
|
91
|
+
raise ArgumentError, "tried to set #{field} to non-numeric value"
|
92
|
+
end
|
93
|
+
unless from <= value and value <= to
|
94
|
+
raise ArgumentError, "value #{value.to_s} out of range, must be between #{from.to_s} and #{to.to_s} inclusive"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Moo
|
2
|
+
module Model
|
3
|
+
class FixedImageData < Data
|
4
|
+
attr_reader :resource_uri
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
yield self if block_given?
|
8
|
+
end
|
9
|
+
|
10
|
+
def resource_uri=value
|
11
|
+
unless value.is_a? String
|
12
|
+
raise ArgumentError, "expected String, got a #{value.class}"
|
13
|
+
end
|
14
|
+
@resource_uri = value
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_json
|
18
|
+
to_hash.to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_hash
|
22
|
+
hash = {
|
23
|
+
type: type,
|
24
|
+
linkId: link_id
|
25
|
+
}
|
26
|
+
hash[:resourceUri] = resource_uri unless resource_uri.nil?
|
27
|
+
hash
|
28
|
+
end
|
29
|
+
|
30
|
+
def from_json json
|
31
|
+
from_hash(JSON.parse(json, :symbolize_names => true))
|
32
|
+
end
|
33
|
+
|
34
|
+
def from_hash hash
|
35
|
+
self.link_id = hash[:linkId]
|
36
|
+
self.resource_uri = hash[:resourceUri]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'json'
|
2
|
+
module Moo
|
3
|
+
module Model
|
4
|
+
class Font
|
5
|
+
attr_accessor :family, :bold, :italic
|
6
|
+
|
7
|
+
ACCEPTED_FAMILIES = [
|
8
|
+
'arial',
|
9
|
+
'avantgarde',
|
10
|
+
'bryant',
|
11
|
+
'courier',
|
12
|
+
'frutigerltpro',
|
13
|
+
'georgia',
|
14
|
+
'helv',
|
15
|
+
'helvetica',
|
16
|
+
'index',
|
17
|
+
'meta',
|
18
|
+
'officina',
|
19
|
+
'radio',
|
20
|
+
'router',
|
21
|
+
'vagrounded'
|
22
|
+
]
|
23
|
+
|
24
|
+
@@default_family = 'helvetica'
|
25
|
+
|
26
|
+
def initialize
|
27
|
+
@family = @@default_family
|
28
|
+
@bold = false
|
29
|
+
@italic = false
|
30
|
+
yield self if block_given?
|
31
|
+
end
|
32
|
+
|
33
|
+
alias_method :bold?, :bold
|
34
|
+
alias_method :italic?, :italic
|
35
|
+
|
36
|
+
def family=value
|
37
|
+
unless value.is_a? String
|
38
|
+
raise ArgumentError, "value must be a String, #{value.class} given"
|
39
|
+
end
|
40
|
+
unless ACCEPTED_FAMILIES.include? value
|
41
|
+
raise ArgumentError, "font family must be on of accepted list, '#{value}' given"
|
42
|
+
end
|
43
|
+
@family = value
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_json
|
47
|
+
to_hash.to_json
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_hash
|
51
|
+
{
|
52
|
+
:fontFamily => @family,
|
53
|
+
:bold => @bold,
|
54
|
+
:italic => @italic
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
def from_json(json)
|
59
|
+
hash = JSON.parse(json, :symbolize_names => true)
|
60
|
+
@family = hash[:fontFamily]
|
61
|
+
@bold = hash[:bold]
|
62
|
+
@italic = hash[:italic]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Moo
|
2
|
+
module Model
|
3
|
+
class ImageBasket
|
4
|
+
attr_accessor :items
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
yield self if block_given?
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_hash
|
11
|
+
hash = {
|
12
|
+
:items => items.map {|i| i.to_hash }
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_json
|
17
|
+
to_hash.to_json
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Moo
|
2
|
+
module Model
|
3
|
+
class ImageBasketItem
|
4
|
+
class ImageItem
|
5
|
+
attr_reader :resource_uri, :type, :width, :height, :rotation
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
yield self if block_given?
|
9
|
+
end
|
10
|
+
|
11
|
+
def resource_uri=value
|
12
|
+
value.complain_if_not_a String
|
13
|
+
@resource_uri = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def type=type
|
17
|
+
unless [ "thumbnail", "print", "preview" ].include? type
|
18
|
+
raise ArgumentError, "invalid type"
|
19
|
+
end
|
20
|
+
@type = type
|
21
|
+
end
|
22
|
+
|
23
|
+
def width=value
|
24
|
+
unless value.is_a? Numeric
|
25
|
+
raise ArgumentError, "value must be Numeric, #{value.class} given"
|
26
|
+
end
|
27
|
+
@width = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def height=value
|
31
|
+
unless value.is_a? Numeric
|
32
|
+
raise ArgumentError, "value must be Numeric, #{value.class} given"
|
33
|
+
end
|
34
|
+
@height = value
|
35
|
+
end
|
36
|
+
|
37
|
+
def rotation=value
|
38
|
+
unless value.is_a? Numeric
|
39
|
+
raise ArgumentError, "value must be Numeric, #{value.class} given"
|
40
|
+
end
|
41
|
+
@rotation = value
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_hash
|
45
|
+
hash = {
|
46
|
+
:resourceUri => resource_uri,
|
47
|
+
:type => type,
|
48
|
+
:width => width,
|
49
|
+
:height => height,
|
50
|
+
:rotation => rotation
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_json
|
55
|
+
to_hash.to_json
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
attr_reader :resource_uri, :cache_id
|
60
|
+
attr_accessor :items
|
61
|
+
|
62
|
+
def initialize
|
63
|
+
yield self if block_given?
|
64
|
+
end
|
65
|
+
|
66
|
+
def resource_uri=value
|
67
|
+
value.complain_if_not_a String
|
68
|
+
@resource_uri = value
|
69
|
+
end
|
70
|
+
|
71
|
+
def cache_id=value
|
72
|
+
value.complain_if_not_a String
|
73
|
+
@cache_id = value
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_hash
|
77
|
+
hash = {
|
78
|
+
:resourceUri => resource_uri,
|
79
|
+
:imageBox => nil,
|
80
|
+
:removable => true,
|
81
|
+
:croppable => true,
|
82
|
+
:cacheId => cache_id,
|
83
|
+
:imageItems => items.map {|i| i.to_hash }
|
84
|
+
}
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|