scale 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f408226378fee538cbc1ee10bbaf1c773d9381b
4
- data.tar.gz: d010bb80f316f1d14bb1d90549ae3fd44df1d264
3
+ metadata.gz: 86687ce7ff6a5fd49f8e64362b33eafdc2918fbb
4
+ data.tar.gz: db33554c486c5f7f8bb5202395898667305bb95b
5
5
  SHA512:
6
- metadata.gz: bca9a3cb166dc50afe02bdb1b4fba814e3dafcd954a0e3bf0711faa14a9e9d4e915f38b9aeb4672aa2d20e863abc056bd4abb43fef4768e2b0dbd3ebcb00cac6
7
- data.tar.gz: 261a7863b70c3b96c204b6f112fa331a8e98a7c6addcf11b1501d7e7a4be65331ed3c143410393df65803a9a81baf1efa73e5f804bb58d15ffda4658991b014e
6
+ metadata.gz: af23fb556e2d43618624455e4c04a24a12e927410bab6f36a4f3be9936225fa5ff6b55ebc5f6dbac11ab9cb873f7e8cf2712a96b3062d4e9dcacb9ee221dd42a
7
+ data.tar.gz: 4b4571e4e4054dddb9a5b278f64c86a953e5d0c588263f8c09849038fc981284e599a016ad773676b6f4d3f5e4907e0f374f42b2f538e9dd407106c646c96a31
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
1
  --format documentation
2
2
  --color
3
+ --require spec_helper
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0"?>
2
+ <svg version="1.1" baseProfile="full" width="300" height="200" xmlns="http://www.w3.org/2000/svg">
3
+ <rect width="100%" height="100%" fill="red" />
4
+ <circle cx="150" cy="100" r="80" fill="green" />
5
+ <text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text>
6
+ </svg>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0"?>
2
+ <svg width="200" height="200" viewBox="0 0 100 100">
3
+ <rect x="0" y="0" width="100" height="100" />
4
+ </svg>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <svg width="200" height="250" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="10" y="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5" />
4
+ <rect x="60" y="10" rx="10" ry="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5"/>
5
+
6
+ <circle cx="25" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
7
+ <ellipse cx="75" cy="75" rx="20" ry="5" stroke="red" fill="transparent" stroke-width="5"/>
8
+
9
+ <line x1="10" x2="50" y1="110" y2="150" stroke="orange" fill="transparent" stroke-width="5"/>
10
+ <polyline points="60 110 65 120 70 115 75 130 80 125 85 140 90 135 95 150 100 145"
11
+ stroke="orange" fill="transparent" stroke-width="5"/>
12
+
13
+ <polygon points="50 160 55 180 70 180 60 190 65 205 50 195 35 205 40 190 30 180 45 180"
14
+ stroke="green" fill="transparent" stroke-width="5"/>
15
+
16
+ <path d="M20,230 Q40,205 50,230 T90,230" fill="none" stroke="blue" stroke-width="5"/>
17
+ </svg>
@@ -1,5 +1,12 @@
1
1
  require "scale/version"
2
+ require "scale/node"
3
+ require "scale/svg"
4
+ require "scale/shapes/rectangle"
5
+ require "scale/shapes/circle"
6
+ require "scale/shapes/ellipse"
7
+ require "scale/text"
8
+ require "scale/dsl"
2
9
 
3
10
  module Scale
4
- # Your code goes here...
11
+ # Your code goes here... NOT!
5
12
  end
