geo_pattern 1.3.2 → 1.4.0
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 +4 -4
- data/.rubocop.yml +58 -0
- data/.simplecov +25 -0
- data/.travis.yml +12 -0
- data/Gemfile +3 -1
- data/README.md +125 -23
- data/Rakefile +72 -9
- data/fixtures/generated_patterns/chevrons.svg +1 -0
- data/fixtures/generated_patterns/concentric_circles.svg +1 -0
- data/fixtures/generated_patterns/diamonds.svg +1 -0
- data/fixtures/generated_patterns/diamonds_with_base_color.svg +1 -0
- data/fixtures/generated_patterns/diamonds_with_color.svg +1 -0
- data/fixtures/generated_patterns/hexagons.svg +1 -0
- data/fixtures/generated_patterns/mosaic_squares.svg +1 -0
- data/fixtures/generated_patterns/nested_squares.svg +1 -0
- data/fixtures/generated_patterns/octagons.svg +1 -0
- data/fixtures/generated_patterns/overlapping_circles.svg +1 -0
- data/fixtures/generated_patterns/overlapping_rings.svg +1 -0
- data/fixtures/generated_patterns/plaid.svg +1 -0
- data/fixtures/generated_patterns/plus_signs.svg +1 -0
- data/fixtures/generated_patterns/sine_waves.svg +1 -0
- data/fixtures/generated_patterns/squares.svg +1 -0
- data/fixtures/generated_patterns/tessellation.svg +1 -0
- data/fixtures/generated_patterns/triangles.svg +1 -0
- data/fixtures/generated_patterns/xes.svg +1 -0
- data/geo_pattern.gemspec +8 -2
- data/lib/geo_pattern.rb +42 -20
- data/lib/geo_pattern/background.rb +25 -0
- data/lib/geo_pattern/background_generators/solid_generator.rb +52 -0
- data/lib/geo_pattern/color.rb +25 -0
- data/lib/geo_pattern/color_generators/base_color_generator.rb +55 -0
- data/lib/geo_pattern/color_generators/simple_generator.rb +27 -0
- data/lib/geo_pattern/color_preset.rb +26 -0
- data/lib/geo_pattern/errors.rb +7 -0
- data/lib/geo_pattern/geo_pattern_task.rb +59 -0
- data/lib/geo_pattern/helpers.rb +47 -0
- data/lib/geo_pattern/pattern.rb +84 -0
- data/lib/geo_pattern/pattern_generator.rb +33 -82
- data/lib/geo_pattern/pattern_helpers.rb +31 -2
- data/lib/geo_pattern/pattern_preset.rb +23 -0
- data/lib/geo_pattern/pattern_sieve.rb +36 -0
- data/lib/geo_pattern/pattern_store.rb +63 -0
- data/lib/geo_pattern/pattern_validator.rb +27 -0
- data/lib/geo_pattern/rake_task.rb +109 -0
- data/lib/geo_pattern/roles/comparable_metadata.rb +35 -0
- data/lib/geo_pattern/roles/named_generator.rb +13 -0
- data/lib/geo_pattern/seed.rb +21 -0
- data/lib/geo_pattern/structure.rb +25 -0
- data/lib/geo_pattern/structure_generators/base_generator.rb +85 -0
- data/lib/geo_pattern/structure_generators/chevrons_generator.rb +55 -0
- data/lib/geo_pattern/structure_generators/concentric_circles_generator.rb +56 -0
- data/lib/geo_pattern/structure_generators/diamonds_generator.rb +66 -0
- data/lib/geo_pattern/structure_generators/hexagons_generator.rb +67 -0
- data/lib/geo_pattern/structure_generators/mosaic_squares_generator.rb +85 -0
- data/lib/geo_pattern/structure_generators/nested_squares_generator.rb +60 -0
- data/lib/geo_pattern/structure_generators/octagons_generator.rb +44 -0
- data/lib/geo_pattern/structure_generators/overlapping_circles_generator.rb +55 -0
- data/lib/geo_pattern/structure_generators/overlapping_rings_generator.rb +55 -0
- data/lib/geo_pattern/structure_generators/plaid_generator.rb +55 -0
- data/lib/geo_pattern/structure_generators/plus_signs_generator.rb +62 -0
- data/lib/geo_pattern/structure_generators/sine_waves_generator.rb +43 -0
- data/lib/geo_pattern/structure_generators/squares_generator.rb +36 -0
- data/lib/geo_pattern/structure_generators/tessellation_generator.rb +103 -0
- data/lib/geo_pattern/structure_generators/triangles_generator.rb +61 -0
- data/lib/geo_pattern/structure_generators/xes_generator.rb +67 -0
- data/lib/geo_pattern/svg_image.rb +101 -0
- data/lib/geo_pattern/version.rb +1 -1
- data/script/bootstrap +30 -0
- data/script/console +8 -0
- data/script/test +21 -0
- data/spec/background_generators/solid_generator_spec.rb +50 -0
- data/spec/background_spec.rb +25 -0
- data/spec/color_generators/base_color_generator_spec.rb +31 -0
- data/spec/color_generators/simple_generator_spec.rb +12 -0
- data/spec/color_preset_spec.rb +53 -0
- data/spec/color_spec.rb +15 -0
- data/spec/geo_pattern_spec.rb +95 -24
- data/spec/helpers_spec.rb +65 -0
- data/spec/pattern_preset_spec.rb +41 -0
- data/spec/pattern_sieve_spec.rb +66 -0
- data/spec/pattern_spec.rb +72 -0
- data/spec/pattern_store_spec.rb +47 -0
- data/spec/pattern_validator_spec.rb +28 -0
- data/spec/seed_spec.rb +14 -0
- data/spec/spec_helper.rb +1 -6
- data/spec/structure_generators/chevrons_generator_spec.rb +5 -0
- data/spec/structure_generators/concentric_circles_generator_spec.rb +5 -0
- data/spec/structure_generators/diamonds_generator_spec.rb +5 -0
- data/spec/structure_generators/hexagons_generator_spec.rb +5 -0
- data/spec/structure_generators/mosaic_squares_generator_spec.rb +5 -0
- data/spec/structure_generators/nested_squares_generator_spec.rb +5 -0
- data/spec/structure_generators/octagons_generator_spec.rb +5 -0
- data/spec/structure_generators/overlapping_circles_generator_spec.rb +5 -0
- data/spec/structure_generators/overlapping_rings_generator_spec.rb +5 -0
- data/spec/structure_generators/plaid_generator_spec.rb +5 -0
- data/spec/structure_generators/plus_signs_generator_spec.rb +5 -0
- data/spec/structure_generators/sine_waves_generator_spec.rb +5 -0
- data/spec/structure_generators/squares_generator_spec.rb +5 -0
- data/spec/structure_generators/tessellation_generator_spec.rb +5 -0
- data/spec/structure_generators/triangles_generator_spec.rb +5 -0
- data/spec/structure_generators/xes_generator_spec.rb +5 -0
- data/spec/structure_spec.rb +38 -0
- data/spec/support/helpers/fixtures.rb +12 -0
- data/spec/support/kernel.rb +40 -0
- data/spec/support/matchers/image.rb +17 -0
- data/spec/support/matchers/name.rb +15 -0
- data/spec/support/rspec.rb +1 -1
- data/spec/support/shared_examples/generator.rb +46 -0
- data/spec/support/shared_examples/pattern.rb +31 -0
- data/spec/support/shared_examples/pattern_name.rb +7 -0
- data/spec/support/shared_examples/structure.rb +48 -0
- data/spec/svg_spec.rb +3 -3
- metadata +141 -25
- data/lib/geo_pattern/pattern/base_pattern.rb +0 -47
- data/lib/geo_pattern/pattern/chevron_pattern.rb +0 -45
- data/lib/geo_pattern/pattern/concentric_circles_pattern.rb +0 -47
- data/lib/geo_pattern/pattern/diamond_pattern.rb +0 -56
- data/lib/geo_pattern/pattern/hexagon_pattern.rb +0 -57
- data/lib/geo_pattern/pattern/mosaic_squares_pattern.rb +0 -76
- data/lib/geo_pattern/pattern/nested_squares_pattern.rb +0 -51
- data/lib/geo_pattern/pattern/octagon_pattern.rb +0 -35
- data/lib/geo_pattern/pattern/overlapping_circles_pattern.rb +0 -46
- data/lib/geo_pattern/pattern/overlapping_rings_pattern.rb +0 -46
- data/lib/geo_pattern/pattern/plaid_pattern.rb +0 -49
- data/lib/geo_pattern/pattern/plus_sign_pattern.rb +0 -53
- data/lib/geo_pattern/pattern/sine_wave_pattern.rb +0 -36
- data/lib/geo_pattern/pattern/square_pattern.rb +0 -27
- data/lib/geo_pattern/pattern/tessellation_pattern.rb +0 -93
- data/lib/geo_pattern/pattern/triangle_pattern.rb +0 -51
- data/lib/geo_pattern/pattern/xes_pattern.rb +0 -58
- data/lib/geo_pattern/svg.rb +0 -77
- data/spec/support/helpers.rb +0 -34
@@ -0,0 +1,61 @@
|
|
1
|
+
module GeoPattern
|
2
|
+
module StructureGenerators
|
3
|
+
class TrianglesGenerator < BaseGenerator
|
4
|
+
private
|
5
|
+
|
6
|
+
attr_reader :scale, :side_length, :triangle_height, :triangle
|
7
|
+
|
8
|
+
def after_initialize
|
9
|
+
@scale = hex_val(0, 1)
|
10
|
+
@side_length = map(scale, 0, 15, 15, 80)
|
11
|
+
@triangle_height = side_length / 2 * Math.sqrt(3)
|
12
|
+
@triangle = build_triangle_shape(side_length, triangle_height)
|
13
|
+
|
14
|
+
self.width = side_length * 3
|
15
|
+
self.height = triangle_height * 6
|
16
|
+
end
|
17
|
+
|
18
|
+
def generate_structure
|
19
|
+
i = 0
|
20
|
+
for y in 0..5
|
21
|
+
for x in 0..5
|
22
|
+
val = hex_val(i, 1)
|
23
|
+
opacity = opacity(val)
|
24
|
+
fill = fill_color(val)
|
25
|
+
|
26
|
+
styles = {
|
27
|
+
'fill' => fill,
|
28
|
+
'fill-opacity' => opacity,
|
29
|
+
'stroke' => stroke_color,
|
30
|
+
'stroke-opacity' => stroke_opacity
|
31
|
+
}
|
32
|
+
|
33
|
+
rotation = ''
|
34
|
+
if y % 2 == 0
|
35
|
+
rotation = x % 2 == 0 ? 180 : 0
|
36
|
+
else
|
37
|
+
rotation = x % 2 != 0 ? 180 : 0
|
38
|
+
end
|
39
|
+
|
40
|
+
svg.polyline(triangle, styles.merge(
|
41
|
+
'transform' => "translate(#{x * side_length * 0.5 - side_length / 2}, #{triangle_height * y}) rotate(#{rotation}, #{side_length / 2}, #{triangle_height / 2})"))
|
42
|
+
|
43
|
+
# Add an extra one at top-right, for tiling.
|
44
|
+
if (x == 0)
|
45
|
+
svg.polyline(triangle, styles.merge(
|
46
|
+
'transform' => "translate(#{6 * side_length * 0.5 - side_length / 2}, #{triangle_height * y}) rotate(#{rotation}, #{side_length / 2}, #{triangle_height / 2})"))
|
47
|
+
end
|
48
|
+
i += 1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
svg
|
53
|
+
end
|
54
|
+
|
55
|
+
def build_triangle_shape(side_length, height)
|
56
|
+
half_width = side_length / 2
|
57
|
+
"#{half_width}, 0, #{side_length}, #{height}, 0, #{height}, #{half_width}, 0"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module GeoPattern
|
2
|
+
module StructureGenerators
|
3
|
+
class XesGenerator < BaseGenerator
|
4
|
+
private
|
5
|
+
|
6
|
+
attr_reader :square_size, :x_shape, :x_size
|
7
|
+
|
8
|
+
def after_initialize
|
9
|
+
@square_size = map(hex_val(0, 1), 0, 15, 10, 25)
|
10
|
+
@x_shape = build_plus_shape(square_size) # rotated later
|
11
|
+
@x_size = square_size * 3 * 0.943
|
12
|
+
|
13
|
+
self.height = self.width = x_size * 3
|
14
|
+
end
|
15
|
+
|
16
|
+
def generate_structure
|
17
|
+
i = 0
|
18
|
+
for y in 0..5
|
19
|
+
for x in 0..5
|
20
|
+
val = hex_val(i, 1)
|
21
|
+
opacity = opacity(val)
|
22
|
+
dy = x % 2 == 0 ? y * x_size - x_size * 0.5 : y * x_size - x_size * 0.5 + x_size / 4
|
23
|
+
fill = fill_color(val)
|
24
|
+
|
25
|
+
styles = {
|
26
|
+
'fill' => fill,
|
27
|
+
'style' => {
|
28
|
+
'opacity' => opacity
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
svg.group(x_shape, styles.merge(
|
33
|
+
'transform' => "translate(#{x * x_size / 2 - x_size / 2},#{dy - y * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
|
34
|
+
|
35
|
+
# Add an extra column on the right for tiling.
|
36
|
+
if (x == 0)
|
37
|
+
svg.group(x_shape, styles.merge(
|
38
|
+
'transform' => "translate(#{6 * x_size / 2 - x_size / 2},#{dy - y * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
|
39
|
+
end
|
40
|
+
|
41
|
+
# Add an extra row on the bottom that matches the first row, for tiling.
|
42
|
+
if (y == 0)
|
43
|
+
dy = x % 2 == 0 ? 6 * x_size - x_size / 2 : 6 * x_size - x_size / 2 + x_size / 4
|
44
|
+
svg.group(x_shape, styles.merge(
|
45
|
+
'transform' => "translate(#{x * x_size / 2 - x_size / 2},#{dy - 6 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
|
46
|
+
end
|
47
|
+
|
48
|
+
# These can hang off the bottom, so put a row at the top for tiling.
|
49
|
+
if (y == 5)
|
50
|
+
svg.group(x_shape, styles.merge(
|
51
|
+
'transform' => "translate(#{x * x_size / 2 - x_size / 2},#{dy - 11 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
|
52
|
+
end
|
53
|
+
|
54
|
+
# Add an extra one at top-right and bottom-right, for tiling.
|
55
|
+
if x == 0 && y == 0
|
56
|
+
svg.group(x_shape, styles.merge(
|
57
|
+
'transform' => "translate(#{6 * x_size / 2 - x_size / 2},#{dy - 6 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
|
58
|
+
end
|
59
|
+
i += 1
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
svg
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module GeoPattern
|
2
|
+
class SvgImage
|
3
|
+
include Comparable
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
attr_reader :svg_string
|
8
|
+
|
9
|
+
public
|
10
|
+
|
11
|
+
attr_reader :height, :width
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@width = 100
|
15
|
+
@height = 100
|
16
|
+
@svg_string = ''
|
17
|
+
end
|
18
|
+
|
19
|
+
def width=(width)
|
20
|
+
@width = width.floor
|
21
|
+
end
|
22
|
+
|
23
|
+
def height=(height)
|
24
|
+
@height = height.floor
|
25
|
+
end
|
26
|
+
|
27
|
+
# Pattern includes string
|
28
|
+
#
|
29
|
+
# @param [String] string
|
30
|
+
# The string which should be included in the body of the SvgImage
|
31
|
+
def include?(string)
|
32
|
+
body.include? string
|
33
|
+
end
|
34
|
+
|
35
|
+
def svg_header
|
36
|
+
%(<svg xmlns="http://www.w3.org/2000/svg" width="#{@width}" height="#{@height}">)
|
37
|
+
end
|
38
|
+
|
39
|
+
def svg_closer
|
40
|
+
'</svg>'
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
svg_header + svg_string + svg_closer
|
45
|
+
end
|
46
|
+
|
47
|
+
def body
|
48
|
+
svg_string
|
49
|
+
end
|
50
|
+
|
51
|
+
def <<(svg)
|
52
|
+
svg_string << svg.body
|
53
|
+
end
|
54
|
+
|
55
|
+
def rect(x, y, width, height, args = {})
|
56
|
+
svg_string << %(<rect x="#{x}" y="#{y}" width="#{width}" height="#{height}" #{write_args(args)} />)
|
57
|
+
end
|
58
|
+
|
59
|
+
def circle(cx, cy, r, args = {})
|
60
|
+
svg_string << %(<circle cx="#{cx}" cy="#{cy}" r="#{r}" #{write_args(args)} />)
|
61
|
+
end
|
62
|
+
|
63
|
+
def path(str, args = {})
|
64
|
+
svg_string << %(<path d="#{str}" #{write_args(args)} />)
|
65
|
+
end
|
66
|
+
|
67
|
+
def polyline(str, args = {})
|
68
|
+
svg_string << %(<polyline points="#{str}" #{write_args(args)} />)
|
69
|
+
end
|
70
|
+
|
71
|
+
def group(elements, args = {})
|
72
|
+
svg_string << %(<g #{write_args(args)}>)
|
73
|
+
elements.each { |e| eval e }
|
74
|
+
svg_string << %(</g>)
|
75
|
+
end
|
76
|
+
|
77
|
+
def write_args(args)
|
78
|
+
str = ''
|
79
|
+
args.each do|key, value|
|
80
|
+
if value.is_a?(Hash)
|
81
|
+
str << %(#{key}=")
|
82
|
+
value.each do|k, v|
|
83
|
+
str << %(#{k}:#{v};)
|
84
|
+
end
|
85
|
+
str << %(" )
|
86
|
+
else
|
87
|
+
str << %(#{key}="#{value}" )
|
88
|
+
end
|
89
|
+
end
|
90
|
+
str
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.as_comment(str)
|
94
|
+
"<!-- #{str} -->"
|
95
|
+
end
|
96
|
+
|
97
|
+
def <=>(other)
|
98
|
+
to_s <=> other.to_s
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/geo_pattern/version.rb
CHANGED
data/script/bootstrap
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
info_msg="\e[0;32m[INFO]\e[0;30m"
|
6
|
+
error_msg="\e[0;31mFAILED\e[0;30m"
|
7
|
+
|
8
|
+
function output_error_log {
|
9
|
+
[[ -f error.log ]] && ( cat error.log >&2; rm error.log)
|
10
|
+
}
|
11
|
+
|
12
|
+
echo -ne "$info_msg Checking if ruby installed? "
|
13
|
+
which 'ruby' >/dev/null 2>error.log || ( echo -e "$error_msg\n\nCould not find \`ruby\`. Please install ruby or add it to PATH"; output_error_log; exit 1 )
|
14
|
+
echo OK
|
15
|
+
|
16
|
+
echo -en "$info_msg rubygem \"rake\" "
|
17
|
+
gem install rake >/dev/null 2>error.log || ( echo -e "$error_msg\n\nAn error occurred during installation of rake. Run \`gem install rake\` yourself."; output_error_log; exit 1 )
|
18
|
+
echo OK
|
19
|
+
|
20
|
+
if [ -n "$CI" ]; then
|
21
|
+
echo -e "$info_msg Bootstrapping in CI mode"
|
22
|
+
rake_task='bootstrap:ci'
|
23
|
+
else
|
24
|
+
echo -e "$info_msg Bootstrapping in normal mode"
|
25
|
+
rake_task='bootstrap'
|
26
|
+
fi
|
27
|
+
|
28
|
+
echo -en "$info_msg Running rake task \"$rake_task\" "
|
29
|
+
rake --trace $rake_task >error.log 2>&1 || ( echo -e "$error_msg\n\nAn error occurred during run of rake-task \"$rake_task\". Run \`rake $rake_task\` yourself."; output_error_log; exit 1 )
|
30
|
+
echo OK
|
data/script/console
ADDED
data/script/test
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
function output_error_log {
|
6
|
+
[[ -f error.log ]] && ( cat error.log >&2; rm error.log)
|
7
|
+
}
|
8
|
+
|
9
|
+
info_msg="\e[0;32m[INFO]\e[0;30m"
|
10
|
+
error_msg="\e[0;31mFAILED\e[0;30m"
|
11
|
+
|
12
|
+
if [ -n "$CI" ]; then
|
13
|
+
echo -e "$info_msg Testing in CI mode"
|
14
|
+
rake_task='test:ci'
|
15
|
+
else
|
16
|
+
echo -e "$info_msg Testing in normal mode"
|
17
|
+
rake_task='test'
|
18
|
+
fi
|
19
|
+
|
20
|
+
echo -en "$info_msg Running rake task \"$rake_task\" "
|
21
|
+
bundle exec rake --trace $rake_task
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe BackgroundGenerators::SolidGenerator do
|
4
|
+
subject(:generator) { described_class.new(seed, preset) }
|
5
|
+
|
6
|
+
let(:seed) { instance_double('GeoPattern::Seed') }
|
7
|
+
let(:preset) { instance_double('GeoPattern::ColorPreset') }
|
8
|
+
let(:pattern) { instance_double('GeoPattern::Pattern') }
|
9
|
+
let(:background_metadata) { instance_double('GeoPattern::BackgroundMetadata') }
|
10
|
+
|
11
|
+
let(:color) { '#aaaaaa' }
|
12
|
+
let(:base_color) { '#bbbbbb' }
|
13
|
+
let(:base_color_should_be_used) { true }
|
14
|
+
|
15
|
+
before :each do
|
16
|
+
allow(seed).to receive(:to_i).with(14, 3).and_return(2616)
|
17
|
+
allow(seed).to receive(:to_i).with(17, 1).and_return(3)
|
18
|
+
|
19
|
+
allow(preset).to receive(:mode?).with(:base_color).and_return(base_color_should_be_used)
|
20
|
+
allow(preset).to receive(:color).and_return(color)
|
21
|
+
allow(preset).to receive(:base_color).and_return(base_color)
|
22
|
+
end
|
23
|
+
|
24
|
+
it { is_expected.not_to be_nil }
|
25
|
+
|
26
|
+
describe '#generate' do
|
27
|
+
context 'when base color is given' do
|
28
|
+
let(:generated_color) { %w(187 187 187) }
|
29
|
+
|
30
|
+
before :each do
|
31
|
+
expect(pattern).to receive(:background=).with(have_image_with_rgb_color(generated_color))
|
32
|
+
end
|
33
|
+
|
34
|
+
it { generator.generate(pattern) }
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when color is given' do
|
38
|
+
let(:base_color_should_be_used) { false }
|
39
|
+
let(:generated_color) { %w(170 170 170) }
|
40
|
+
|
41
|
+
before :each do
|
42
|
+
expect(pattern).to receive(:background=).with(have_image_with_rgb_color(generated_color))
|
43
|
+
end
|
44
|
+
|
45
|
+
it { generator.generate(pattern) }
|
46
|
+
end
|
47
|
+
|
48
|
+
it_behaves_like 'a named generator', :solid
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Background do
|
4
|
+
subject(:metadata) { described_class.new(image: svg_image, preset: preset, generator: generator, color: color) }
|
5
|
+
|
6
|
+
let(:svg_image) { instance_double('GeoPattern::SvgImage') }
|
7
|
+
let(:svg_image_content) { fixtures_path('generated_patterns/sine_waves.svg').read.chomp }
|
8
|
+
let(:preset) { instance_double('GeoPattern::ColorPreset') }
|
9
|
+
let(:generator) { stub_const('GeoPattern::BackgroundGenerators::SolidGenerator', Class.new) }
|
10
|
+
|
11
|
+
let(:color) { '#aaaaaa' }
|
12
|
+
let(:base_color) { '#bbbbbb' }
|
13
|
+
|
14
|
+
it { is_expected.not_to be_nil }
|
15
|
+
|
16
|
+
before :each do
|
17
|
+
allow(preset).to receive(:color).and_return(color)
|
18
|
+
allow(preset).to receive(:base_color).and_return(base_color)
|
19
|
+
end
|
20
|
+
|
21
|
+
it_behaves_like 'a metadata argument', :color
|
22
|
+
it_behaves_like 'a metadata argument', :generator
|
23
|
+
it_behaves_like 'a forwarded metadata argument', :base_color
|
24
|
+
it_behaves_like 'a forwarded metadata argument', :color
|
25
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe ColorGenerators::BaseColorGenerator do
|
4
|
+
subject(:generator) { described_class.new(color_string, seed) }
|
5
|
+
|
6
|
+
let(:seed) { instance_double('GeoPattern::Seed') }
|
7
|
+
let(:seed_value1) { 2616 }
|
8
|
+
let(:seed_value2) { 2 }
|
9
|
+
|
10
|
+
let(:color_string) { '#ff00ff' }
|
11
|
+
|
12
|
+
it { is_expected.not_to be_nil }
|
13
|
+
|
14
|
+
before :each do
|
15
|
+
allow(seed).to receive(:to_i).with(14, 3).and_return(seed_value1)
|
16
|
+
allow(seed).to receive(:to_i).with(17, 1).and_return(seed_value2)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#generate' do
|
20
|
+
let(:color) { generator.generate }
|
21
|
+
|
22
|
+
context 'when sat offset is % 2 == 0' do
|
23
|
+
it { expect(color.to_svg).to eq 'rgb(210, 255, 0)' }
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'when sat offset is not % 2 == 0' do
|
27
|
+
let(:seed_value2) { 3 }
|
28
|
+
it { expect(color.to_svg).to eq 'rgb(207, 251, 4)' }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
RSpec.describe ColorGenerators::SimpleGenerator do
|
2
|
+
subject(:generator) { described_class.new(color_string) }
|
3
|
+
|
4
|
+
let(:color_string) { '#ff00ff' }
|
5
|
+
|
6
|
+
it { is_expected.not_to be_nil }
|
7
|
+
|
8
|
+
describe '#generate' do
|
9
|
+
let(:color) { generator.generate }
|
10
|
+
it { expect(color.to_svg).to eq 'rgb(255, 0, 255)' }
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe ColorPreset do
|
4
|
+
subject(:preset) { ColorPreset.new(**options) }
|
5
|
+
let(:options) do
|
6
|
+
{
|
7
|
+
base_color: '#0f0f0f'
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
it { expect(preset).not_to be nil }
|
12
|
+
|
13
|
+
describe '#base_color' do
|
14
|
+
it { expect(preset.base_color).to eq '#0f0f0f' }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#color' do
|
18
|
+
context 'when set' do
|
19
|
+
let(:options) do
|
20
|
+
{
|
21
|
+
base_color: '#0f0f0f',
|
22
|
+
color: '#1f1f1f'
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
it { expect(preset.color).to eq '#1f1f1f' }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#mode?' do
|
31
|
+
context 'when nil' do
|
32
|
+
let(:options) do
|
33
|
+
{
|
34
|
+
base_color: '#0f0f0f',
|
35
|
+
color: nil
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
it { expect(preset).to be_mode :base_color }
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when defined' do
|
43
|
+
let(:options) do
|
44
|
+
{
|
45
|
+
base_color: '#0f0f0f',
|
46
|
+
color: '#1f1f1f'
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
it { expect(preset).to be_mode :color }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|