graffle 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/History.txt +2 -0
  2. data/LICENSE.txt +34 -0
  3. data/Manifest.txt +53 -0
  4. data/README.txt +19 -0
  5. data/Rakefile +32 -0
  6. data/Rakefile.hoe +23 -0
  7. data/bin/bin-skeleton +23 -0
  8. data/graffle.tmproj +335 -0
  9. data/lib/graffle.rb +43 -0
  10. data/lib/graffle/.document +4 -0
  11. data/lib/graffle/lib-skeleton +3 -0
  12. data/lib/graffle/nodoc/hacks.rb +69 -0
  13. data/lib/graffle/point.rb +42 -0
  14. data/lib/graffle/stereotypes.rb +446 -0
  15. data/lib/graffle/styled-text-reader.rb +52 -0
  16. data/lib/graffle/third-party/s4t-utils.rb +21 -0
  17. data/lib/graffle/third-party/s4t-utils/capturing-globals.rb +78 -0
  18. data/lib/graffle/third-party/s4t-utils/claims.rb +14 -0
  19. data/lib/graffle/third-party/s4t-utils/command-line.rb +15 -0
  20. data/lib/graffle/third-party/s4t-utils/error-handling.rb +20 -0
  21. data/lib/graffle/third-party/s4t-utils/friendly-format.rb +27 -0
  22. data/lib/graffle/third-party/s4t-utils/hacks.rb +32 -0
  23. data/lib/graffle/third-party/s4t-utils/load-path-auto-adjuster.rb +120 -0
  24. data/lib/graffle/third-party/s4t-utils/more-assertions.rb +29 -0
  25. data/lib/graffle/third-party/s4t-utils/os.rb +28 -0
  26. data/lib/graffle/third-party/s4t-utils/rake-task-helpers.rb +75 -0
  27. data/lib/graffle/third-party/s4t-utils/rakefile-common.rb +106 -0
  28. data/lib/graffle/third-party/s4t-utils/svn-file-movement.rb +101 -0
  29. data/lib/graffle/third-party/s4t-utils/test-util.rb +19 -0
  30. data/lib/graffle/third-party/s4t-utils/version.rb +3 -0
  31. data/lib/graffle/version.rb +8 -0
  32. data/setup.rb +1585 -0
  33. data/test/abstract-graphic-tests.rb +56 -0
  34. data/test/array-and-hash-stereotyping-tests.rb +49 -0
  35. data/test/document-tests.rb +117 -0
  36. data/test/graffle-file-types/as-a-package.graffle/data.plist +953 -0
  37. data/test/graffle-file-types/as-a-package.graffle/image1.png +0 -0
  38. data/test/graffle-file-types/as-a-package.graffle/image2.png +0 -0
  39. data/test/graffle-file-types/as-a-package.graffle/image3.png +0 -0
  40. data/test/graffle-file-types/multiple-canvases.graffle +6821 -0
  41. data/test/graffle-file-types/opening-tests.rb +45 -0
  42. data/test/graffle-file-types/two-boxes-and-a-line.graffle +347 -0
  43. data/test/group-tests.rb +109 -0
  44. data/test/hacks-tests.rb +58 -0
  45. data/test/line-graphic-tests.rb +155 -0
  46. data/test/point-tests.rb +43 -0
  47. data/test/set-standalone-test-paths.rb +5 -0
  48. data/test/shaped-graphic-tests.rb +93 -0
  49. data/test/sheet-tests.rb +124 -0
  50. data/test/styled-text-reader-tests.rb +89 -0
  51. data/test/test-skeleton +19 -0
  52. data/test/text-tests.rb +55 -0
  53. data/test/util.rb +15 -0
  54. metadata +139 -0
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Brian Marick on 2007-07-06.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+
7
+ module Graffle
8
+
9
+ class StyledTextReader # :nodoc:
10
+ attr_reader :raw_text
11
+
12
+ def initialize(string)
13
+ @raw_text = string
14
+ end
15
+
16
+ def is_rtf?
17
+ @raw_text.starts_with?("{\\rtf")
18
+ end
19
+
20
+ def without_rtf_header
21
+ lines = @raw_text.split("\n")
22
+ return lines unless self.is_rtf?
23
+
24
+ lines.each_with_index do | elt, index |
25
+ unless elt.starts_with?("\\") or elt.starts_with?("{")
26
+ index += 1 # skip past blank line
27
+ return lines[index..-1]
28
+ end
29
+ end
30
+ end
31
+
32
+ def as_lines
33
+ lines = without_rtf_header
34
+ return lines unless self.is_rtf?
35
+
36
+ lines = lines.reject { |line| line.starts_with?("\\par") }
37
+ lines.collect do |line|
38
+ line = line.gsub(/^\\f\d\\fs\d\d \\cf\d /, '')
39
+ line = line.gsub(/\}$/, '')
40
+ line = line.gsub(/\\$/, '')
41
+ end
42
+ end
43
+
44
+ def as_tokens_within_lines
45
+ self.as_lines.collect do |line|
46
+ line.split(/",?/).collect { |tok| tok.strip }
47
+ end
48
+ end
49
+ end
50
+
51
+
52
+ end
@@ -0,0 +1,21 @@
1
+ require 's4t-utils/capturing-globals'
2
+ require 's4t-utils/error-handling'
3
+ require 's4t-utils/more-assertions'
4
+ require 's4t-utils/claims'
5
+ require 's4t-utils/friendly-format'
6
+ require 's4t-utils/rake-task-helpers'
7
+ require 's4t-utils/svn-file-movement'
8
+ require 's4t-utils/hacks'
9
+ require 's4t-utils/command-line'
10
+ require 's4t-utils/test-util'
11
+ require 's4t-utils/os'
12
+
13
+ require 'pp'
14
+
15
+ # Tolerate typos
16
+ S4TUtils=S4tUtils
17
+ S4tUtil=S4tUtils
18
+ S4TUtil=S4tUtils
19
+
20
+ module S4tUtils
21
+ end
@@ -0,0 +1,78 @@
1
+ require 'stringio'
2
+
3
+ module S4tUtils
4
+
5
+ module_function
6
+
7
+ def capturing_stderr
8
+ old_stderr = $stderr
9
+ new_stderr = StringIO.new
10
+ begin
11
+ $stderr = new_stderr
12
+ yield
13
+ ensure
14
+ $stderr = old_stderr
15
+ end
16
+ new_stderr.string
17
+ end
18
+
19
+ def with_environment_vars(settings)
20
+ begin
21
+ old = {}
22
+ settings.each { | key, value |
23
+ old[key] = ENV[key]
24
+ ENV[key] = value
25
+ }
26
+ yield
27
+ ensure
28
+ settings.each_key { | key |
29
+ ENV[key] = old[key]
30
+ }
31
+ end
32
+ end
33
+
34
+ def with_home_right_here
35
+ begin
36
+ old_home = ENV['HOME']
37
+ ENV['HOME'] = '.'
38
+ yield
39
+ ensure
40
+ ENV['HOME'] = @old_home
41
+ end
42
+ end
43
+
44
+ def erasing_local_config_file(file)
45
+ with_home_right_here {
46
+ begin
47
+ File.delete(file) if File.exist?(file)
48
+ yield
49
+ ensure
50
+ File.delete(file) if File.exist?(file)
51
+ end
52
+ }
53
+ end
54
+
55
+ def with_local_config_file(file, contents)
56
+ erasing_local_config_file(file) do
57
+ File.open(file, 'w') do | io |
58
+ io.puts(contents.to_s)
59
+ end
60
+ yield
61
+ end
62
+ end
63
+
64
+ def with_command_args(string)
65
+ begin
66
+ old_argv = ARGV.dup
67
+ ARGV.replace(string.split)
68
+ yield
69
+ rescue SystemExit => ex
70
+ replacement = StandardError.new(ex.message)
71
+ replacement.set_backtrace(ex.backtrace)
72
+ raise replacement
73
+ ensure
74
+ ARGV.replace(old_argv)
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,14 @@
1
+ module S4tUtils
2
+
3
+ module_function
4
+
5
+ def user_claims(fact, &block)
6
+ raise StandardError.new(block.call) unless fact
7
+ end
8
+
9
+ def user_disputes(fact, &block)
10
+ user_claims(!fact, &block)
11
+ end
12
+ end
13
+
14
+
@@ -0,0 +1,15 @@
1
+ module S4tUtils
2
+
3
+ module_function
4
+
5
+ def ask(default_answer, *question_lines)
6
+ puts question_lines
7
+ print "[#{default_answer}] => "
8
+ answer = STDIN.readline.strip
9
+ answer = default_answer.to_s if answer == ''
10
+ answer
11
+ end
12
+
13
+ end
14
+
15
+
@@ -0,0 +1,20 @@
1
+ module S4tUtils
2
+
3
+ module_function
4
+
5
+ def with_pleasant_exceptions
6
+ yield
7
+ rescue SystemExit
8
+ raise
9
+ rescue Exception => ex
10
+ $stderr.puts(ex.message)
11
+ end
12
+
13
+ # with_pleasant_exceptions swallows the stack trace, which you
14
+ # want to see during debugging. The easy way to see it is to add
15
+ # 'out' to the method, giving this:
16
+ def without_pleasant_exceptions
17
+ $stderr.puts "Note: exception handling turned off."
18
+ yield
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ # Note: see also <http://englishext.rubyforge.org/>
2
+
3
+ module S4tUtils
4
+
5
+ module_function
6
+
7
+ def friendly_list(connector, array)
8
+ quoted = array.collect { | elt | "'" + elt.to_s + "'" }
9
+ case array.length
10
+ when 0
11
+ ""
12
+ when 1
13
+ quoted[0]
14
+ when 2
15
+ quoted[0] + " #{connector} " + quoted[1]
16
+ else
17
+ quoted[0...-1].join(", ") + ", #{connector} #{quoted.last}"
18
+ end
19
+ end
20
+
21
+ # Produces a version of a string that can be typed after a :
22
+ # (Can also be safely given at a command-line prompt.
23
+ def symbol_safe_name(name)
24
+ name.to_s.gsub(/\W/, '')
25
+ end
26
+ end
27
+
@@ -0,0 +1,32 @@
1
+ module S4tUtils
2
+
3
+ module_function
4
+
5
+ def prog1(retval)
6
+ yield(retval)
7
+ retval
8
+ end
9
+
10
+ # Allow debugging like this:
11
+ # x = pi y # adding pi doesn't change effect of x=y
12
+ def pi(arg, leader=nil)
13
+ leader = (leader == nil) ? '' : leader + ': '
14
+ prog1(arg) { puts leader + arg.inspect }
15
+ end
16
+
17
+
18
+
19
+ class ArgForwarder
20
+ def initialize(target, *added_args)
21
+ @target = target
22
+ @added_args = added_args
23
+ end
24
+
25
+ def method_missing(method, *args)
26
+ @target.send(method, *(@added_args + args))
27
+ end
28
+ end
29
+
30
+
31
+
32
+ end
@@ -0,0 +1,120 @@
1
+ # This is loaded by an executable script in one of two cases:
2
+ #
3
+ # It's a development version living in the bin part of this directory
4
+ # structure (but it can invoked from any place).
5
+ #
6
+ # project/
7
+ # bin/
8
+ # lib/
9
+ # project/
10
+ # third-party/
11
+ # s4t-utils/
12
+ # this file
13
+ #
14
+ # It's a deployed version living in some random place, with
15
+ # the site_ruby directory in the page.
16
+ #
17
+ # site_ruby/1.8/
18
+ # project/
19
+ # third-party/
20
+ # s4t-utils/
21
+ # this file
22
+ #
23
+ #
24
+ # In order for this file to have been required in both cases, the following
25
+ # code is executed in the caller:
26
+ #
27
+ #
28
+ # $:.unshift((Pathname.new(__FILE__).parent.parent + 'lib').to_s)
29
+ # require 'package/third-party/s4t-utils/load-path-auto-adjuster'
30
+ #
31
+ # In the first case, that will put something like "../lib" on the load
32
+ # path. In the second case, it will put harmless garbage on the path
33
+ # (harmless because it won't contain this file, which will still be
34
+ # found somewhere later in the load path).
35
+ #
36
+ # The first thing this file does is pop that off, it having done its job.
37
+ # In the first (development) case, it puts the following on the load path:
38
+ # project/lib & project/lib/project/third-party & project
39
+ # ('project' is added so that <require 'test/util-file'> works.)
40
+ #
41
+ # In the second, it adds only the third-party library and takes care
42
+ # to add it just after whatever component in the path contains this
43
+ # file. (It will thus not interfere with clashing packages earlier
44
+ # in the path.)
45
+ # site_ruby/1.8/project/third-party
46
+ # since site_ruby/1.8 (or the equivalent) is already on there.
47
+
48
+ require 'rubygems'
49
+ require 'pathname'
50
+
51
+ module S4tUtils
52
+ module Hidden # This should not interfere with any namespace.
53
+
54
+ class Arranger
55
+ def initialize(third_party)
56
+ @third_party_lib = third_party
57
+ @project_lib = third_party.parent.parent
58
+ @test_util_root = @project_lib.parent
59
+ end
60
+
61
+ def self.arrange_path_around(third_party)
62
+ new(third_party).arrange
63
+ end
64
+
65
+ def arrange
66
+ add_third_party_gems
67
+ if project_lib_already_in_path?
68
+ just_add_third_party_after_project_lib
69
+ else
70
+ add_everything_at_front
71
+ end
72
+ end
73
+
74
+
75
+ def add_third_party_gems
76
+ # When RubyGems 0.8.11 gets clear_paths, it does not clear the
77
+ # cache used by Gem's overriding version of require(), so if
78
+ # this is loaded after the first Gem is required, it will have
79
+ # no effect on later uses of require(). (But it does affect
80
+ # require_gem.)
81
+ #
82
+ ENV['GEM_PATH']=(@third_party_lib+'gems').to_s
83
+ Gem.clear_paths
84
+ end
85
+
86
+ def project_lib_already_in_path?
87
+ $:.include?(@project_lib.to_s)
88
+ end
89
+
90
+ def just_add_third_party_after_project_lib
91
+ $:.each_with_index do | path_element, index |
92
+ if path_element == @project_lib.to_s
93
+ $:[index+1,0] = @third_party_lib.to_s
94
+ return
95
+ end
96
+ end
97
+ fail "No place to put third_party library."
98
+ end
99
+
100
+ def add_everything_at_front
101
+ $:.unshift(@test_util_root.to_s)
102
+ $:.unshift(@third_party_lib.to_s)
103
+ $:.unshift(@project_lib.to_s) # This is now first
104
+ end
105
+ end
106
+
107
+ def self.auto_adjust_load_path
108
+ $:.shift # Remove extra element used to find this file.
109
+
110
+ # Having loaded us, __FILE__ is something like this:
111
+ # ...lib.../package/third-party/s4t-utils/load-path-auto-adjuster.rb
112
+ relative_third_party = Pathname.new(__FILE__).parent.parent
113
+ # Pathname#real_path doesn't work on Windows (1.8.2). Grr.
114
+ third_party = Pathname.new(File.expand_path(relative_third_party.to_s))
115
+ Arranger.arrange_path_around(third_party)
116
+ end
117
+
118
+ auto_adjust_load_path
119
+ end
120
+ end
@@ -0,0 +1,29 @@
1
+ module Test
2
+ module Unit
3
+
4
+ module Assertions
5
+ def assert_true(boolean, message = nil)
6
+ assert(boolean, message)
7
+ end
8
+
9
+ def assert_false(boolean, message = nil)
10
+ _wrap_assertion do
11
+ assert_block(build_message(message, "<?> should be false or nil.", boolean)) { !boolean }
12
+ end
13
+ end
14
+
15
+ def assert_raise_with_matching_message(exception_class, message, &block)
16
+ exception = assert_raise(exception_class, &block)
17
+ assert_match(message, exception.message)
18
+ end
19
+ alias_method :assert_raises_with_matching_message,
20
+ :assert_raise_with_matching_message
21
+
22
+ def assert_wants_to_exit
23
+ assert_raise(SystemExit) do
24
+ yield
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ module S4tUtils
2
+
3
+ def self.on_windows?
4
+ Config::CONFIG["arch"] =~ /dos|win32/i
5
+ end
6
+
7
+ # Lifted this from Rubygems, which is released under the
8
+ # Ruby license.
9
+ def self.find_home # :nodoc:
10
+ ['HOME', 'USERPROFILE'].each do |homekey|
11
+ return ENV[homekey] if ENV[homekey]
12
+ end
13
+ if ENV['HOMEDRIVE'] && ENV['HOMEPATH']
14
+ return "#{ENV['HOMEDRIVE']}:#{ENV['HOMEPATH']}"
15
+ end
16
+ begin
17
+ File.expand_path("~")
18
+ rescue StandardError => ex
19
+ if File::ALT_SEPARATOR
20
+ "C:/"
21
+ else
22
+ "/"
23
+ end
24
+ end
25
+ end
26
+
27
+
28
+ end