dressmaker 0.0.1 → 0.0.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby -rubygems
2
+ require File.dirname(__FILE__) + '/../lib/dressmaker'
3
+
4
+ Dressmaker.new(ARGV[0], ARGV[1]).generate
@@ -1,10 +1,16 @@
1
1
  class Dressmaker
2
2
  class Configuration
3
3
 
4
- autoload :DirectoryRule, File.join(File.dirname(__FILE__), 'configuration', 'directory_rule')
4
+ autoload :Delegators, File.join(File.dirname(__FILE__), 'configuration', 'delegators')
5
+ autoload :Rule, File.join(File.dirname(__FILE__), 'configuration', 'rule')
6
+ autoload :FileRule, File.join(File.dirname(__FILE__), 'configuration', 'file_rule')
7
+ autoload :DirectoryRule, File.join(File.dirname(__FILE__), 'configuration', 'directory_rule')
8
+ autoload :Matcher, File.join(File.dirname(__FILE__), 'configuration', 'matcher')
9
+ autoload :FileMatcher, File.join(File.dirname(__FILE__), 'configuration', 'file_matcher')
10
+ autoload :DirectoryMatcher, File.join(File.dirname(__FILE__), 'configuration', 'directory_matcher')
5
11
 
6
12
  attr_accessor :description_holder
7
- attr_reader :options
13
+ attr_reader :options, :rules
8
14
 
9
15
  def self.load(file, options)
10
16
  configuration = new(options)
@@ -17,19 +23,19 @@ class Dressmaker
17
23
  @rules = []
18
24
  end
19
25
 
20
- def directory(directory, &block)
21
- rule = DirectoryRule.new(directory, &block)
22
- if rule.respond_to?(:description=)
23
- rule.description = description_holder
24
- self.description_holder = nil
25
- end
26
- @rules << rule
26
+ def directory
27
+ DirectoryMatcher.new(self)
28
+ end
29
+
30
+ def files
31
+ FileMatcher.new(self)
27
32
  end
28
33
 
29
34
  def process!(target)
30
- @rules.each do |rule|
31
- if rule.matches?(target)
32
- rule.execute!(target)
35
+ rules.each do |rule|
36
+ Dir.glob("#{target}/**/*") do |file|
37
+ rel_file = file[target.size, file.size]
38
+ rule.inform && rule.execute!(file) if rule.matches?(target, rel_file)
33
39
  end
34
40
  end
35
41
  end
@@ -0,0 +1,40 @@
1
+ require "delegate"
2
+
3
+ class Dressmaker
4
+ class Configuration
5
+ class Delegators
6
+
7
+ class DirectoryDelegator < SimpleDelegator
8
+ def for(pattern)
9
+ Dir["#{__getobj__.path}/#{pattern}"].each {|e| Delegators.with(e) {|wrapper_e| yield wrapper_e}}
10
+ end
11
+ end
12
+
13
+ class FileDelegator < SimpleDelegator
14
+ def gsub!(pattern, replace = nil, &block)
15
+ contents = self.read.gsub(pattern, replace, &block)
16
+ File.open(self.path, 'w') {|f| f << contents }
17
+ end
18
+
19
+ def chmod(mode)
20
+ File.chmod(mode, self.path)
21
+ end
22
+
23
+ def make_executable!
24
+ chmod(0755)
25
+ end
26
+ end
27
+
28
+ def self.with(target)
29
+ target = target.path unless target.is_a?(String)
30
+ if File.directory?(target)
31
+ yield DirectoryDelegator.new(File.open(target))
32
+ elsif File.file?(target)
33
+ yield FileDelegator.new(File.open(target))
34
+ else
35
+ yield target
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ class Dressmaker
2
+ class Configuration
3
+ class DirectoryMatcher < Matcher
4
+
5
+ attr_reader :configuration
6
+
7
+ def initialize(configuration)
8
+ @configuration = configuration
9
+ end
10
+
11
+ def matches(pattern, &block)
12
+ rule = DirectoryRule::Pattern.new(pattern, &block)
13
+ update_description_on_rule(rule)
14
+ configuration.rules << rule
15
+ end
16
+
17
+ def all(&block)
18
+ rule = DirectoryRule::All.new(&block)
19
+ update_description_on_rule(rule)
20
+ configuration.rules << rule
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -3,32 +3,39 @@ require "delegate"
3
3
 
4
4
  class Dressmaker
5
5
  class Configuration
6
- class DirectoryRule
6
+ class DirectoryRule < Rule
7
7
 
8
- attr_reader :directory, :action
9
- attr_accessor :description, :name
8
+ class All < DirectoryRule
9
+
10
+ def matches?(base, target)
11
+ File.directory?(File.join(base, target))
12
+ end
10
13
 
11
- def initialize(directory, &action)
12
- @directory = directory
13
- @action = action
14
14
  end
15
15
 
16
- def matches?(target)
17
- self.name = "Directory (#{File.join(target, directory)})"
18
- File.directory?(File.join(target, directory))
19
- end
16
+ class Pattern < DirectoryRule
17
+
18
+ attr_reader :pattern, :action
19
+
20
+ def initialize(pattern, &action)
21
+ @pattern = pattern
22
+ @action = action
23
+ end
20
24
 