@@ -0,0 +1,40 @@
1
+ module Scale
2
+ class DSL
3
+ def run
4
+ DSLBuilder.new.tap do |builder|
5
+ yield builder
6
+ end.to_xml
7
+ end
8
+ end
9
+
10
+ class DSLCommand
11
+ def initialize(name, args, block)
12
+ @name = name
13
+ @args = args
14
+ @block = block
15
+ end
16
+
17
+ def run(svg)
18
+ type = Kernel.const_get("Scale::#{@name.to_s.capitalize}")
19
+ svg.add(type.new(*@args))
20
+ end
21
+ end
22
+
23
+ class DSLBuilder
24
+ def initialize(commands = [])
25
+ @commands = commands
26
+ end
27
+
28
+ def method_missing(name, *args, &block)
29
+ @commands.push(DSLCommand.new(name, args, block))
30
+ end
31
+
32
+ def to_xml
33
+ svg = SVG.new
34
+ @commands.each do |command|
35
+ command.run(svg)
36
+ end
37
+ svg.to_xml
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,49 @@
1
+ require 'virtus'
2
+
3
+ module Scale
4
+ module Node
5
+ include Enumerable
6
+ include Virtus.module
7
+ attr_reader :content
8
+
9
+ def children
10
+ @children ||= []
11
+ end
12
+
13
+ def add(node)
14
+ children.push(node)
15
+ end
16
+
17
+ def each
18
+ children.each do |child|
19
+ yield child
20
+ end
21
+ end
22
+
23
+ def to_xml
24
+ builder = Nokogiri::XML::Builder.new do |xml|
25
+ append_to(xml)
26
+ end
27
+ builder.to_xml
28
+ end
29
+
30
+ def append_to(builder)
31
+ builder.send(xml_tag.to_sym, *xml_parameters) do
32
+ each do |node|
33
+ node.append_to(builder)
34
+ end
35
+ end
36
+ end
37
+
38
+ def xml_attributes
39
+ attributes.delete_if { |key, value| value.nil? }
40
+ end
41
+
42
+ private
43
+
44
+ def xml_parameters
45
+ return [xml_attributes] if content.nil?
46
+ [content, xml_attributes]
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,12 @@
1
+ module Scale
2
+ class Circle
3
+ include Node
4
+ attribute :cx, Integer
5
+ attribute :cy, Integer
6
+ attribute :r, Integer
7
+
8
+ def xml_tag
9
+ :circle
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module Scale
2
+ class Ellipse
3
+ include Node
4
+ attribute :rx, Integer
5
+ attribute :ry, Integer
6
+ attribute :cx, Integer
7
+ attribute :cy, Integer
8
+
9
+ def xml_tag
10
+ :ellipse
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ module Scale
2
+ class Rectangle
3
+ include Node
4
+ attribute :width, String
5
+ attribute :height, String
6
+ attribute :fill, String
7
+ attribute :x, Integer
8
+ attribute :y, Integer
9
+ attribute :rx, Integer
10
+ attribute :ry, Integer
11
+
12
+ def xml_tag
13
+ :rect
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,29 @@
1
+ require 'nokogiri'
2
+
3
+ module Scale
4
+ class SVG
5
+ include Node
6
+ attr_accessor :width, :height
7
+
8
+ def initialize(width: nil, height: nil)
9
+ @width, @height = width, height
10
+ end
11
+
12
+ private
13
+
14
+ def xml_tag
15
+ :svg
16
+ end
17
+
18
+ def attributes
19
+ attributes = {
20
+ version: "1.1",
21
+ baseProfile: "full",
22
+ xmlns: "http://www.w3.org/2000/svg",
23
+ }
24
+ attributes[:width] = width unless width.nil?
25
+ attributes[:height] = height unless height.nil?
26
+ attributes
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module Scale
2
+ class Text
3
+ include Node
4
+ attribute :x, Integer
5
+ attribute :y, Integer
6
+
7
+ def initialize(text, attributes = {})
8
+ @content = text
9
+ super(attributes)
10
+ end
11
+
12
+ def xml_tag
13
+ :text_
14
+ end
15
+ end
16
+ end
@@ -1,3 +1,3 @@
1
1
  module Scale
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -19,6 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
+ spec.add_dependency "nokogiri", "~> 1.6.6"
23
+ spec.add_dependency "virtus", "~> 1.0"
22
24
  spec.add_development_dependency "bundler", "~> 1.9"
23
25
  spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "rspec", "~> 3.2"
24
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scale
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - mo khan
@@ -10,6 +10,34 @@ bindir: exe
10
10
  cert_chain: []
11
11
  date: 2015-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: virtus
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: bundler
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +66,20 @@ dependencies:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
68
  version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.2'
41
83
  description: A simple DSL for producing SVG images.
42
84
  email:
43
85
  - mo@mokhan.ca
@@ -55,7 +97,17 @@ files:
55
97
  - Rakefile
56
98
  - bin/console
57
99
  - bin/setup
100
+ - examples/example.svg
101
+ - examples/positions.svg
102
+ - examples/shapes.svg
58
103
  - lib/scale.rb
104
+ - lib/scale/dsl.rb
105
+ - lib/scale/node.rb
106
+ - lib/scale/shapes/circle.rb
107
+ - lib/scale/shapes/ellipse.rb
108
+ - lib/scale/shapes/rectangle.rb
109
+ - lib/scale/svg.rb
110
+ - lib/scale/text.rb
59
111
  - lib/scale/version.rb
60
112
  - scale.gemspec
61
113
  homepage: http://www.mokhan.ca/