skeptick 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +584 -0
  5. data/Rakefile +10 -0
  6. data/foo.rb +1 -0
  7. data/lib/skeptick.rb +2 -0
  8. data/lib/skeptick/chain.rb +55 -0
  9. data/lib/skeptick/chain/dsl_context.rb +21 -0
  10. data/lib/skeptick/command.rb +46 -0
  11. data/lib/skeptick/convert.rb +109 -0
  12. data/lib/skeptick/convert/dsl_context.rb +27 -0
  13. data/lib/skeptick/core.rb +46 -0
  14. data/lib/skeptick/error.rb +4 -0
  15. data/lib/skeptick/helper.rb +26 -0
  16. data/lib/skeptick/image.rb +69 -0
  17. data/lib/skeptick/image/dsl_context.rb +29 -0
  18. data/lib/skeptick/railtie.rb +8 -0
  19. data/lib/skeptick/sugar.rb +8 -0
  20. data/lib/skeptick/sugar/composition.rb +55 -0
  21. data/lib/skeptick/sugar/debugging.rb +12 -0
  22. data/lib/skeptick/sugar/drawing.rb +32 -0
  23. data/lib/skeptick/sugar/edges.rb +70 -0
  24. data/lib/skeptick/sugar/formatting.rb +12 -0
  25. data/lib/skeptick/sugar/geometry.rb +38 -0
  26. data/lib/skeptick/sugar/resizing.rb +16 -0
  27. data/lib/skeptick/sugar/sequence_manipulation.rb +43 -0
  28. data/lib/skeptick/version.rb +3 -0
  29. data/logo.png +0 -0
  30. data/logo.rb +45 -0
  31. data/refresh_preview.scpt +2 -0
  32. data/skeptick.gemspec +21 -0
  33. data/test/chain_test.rb +94 -0
  34. data/test/convert_test.rb +177 -0
  35. data/test/image_test.rb +145 -0
  36. data/test/sugar/composition_test.rb +273 -0
  37. data/test/sugar/debugging_test.rb +24 -0
  38. data/test/sugar/drawing_test.rb +86 -0
  39. data/test/sugar/edges_test.rb +99 -0
  40. data/test/sugar/formatting_test.rb +19 -0
  41. data/test/sugar/geometry_test.rb +92 -0
  42. data/test/sugar/resizing_test.rb +25 -0
  43. data/test/sugar/sequence_manipulation_test.rb +98 -0
  44. data/test/test_helper.rb +11 -0
  45. metadata +117 -0
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'test'
6
+ t.test_files = FileList['test/**/*_test.rb']
7
+ t.verbose = true
8
+ end
9
+
10
+ task :default => :test
data/foo.rb ADDED
@@ -0,0 +1 @@
1
+ require 'minitest/autorun'; class FooTest < MiniTest::Unit::TestCase; def test_foo; assert_equal('0x0', '0x1') end end
@@ -0,0 +1,2 @@
1
+ require 'skeptick/core'
2
+ require 'skeptick/sugar'
@@ -0,0 +1,55 @@
1
+ require 'skeptick/helper'
2
+ require 'skeptick/convert'
3
+ require 'skeptick/chain/dsl_context'
4
+ require 'skeptick/command'
5
+
6
+ module Skeptick
7
+ class Chain
8
+ include Command::Executable
9
+
10
+ PIPE = 'miff:-'
11
+
12
+ def initialize(context, *args, &blk)
13
+ options = Helper.extract_options!(args)
14
+ @to = options[:to]
15
+ @context = context
16
+ @block = blk
17
+ reset
18
+ end
19
+
20
+ def convert(*args, &blk)
21
+ @executables << Convert.new(@context, *args, &blk)
22
+ end
23
+
24
+ def piping?
25
+ @executables.last && @executables.last.piping?
26
+ end
27
+
28
+ def process_method_missing(*args, &blk)
29
+ @context.send(*args, &blk)
30
+ end
31
+
32
+ def to_s
33
+ process_dsl
34
+ @executables.map(&:command).join(' | ')
35
+ end
36
+
37
+ def inspect
38
+ "Skeptick::Chain(#{to_s})"
39
+ end
40
+
41
+ private
42
+ def reset
43
+ @executables = []
44
+ end
45
+
46
+ def process_dsl
47
+ reset
48
+ DslContext.new(self).instance_eval(&@block)
49
+
50
+ if @executables.size > 0 && @to && piping?
51
+ @executables.last.destination = @to
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,21 @@
1
+ module Skeptick
2
+ class Chain
3
+ class DslContext
4
+ def initialize(chain)
5
+ @chain = chain
6
+ end
7
+
8
+ def convert(*args, &blk)
9
+ @chain.convert(*args, &blk)
10
+ end
11
+
12
+ def pipe_or(path)
13
+ @chain.piping? ? :pipe : path
14
+ end
15
+
16
+ def method_missing(*args, &blk)
17
+ @chain.process_method_missing(*args, &blk)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,46 @@
1
+ require 'shellwords'
2
+ require 'posix/spawn'
3
+ require 'skeptick/error'
4
+
5
+ module Skeptick
6
+ class Command
7
+ module Executable
8
+ def command
9
+ Command.new(self)
10
+ end
11
+
12
+ def execute
13
+ command.run
14
+ end
15
+ alias_method :build, :execute
16
+ alias_method :run, :execute
17
+ end
18
+
19
+ def initialize(command_obj)
20
+ @command_obj = command_obj
21
+ end
22
+
23
+ def command
24
+ @command_obj.to_s.shellsplit.shelljoin
25
+ end
26
+ alias_method :to_s, :command
27
+
28
+ def run
29
+ opts = {}
30
+ opts[:chdir] = Skeptick.cd_path.to_s if Skeptick.cd_path
31
+
32
+ if Skeptick.debug_mode?
33
+ Skeptick.log("Skeptick Command: #{command}")
34
+ end
35
+
36
+ im_process = POSIX::Spawn::Child.new(command, opts)
37
+
38
+ if !im_process.success?
39
+ raise ImageMagickError,
40
+ "ImageMagick error\nCommand: #{command}\nSTDERR:\n#{im_process.err}"
41
+ end
42
+
43
+ im_process.status
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,109 @@
1
+ require 'skeptick/helper'
2
+ require 'skeptick/image'
3
+ require 'skeptick/chain'
4
+ require 'skeptick/convert/dsl_context'
5
+ require 'skeptick/command'
6
+
7
+ module Skeptick
8
+ class Convert
9
+ include Command::Executable
10
+
11
+ attr_accessor :prepends, :appends
12
+
13
+ def initialize(context, *args, &blk)
14
+ @context = context
15
+ @options = Helper.extract_options!(args)
16
+ @args = args.map {|a| Image.new(@context, a)}
17
+ @block = blk
18
+ @to = parse_pipe(@options[:to])
19
+ @inner = false
20
+
21
+ @beginning = nil
22
+ @ending = nil
23
+ @prepends = []
24
+ @appends = []
25
+
26
+ reset
27
+ end
28
+
29
+ def prepend(*args)
30
+ @prepends << Helper.process_args(*args)
31
+ end
32
+
33
+ def append(*args)
34
+ @appends << Helper.process_args(*args)
35
+ end
36
+
37
+ def set(*args)
38
+ @objects << Helper.process_args(*args)
39
+ end
40
+ alias_method :apply, :set
41
+ alias_method :with, :set
42
+
43
+
44
+ def convert(*args, &blk)
45
+ Convert.new(@context, *args, &blk).tap do |c_obj|
46
+ @objects << Image.new(@context, c_obj)
47
+ end
48
+ end
49
+
50
+ def image(obj = nil, &blk)
51
+ @objects << Image.new(@context, obj, &blk)
52
+ end
53
+
54
+ def destination=(to)
55
+ if inner?
56
+ raise 'cannot assign output to parentheses-wrapped image conversion'
57
+ else
58
+ @to = to
59
+ end
60
+ end
61
+
62
+ def piping?
63
+ !inner? && parts.last == Chain::PIPE
64
+ end
65
+
66
+ def become_inner
67
+ @inner = true
68
+ self
69
+ end
70
+
71
+ def parts
72
+ reset
73
+ @objects = []
74
+ DslContext.new(self).instance_eval(&@block) if @block
75
+ wrap
76
+ [@beginning, *@prepends, *@args, *@objects, *@appends, @ending].compact
77
+ end
78
+
79
+ def to_s
80
+ parts.join(' ')
81
+ end
82
+
83
+ def inspect
84
+ "Skeptick::Convert(#{to_s})"
85
+ end
86
+
87
+ def process_method_missing(*args, &blk)
88
+ @context.send(*args, &blk)
89
+ end
90
+
91
+ private
92
+ def reset
93
+ @objects = []
94
+ end
95
+
96
+ def inner?
97
+ @inner
98
+ end
99
+
100
+ def wrap
101
+ @beginning = inner? ? '(' : 'convert'
102
+ @ending = inner? ? ')' : @to || Chain::PIPE
103
+ end
104
+
105
+ def parse_pipe(obj)
106
+ obj == :pipe ? Chain::PIPE : obj
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,27 @@
1
+ module Skeptick
2
+ class Convert
3
+ class DslContext
4
+ def initialize(convert)
5
+ @convert = convert
6
+ end
7
+
8
+ def set(*args)
9
+ @convert.set(*args)
10
+ end
11
+ alias_method :apply, :set
12
+ alias_method :with, :set
13
+
14
+ def convert(*args, &blk)
15
+ @convert.convert(*args, &blk)
16
+ end
17
+
18
+ def image(obj = nil, &blk)
19
+ @convert.image(obj, &blk)
20
+ end
21
+
22
+ def method_missing(*args, &blk)
23
+ @convert.process_method_missing(*args, &blk)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,46 @@
1
+ require 'skeptick/version'
2
+ require 'skeptick/convert'
3
+ require 'skeptick/image'
4
+ require 'skeptick/chain'
5
+ require 'skeptick/railtie' if defined?(Rails)
6
+
7
+ module Skeptick
8
+ class << self
9
+ attr_writer :debug_mode,
10
+ :logger,
11
+ :logger_method,
12
+ :cd_path
13
+
14
+ def log(message)
15
+ @logger ||= ::STDOUT
16
+
17
+ @logger_method ||=
18
+ if @logger.respond_to?(:debug); :debug
19
+ elsif @logger.respond_to?(:puts); :puts
20
+ else :write
21
+ end
22
+
23
+ @logger.public_send(@logger_method, message)
24
+ end
25
+
26
+ def debug_mode?
27
+ @debug_mode
28
+ end
29
+
30
+ def cd_path
31
+ @cd_path
32
+ end
33
+ end
34
+
35
+ def convert(*args, &blk)
36
+ Skeptick::Convert.new(self, *args, &blk)
37
+ end
38
+
39
+ def image(*args, &blk)
40
+ Skeptick::Image.new(self, *args, &blk)
41
+ end
42
+
43
+ def chain(*args, &blk)
44
+ Skeptick::Chain.new(self, *args, &blk)
45
+ end
46
+ end
@@ -0,0 +1,4 @@
1
+ module Skeptick
2
+ class ImageMagickError < RuntimeError
3
+ end
4
+ end
@@ -0,0 +1,26 @@
1
+ module Skeptick
2
+ module Helper
3
+ module_function
4
+
5
+ def extract_options!(array)
6
+ array.last.is_a?(Hash) ? array.pop : {}
7
+ end
8
+
9
+ def object_to_index_range_list(obj)
10
+ case obj
11
+ when Integer, String
12
+ obj
13
+ when Range
14
+ "#{obj.min}-#{obj.max}"
15
+ when Array
16
+ obj.join(',')
17
+ else
18
+ raise "invalid sequence reference"
19
+ end
20
+ end
21
+
22
+ def process_args(*args)
23
+ args.map{ |arg| arg.is_a?(Symbol) ? "-#{arg.to_s}" : arg }.join(' ')
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,69 @@
1
+ require 'skeptick/helper'
2
+ require 'skeptick/convert'
3
+ require 'skeptick/chain'
4
+ require 'skeptick/image/dsl_context'
5
+
6
+ module Skeptick
7
+ class Image
8
+ attr_accessor :prepends, :appends
9
+
10
+ def initialize(context, obj = nil, &blk)
11
+ @context = context
12
+ @obj = obj || blk
13
+ reset
14
+ end
15
+
16
+ def set(*args)
17
+ @prepends << Helper.process_args(*args)
18
+ end
19
+
20
+ def apply(*args)
21
+ @appends << Helper.process_args(*args)
22
+ end
23
+
24
+ def image(obj, &blk)
25
+ @image = Image.new(@context, obj, &blk)
26
+ end
27
+
28
+ def convert(*args, &blk)
29
+ @image = Convert.new(@context, *args, &blk).become_inner
30
+ end
31
+
32
+ def process_method_missing(*args, &blk)
33
+ @context.send(*args, &blk)
34
+ end
35
+
36
+ def to_s
37
+ parts.join(' ')
38
+ end
39
+
40
+ def inspect
41
+ "Skeptick::Image(#{to_s})"
42
+ end
43
+
44
+ def parts
45
+ case @obj
46
+ when :pipe then [ Chain::PIPE ]
47
+ when Convert then @obj.become_inner.parts
48
+ when Image then @obj.parts
49
+ when Array then @obj
50
+ when Proc then build_parts
51
+ else [ @obj ]
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def build_parts
58
+ reset
59
+ DslContext.new(self).instance_eval(&@obj)
60
+ [*@prepends, @image, *@appends].compact
61
+ end
62
+
63
+ def reset
64
+ @image = nil
65
+ @prepends = []
66
+ @appends = []
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,29 @@
1
+ module Skeptick
2
+ class Image
3
+ class DslContext
4
+ def initialize(image)
5
+ @image = image
6
+ end
7
+
8
+ def set(*args)
9
+ @image.set(*args)
10
+ end
11
+
12
+ def apply(*args)
13
+ @image.apply(*args)
14
+ end
15
+
16
+ def image(obj)
17
+ @image.image(obj)
18
+ end
19
+
20
+ def convert(*args, &blk)
21
+ @image.convert(*args, &blk)
22
+ end
23
+
24
+ def method_missing(*args, &blk)
25
+ @image.process_method_missing(*args, &blk)
26
+ end
27
+ end
28
+ end
29
+ end