graffle 0.1.0 → 0.1.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/History.txt +5 -0
- data/LICENSE.txt +2 -2
- data/Manifest.txt +7 -15
- data/Rakefile +5 -10
- data/Rakefile.hoe +9 -4
- data/bin/bin-skeleton +1 -11
- data/graffle.tmproj +2 -310
- data/lib/graffle/stereotypes.rb +32 -19
- data/lib/graffle/styled-text-reader.rb +0 -5
- data/lib/graffle/version.rb +1 -1
- data/lib/grail_test.rb +16 -0
- data/lib/grail_test/command-interpreters.rb +78 -0
- data/test/grails-tests/commands-from-quoted-args-tests.rb +86 -0
- data/test/grails-tests/destinations-tests.rb +19 -0
- data/test/grails-tests/do-nothing-commands-tests.rb +18 -0
- data/test/grails-tests/graphic-interpreter-tests.rb +70 -0
- data/test/grails-tests/translation-testcase.rb +25 -0
- data/test/line-graphic-tests.rb +10 -0
- data/test/set-standalone-test-paths.rb +4 -1
- data/test/shaped-graphic-tests.rb +6 -2
- data/test/styled-text-reader-tests.rb +0 -12
- data/test/text-tests.rb +9 -5
- metadata +25 -20
- data/lib/graffle/third-party/s4t-utils.rb +0 -21
- data/lib/graffle/third-party/s4t-utils/capturing-globals.rb +0 -78
- data/lib/graffle/third-party/s4t-utils/claims.rb +0 -14
- data/lib/graffle/third-party/s4t-utils/command-line.rb +0 -15
- data/lib/graffle/third-party/s4t-utils/error-handling.rb +0 -20
- data/lib/graffle/third-party/s4t-utils/friendly-format.rb +0 -27
- data/lib/graffle/third-party/s4t-utils/hacks.rb +0 -32
- data/lib/graffle/third-party/s4t-utils/load-path-auto-adjuster.rb +0 -120
- data/lib/graffle/third-party/s4t-utils/more-assertions.rb +0 -29
- data/lib/graffle/third-party/s4t-utils/os.rb +0 -28
- data/lib/graffle/third-party/s4t-utils/rake-task-helpers.rb +0 -75
- data/lib/graffle/third-party/s4t-utils/rakefile-common.rb +0 -106
- data/lib/graffle/third-party/s4t-utils/svn-file-movement.rb +0 -101
- data/lib/graffle/third-party/s4t-utils/test-util.rb +0 -19
- data/lib/graffle/third-party/s4t-utils/version.rb +0 -3
data/lib/graffle/stereotypes.rb
CHANGED
@@ -223,8 +223,16 @@ module Graffle
|
|
223
223
|
|
224
224
|
|
225
225
|
|
226
|
-
# The Text within the object
|
227
|
-
|
226
|
+
# The Text within the object. If there is no text, the return
|
227
|
+
# value is a null object that responds to as_lines with an empty
|
228
|
+
# array.
|
229
|
+
def content
|
230
|
+
if has_key?('Text')
|
231
|
+
self['Text']
|
232
|
+
else
|
233
|
+
Text::Null.new
|
234
|
+
end
|
235
|
+
end
|
228
236
|
alias_method :contents, :content
|
229
237
|
|
230
238
|
def with_text(string) # :nodoc:
|
@@ -288,6 +296,17 @@ module Graffle
|
|
288
296
|
Point.new(self['Points'][0])
|
289
297
|
end
|
290
298
|
|
299
|
+
# A quick way to get the lines from a text's label (as plain text).
|
300
|
+
# If the line doesn't have a label, label_lines returns the empty array.
|
301
|
+
def label_lines
|
302
|
+
if label
|
303
|
+
label.content.as_lines
|
304
|
+
else
|
305
|
+
label || []
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
|
291
310
|
private
|
292
311
|
def points_at(*points)
|
293
312
|
self['Points'] = points.collect { |p| "{#{p[0]}, #{p[1]}}" }
|
@@ -422,25 +441,19 @@ module Graffle
|
|
422
441
|
# Strip all the styling from the RTF string and return it as
|
423
442
|
# humble ASCII.
|
424
443
|
def as_plain_text
|
425
|
-
|
444
|
+
as_lines.join("\n")
|
426
445
|
end
|
427
446
|
|
428
|
-
# Return an array of
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
#
|
434
|
-
|
435
|
-
#
|
436
|
-
# the method returns:
|
437
|
-
#
|
438
|
-
# [ ['He visits the', 'login', 'page.']
|
439
|
-
# ['His login is', 'peter', 'his password is', 'paul']]
|
440
|
-
#
|
441
|
-
# There's more to come here.
|
442
|
-
def as_tokens_within_lines
|
443
|
-
StyledTextReader.new(self.as_rtf).as_tokens_within_lines
|
447
|
+
# Return an array of lines, each line as_plain_text.
|
448
|
+
def as_lines
|
449
|
+
StyledTextReader.new(self.as_rtf).as_lines
|
450
|
+
end
|
451
|
+
|
452
|
+
class Null # Null object for text
|
453
|
+
def as_lines; []; end
|
444
454
|
end
|
455
|
+
|
445
456
|
end
|
457
|
+
|
458
|
+
|
446
459
|
end
|
data/lib/graffle/version.rb
CHANGED
data/lib/grail_test.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Brian Marick on 2007-07-10.
|
4
|
+
# Copyright (c) 2007. All rights reserved.
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
require 'graffle'
|
9
|
+
require 'grail_test/command-interpreters'
|
10
|
+
|
11
|
+
# See README.txt[link:files/README_txt.html]
|
12
|
+
module GrailTest
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
GrailTests=GrailTest # Be tolerant of typos
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'enumerator'
|
2
|
+
|
3
|
+
module GrailTest
|
4
|
+
|
5
|
+
class GraphicInterpreter
|
6
|
+
|
7
|
+
def initialize(graphics, hash = {})
|
8
|
+
@graphics = graphics
|
9
|
+
@line_label_strategy =
|
10
|
+
hash['interpret line labels as'] || DoNothingCommands
|
11
|
+
@shaped_graphic_text_strategy =
|
12
|
+
hash['interpret shaped graphic text as'] || DoNothingCommands
|
13
|
+
end
|
14
|
+
|
15
|
+
def run_against(target)
|
16
|
+
@target = target
|
17
|
+
@graphics.each do |g|
|
18
|
+
case g.stereotype.basename
|
19
|
+
when "ShapedGraphic"
|
20
|
+
process_commands(@shaped_graphic_text_strategy.new,
|
21
|
+
g.content.as_lines)
|
22
|
+
when "LineGraphic"
|
23
|
+
process_commands(@line_label_strategy.new,
|
24
|
+
g.label_lines)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def process_commands(command_maker, command_lines)
|
32
|
+
command_lines.each do |line|
|
33
|
+
info = command_maker.produce_method_call(line)
|
34
|
+
@target.send(*info)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
class CommandsWithQuotedArgs
|
41
|
+
|
42
|
+
def produce_method_call(string)
|
43
|
+
quote_marker = '%<<<==-'
|
44
|
+
|
45
|
+
string = string.gsub(/(\w)'(\w)/, "#{quote_marker}\\1\\2#{quote_marker}")
|
46
|
+
tokens = string.split(/['"],?/, allow_trailing_null_fields = -1)
|
47
|
+
message = tokens[0].strip
|
48
|
+
args = tokens[1..-1]
|
49
|
+
|
50
|
+
|
51
|
+
message.gsub!(/#{quote_marker}(.)(.)#{quote_marker}/, "\\1\\2")
|
52
|
+
message.gsub!(/\s+/,'_')
|
53
|
+
message.gsub!(/-/, '_')
|
54
|
+
message.gsub!(/\W/, '')
|
55
|
+
|
56
|
+
|
57
|
+
args = args.enum_slice(2).collect { |e| e[0] }
|
58
|
+
args = args.collect do | arg |
|
59
|
+
arg.gsub(/#{quote_marker}(.)(.)#{quote_marker}/, "\\1'\\2")
|
60
|
+
end
|
61
|
+
|
62
|
+
[message] + args
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class Destinations
|
67
|
+
def produce_method_call(string)
|
68
|
+
['assert_on_page', string.downcase]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class DoNothingCommands
|
73
|
+
def produce_method_call(string)
|
74
|
+
[:object_id] # no_op
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Brian Marick on 2007-07-06.
|
4
|
+
# Copyright (c) 2007. All rights reserved.
|
5
|
+
|
6
|
+
require "../set-standalone-test-paths.rb" unless $started_from_rakefile
|
7
|
+
require 'test/grails-tests/translation-testcase'
|
8
|
+
|
9
|
+
class TestCommandsFromQuotedArgs < TranslationTestCase
|
10
|
+
|
11
|
+
|
12
|
+
# TODO: put this somewhere right.
|
13
|
+
PLAIN = ['John follows "sign up" link',
|
14
|
+
'he logs in with "john", password "fred", and auth key "foo".',
|
15
|
+
'plain command with trailing period',
|
16
|
+
'Plain command - (upper case and special chars)'
|
17
|
+
]
|
18
|
+
|
19
|
+
# TODO: put this somewhere right.
|
20
|
+
RTF = %Q{
|
21
|
+
| {\\rtf1\\mac\\ansicpg10000\\cocoartf824\\cocoasubrtf420
|
22
|
+
| {\\fonttbl\\f0\\fswiss\\fcharset77 Helvetica;}
|
23
|
+
| {\\colortbl;\\red255\\green255\\blue255;}
|
24
|
+
| \\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\qc\\pardirnatural
|
25
|
+
|
|
26
|
+
| \\f0\\fs24 \\cf0 #{PLAIN[0]}\\
|
27
|
+
| #{PLAIN[1]}\\
|
28
|
+
| #{PLAIN[2]}\\
|
29
|
+
| #{PLAIN[3]}}}.trim('|')
|
30
|
+
|
31
|
+
|
32
|
+
def setup
|
33
|
+
@interpreter = CommandsWithQuotedArgs.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_translation
|
37
|
+
# Underscoring
|
38
|
+
assert_translation(['token'], "token")
|
39
|
+
assert_translation(['underscore_separated_tokens'],
|
40
|
+
'underscore separated tokens'
|
41
|
+
)
|
42
|
+
assert_translation(['whitespace_is_handled_intelligently'],
|
43
|
+
" whitespace\tis handled intelligently "
|
44
|
+
)
|
45
|
+
assert_translation(['here_is_an', 'argument'],
|
46
|
+
'here is an "argument"'
|
47
|
+
)
|
48
|
+
assert_translation(['single_spaces_are_args', 'too '],
|
49
|
+
" single spaces are args 'too ' "
|
50
|
+
)
|
51
|
+
assert_translation(['multiple', 'arguments', "work"],
|
52
|
+
%q{multiple 'arguments' "work"}
|
53
|
+
)
|
54
|
+
assert_translation(['only_the', 'prefix', "command"],
|
55
|
+
%q{only the 'prefix' is included in the 'command'}
|
56
|
+
)
|
57
|
+
|
58
|
+
assert_translation(['arguments_can', 'be', 'comma', "separated"],
|
59
|
+
%q{arguments can 'be', 'comma', and 'separated'}
|
60
|
+
)
|
61
|
+
|
62
|
+
assert_translation(['stuff_after_the', 'last', 'argument'],
|
63
|
+
%q{stuff after the 'last' 'argument' is ignored.}
|
64
|
+
)
|
65
|
+
|
66
|
+
assert_translation(['even_if_it_is_just', 'a period'],
|
67
|
+
%q{even if it is just 'a period'.}
|
68
|
+
)
|
69
|
+
|
70
|
+
assert_translation(['the_method_ignores_punctuation'],
|
71
|
+
%q{the method (ignores) punctuation.}
|
72
|
+
)
|
73
|
+
|
74
|
+
assert_translation(['except_that_dashes_become_underscore'],
|
75
|
+
%q{except that dashes become-underscore}
|
76
|
+
)
|
77
|
+
|
78
|
+
assert_translation(["its_possible_to_have_quotes_within_words"],
|
79
|
+
%q{it's possible to have quotes within words}
|
80
|
+
)
|
81
|
+
|
82
|
+
assert_translation(["while_a_messages_quotes_are_stripped", "an argument's are retained"],
|
83
|
+
%q{while a message's quotes are stripped, "an argument's are retained"}
|
84
|
+
)
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Brian Marick on 2007-07-06.
|
4
|
+
# Copyright (c) 2007. All rights reserved.
|
5
|
+
|
6
|
+
require "../set-standalone-test-paths.rb" unless $started_from_rakefile
|
7
|
+
require 'test/grails-tests/translation-testcase'
|
8
|
+
|
9
|
+
class TestDestinationCheckCreation < TranslationTestCase
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@interpreter = Destinations.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_translation
|
16
|
+
assert_translation(['assert_on_page', "markup"],
|
17
|
+
"MARKUP")
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Brian Marick on 2007-07-06.
|
4
|
+
# Copyright (c) 2007. All rights reserved.
|
5
|
+
|
6
|
+
require "../set-standalone-test-paths.rb" unless $started_from_rakefile
|
7
|
+
require 'test/grails-tests/translation-testcase'
|
8
|
+
|
9
|
+
class TestCommandsThatDoNothing < TranslationTestCase
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@interpreter = DoNothingCommands.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_translation
|
16
|
+
assert_translation([:object_id], "MARKUP")
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Brian Marick on 2007-07-10.
|
4
|
+
# Copyright (c) 2007. All rights reserved.
|
5
|
+
|
6
|
+
require 'test/unit'
|
7
|
+
require 's4t-utils'
|
8
|
+
include S4tUtils
|
9
|
+
|
10
|
+
require "../set-standalone-test-paths.rb" unless $started_from_rakefile
|
11
|
+
require 'test/grails-tests/translation-testcase'
|
12
|
+
|
13
|
+
require 'extensions/string'
|
14
|
+
require 'grail_test'
|
15
|
+
|
16
|
+
|
17
|
+
class GraphicInterpreterTest < Test::Unit::TestCase
|
18
|
+
include Graffle::Builders
|
19
|
+
include GrailTest
|
20
|
+
|
21
|
+
class CommandRecorder
|
22
|
+
attr_reader :record
|
23
|
+
def initialize
|
24
|
+
@record = []
|
25
|
+
end
|
26
|
+
|
27
|
+
def method_missing(message, *args)
|
28
|
+
@record << "#{message}(" + args.collect { | a | a.inspect }.join(", ") + ')'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def two_graphics
|
33
|
+
s = sheet {
|
34
|
+
with line_label {
|
35
|
+
for_line 1
|
36
|
+
with_text 'produce "argument"'
|
37
|
+
}
|
38
|
+
with line_graphic {
|
39
|
+
graffle_id_is 1
|
40
|
+
}
|
41
|
+
with shaped_graphic {
|
42
|
+
graffle_id_is 2
|
43
|
+
with_text "SIGNUP"
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
[s.find_by_id(1), s.find_by_id(2)]
|
48
|
+
end
|
49
|
+
|
50
|
+
def assert_commands_produced(expected, interpreter)
|
51
|
+
recorder = CommandRecorder.new
|
52
|
+
interpreter.run_against(recorder)
|
53
|
+
assert_equal(expected, recorder.record)
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def test_interpreter_applies_strategies
|
58
|
+
interpreter = GraphicInterpreter.new(two_graphics,
|
59
|
+
'interpret line labels as' => CommandsWithQuotedArgs,
|
60
|
+
'interpret shaped graphic text as' => Destinations)
|
61
|
+
assert_commands_produced(['produce("argument")', 'assert_on_page("signup")'],
|
62
|
+
interpreter)
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
def test_interpreter_can_omit_strategies
|
67
|
+
interpreter = GraphicInterpreter.new(two_graphics)
|
68
|
+
assert_commands_produced([], interpreter)
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Brian Marick on 2007-07-10.
|
4
|
+
# Copyright (c) 2007. All rights reserved.
|
5
|
+
|
6
|
+
|
7
|
+
require 'test/unit'
|
8
|
+
require 's4t-utils'
|
9
|
+
include S4tUtils
|
10
|
+
|
11
|
+
require 'extensions/string'
|
12
|
+
require 'grail_test'
|
13
|
+
|
14
|
+
|
15
|
+
class TranslationTestCase < Test::Unit::TestCase
|
16
|
+
include GrailTests
|
17
|
+
|
18
|
+
def test_default; "quiet, test/unit!"; end
|
19
|
+
|
20
|
+
def assert_translation(expected, original)
|
21
|
+
actual = @interpreter.produce_method_call(original)
|
22
|
+
assert_equal(expected, actual)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/test/line-graphic-tests.rb
CHANGED
@@ -151,5 +151,15 @@ class TestLineGraphics < Test::Unit::TestCase
|
|
151
151
|
assert_equal("the line has a label", line.label_rtf.as_plain_text)
|
152
152
|
end
|
153
153
|
|
154
|
+
def test_a_quick_way_to_get_to_label_text_as_lines
|
155
|
+
line = line_label_sheet.find_by_id(1)
|
156
|
+
assert_equal(["the line has a label"], line.label_lines)
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_missing_labels_can_be_asked_for_their_nonexistent_lines
|
160
|
+
line = sheet { with line_graphic }.graphics.first
|
161
|
+
assert_equal([], line.label_lines)
|
162
|
+
end
|
163
|
+
|
154
164
|
|
155
165
|
end
|