21
- def execute!(target)
22
- Dressmaker.inform(self, description) if description
23
- dir = DirectoryDelegator.new(File.open(File.join(target, directory)))
24
- action.call(dir)
25
+ def matches?(base, target)
26
+ File.directory?(File.join(base, target)) && File.fnmatch(pattern, target)
27
+ end
28
+
25
29
  end
26
30
 
27
- class DirectoryDelegator < SimpleDelegator
28
- def for(pattern)
29
- Dir["#{__getobj__.path}/#{pattern}"].each {|e| yield e}
31
+ attr_accessor :description, :name
32
+
33
+ def execute!(target)
34
+ Delegators.with(File.join(target)) do |dir|
35
+ action.call(dir)
30
36
  end
31
37
  end
38
+
32
39
  end
33
40
  end
34
41
  end
@@ -0,0 +1,22 @@
1
+ class Dressmaker
2
+ class Configuration
3
+ class FileMatcher < Matcher
4
+
5
+ def initialize(configuration)
6
+ @configuration = configuration
7
+ end
8
+
9
+ def matches(pattern, &block)
10
+ rule = FileRule.new(pattern, &block)
11
+ configuration.rules << rule
12
+ end
13
+
14
+ def all(&block)
15
+ rule = FileRule::All.new(&block)
16
+ update_description_on_rule(rule)
17
+ configuration.rules << rule
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,42 @@
1
+ require 'ftools'
2
+ require "delegate"
3
+
4
+ class Dressmaker
5
+ class Configuration
6
+ class FileRule < Rule
7
+
8
+ class All < FileRule
9
+
10
+ def initialize(&action)
11
+ @action = action
12
+ end
13
+
14
+ def matches?(base, target)
15
+ File.file?(File.join(base, target))
16
+ end
17
+ end
18
+
19
+ attr_reader :directory, :action
20
+ attr_accessor :description, :name
21
+
22
+ class Pattern
23
+ def initialize(pattern, &action)
24
+ @pattern = pattern
25
+ @action = action
26
+ end
27
+
28
+ def matches?(base, target)
29
+ File.file?(File.join(base, target)) and File.fnmatch(pattern, File.join(base, target))
30
+ end
31
+
32
+ end
33
+
34
+ def execute!(target)
35
+ Delegators.with(target) do |file|
36
+ action.call(file)
37
+ end
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,16 @@
1
+ class Dressmaker
2
+ class Configuration
3
+ class Matcher
4
+
5
+ attr_reader :configuration
6
+
7
+ def update_description_on_rule(rule)
8
+ if rule.respond_to?(:description=)
9
+ rule.description = configuration.description_holder
10
+ configuration.description_holder = nil
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ class Dressmaker
2
+ class Configuration
3
+ class Rule
4
+
5
+ attr_accessor :description, :informed
6
+
7
+ def inform
8
+ Dressmaker.inform(self, description) if description && !informed
9
+ self.informed = true
10
+ end
11
+
12
+ def informed?
13
+ informed
14
+ end
15
+
16
+ end
17
+ end
18
+ end
File without changes
@@ -1,6 +1,11 @@
1
1
  desc "make executable"
2
- directory '/bin' do |dir|
2
+ directory.matches('/bin') do |dir|
3
3
  dir.for('*') { |f|
4
- File.chmod(0755, f)
4
+ f.make_executable!
5
5
  }
6
+ end
7
+
8
+ desc "replace __FILE__ with everyone"
9
+ files.all do |file|
10
+ file.gsub!('__FILE__', 'everyone')
6
11
  end
@@ -0,0 +1 @@
1
+ this is my __FILE__ for lovin'
@@ -17,6 +17,7 @@ describe 'Dressmaker' do
17
17
  File.exist?(File.expand_path(File.join(File.dirname(__FILE__), 'output', 'template-test', 'bin', 'runner'))).should be_true
18
18
  File.executable?(File.expand_path(File.join(File.dirname(__FILE__), 'output', 'template-test', 'bin', 'runner'))).should be_true
19
19
  File.executable?(File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'template-test', 'bin', 'runner'))).should be_false
20
+ File.read(File.expand_path(File.join(File.dirname(__FILE__), 'output', 'template-test', 'bin', 'runner'))).should == "this is my everyone for lovin'"
20
21
  end
21
22
  end
22
23
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dressmaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Hull
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-06 00:00:00 -05:00
12
+ date: 2009-11-16 00:00:00 -05:00
13
13
  default_executable: dressmaker
14
14
  dependencies: []
15
15
 
@@ -28,7 +28,14 @@ files:
28
28
  - VERSION
29
29
  - lib/dressmaker.rb
30
30
  - lib/dressmaker/configuration.rb
31
+ - lib/dressmaker/configuration/delegators.rb
32
+ - lib/dressmaker/configuration/directory_matcher.rb
31
33
  - lib/dressmaker/configuration/directory_rule.rb
34
+ - lib/dressmaker/configuration/file_matcher.rb
35
+ - lib/dressmaker/configuration/file_rule.rb
36
+ - lib/dressmaker/configuration/matcher.rb
37
+ - lib/dressmaker/configuration/rule.rb
38
+ - lib/dressmaker/tasks.rb
32
39
  - spec/fixtures/template-test/Pattern
33
40
  - spec/fixtures/template-test/bin/runner
34
41
  - spec/fixtures/template-test/bin/script