rix 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/rix CHANGED
@@ -6,8 +6,10 @@ require 'rix'
6
6
  require 'optparse'
7
7
 
8
8
  Rix::Registry.instance.register 'add-element', Rix::Commands::AddElement
9
+ Rix::Registry.instance.register 'add-attribute', Rix::Commands::AddAttribute
9
10
  Rix::Registry.instance.register 'remove', Rix::Commands::Remove
10
11
  Rix::Registry.instance.register 'rename', Rix::Commands::Rename
12
+ Rix::Registry.instance.register 'trim', Rix::Commands::Trim
11
13
  Rix::Registry.instance.register 'count', Rix::Commands::Count
12
14
  Rix::Registry.instance.register 'show', Rix::Commands::Show
13
15
  Rix::Registry.instance.register 'help', Rix::Commands::Help
@@ -17,6 +19,7 @@ if ARGV.size == 0
17
19
  elsif not ARGV[0].start_with? '-'
18
20
  name = ARGV.shift
19
21
  command = Rix::Registry.instance[name]
22
+ command.out = $stdout
20
23
  begin
21
24
  command.execute
22
25
  rescue => e
data/lib/rix.rb CHANGED
@@ -3,10 +3,14 @@ require 'rix/registry'
3
3
  require 'rix/command'
4
4
  require 'rix/commands/help'
5
5
  require 'rix/commands/add_element'
6
+ require 'rix/commands/add_attribute'
6
7
  require 'rix/commands/remove'
7
8
  require 'rix/commands/rename'
9
+ require 'rix/commands/trim'
8
10
  require 'rix/commands/count'
9
11
  require 'rix/commands/show'
10
12
  require 'rix/commands/unknown'
11
13
  require 'rix/help'
12
14
  require 'rix/version'
15
+
16
+ include REXML
data/lib/rix/command.rb CHANGED
@@ -2,6 +2,7 @@ require 'rix/commands/unknown'
2
2
 
3
3
  module Rix
4
4
  class Command
5
+ attr_accessor :out
5
6
  attr_accessor :files
6
7
  attr_accessor :xpath
7
8
 
@@ -33,13 +34,7 @@ module Rix
33
34
  # on Mac, Linux etc. this will have no effect.
34
35
  Dir[pattern].each do |path|
35
36
  File.open(path, 'r') do |file|
36
- document = REXML::Document.new(file)
37
- nodes = REXML::XPath.match(document, @xpath)
38
- before(path, nodes)
39
- nodes.each do |node|
40
- on_node(node)
41
- end
42
- after(path, document)
37
+ on_source(file, path)
43
38
  end
44
39
  end
45
40
  end
@@ -47,22 +42,37 @@ module Rix
47
42
  after_all
48
43
  end
49
44
 
50
- def before_all
45
+ def on_source(source, name)
46
+ document = Document.new(source, :ignore_whitespace_nodes => :all, :attribute_quote => :quote)
47
+ on_document(document, name)
51
48
  end
52
49
 
53
- def before(path, nodes)
50
+ def on_document(document, name)
51
+ nodes = XPath.match(document, @xpath)
52
+ before(name, document, nodes)
53
+ nodes.each do |node|
54
+ on_node(node)
55
+ on_element(node) if node.is_a? Element
56
+ on_attribute(node) if node.is_a? Attribute
57
+ on_text(node) if node.is_a? Text
58
+ end
59
+ after(name, document)
54
60
  end
55
61
 
56
- def on_node(node)
57
- end
62
+ def before_all; end
58
63
 
59
- def after(path, document)
60
- #File.open(path, 'w') do |file|
61
- # document.write file
62
- #end
63
- end
64
+ def before(name, document, nodes); end
64
65
 
65
- def after_all
66
- end
66
+ def on_node(node); end
67
+
68
+ def on_element(element); end
69
+
70
+ def on_attribute(attribute); end
71
+
72
+ def on_text(text); end
73
+
74
+ def after(name, document); end
75
+
76
+ def after_all; end
67
77
  end
68
78
  end
@@ -0,0 +1,32 @@
1
+ module Rix
2
+ module Commands
3
+ class AddAttribute < Command
4
+ attr_accessor :name
5
+ attr_accessor :value
6
+
7
+ def opts
8
+ OptionParser.new do |opts|
9
+ opts.banner = "Usage: rix add-attribute [options] <xpath> <files>"
10
+ opts.separator ""
11
+ opts.separator "Options:"
12
+ opts.on("-n", "--name NAME", "The name of the new attribute") { |name| @name = name }
13
+ opts.on("-v", "--value VALUE", "The value of the new attribute") { |value| @value = value }
14
+ end
15
+ end
16
+
17
+ def before_all
18
+ raise "Missing option: -n, --name" if @name.nil? or @name.empty?
19
+ end
20
+
21
+ def on_element(element)
22
+ element.add_attribute(@name, @value)
23
+ end
24
+
25
+ def after(path, document)
26
+ File.open(path, 'w') do |file|
27
+ document.write file
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -18,8 +18,8 @@ module Rix
18
18
  raise "Missing option: -n, --name" if @name.nil? or @name.empty?
19
19
  end
20
20
 
21
- def on_node(node)
22
- element = node.add_element @name
21
+ def on_element(parent)
22
+ element = parent.add_element @name
23
23
  element.text = @value
24
24
  end
25
25
 
@@ -5,8 +5,8 @@ module Rix
5
5
  "Usage: rix count <xpath> <files>"
6
6
  end
7
7
 
8
- def before(path, nodes)
9
- puts "#{path}: #{nodes.size}"
8
+ def before(name, document, nodes)
9
+ out.puts "#{name}: #{nodes.size}"
10
10
  end
11
11
  end
12
12
  end
@@ -1,6 +1,8 @@
1
1
  module Rix
2
2
  module Commands
3
3
  class Help
4
+ attr_accessor :out
5
+
4
6
  def help
5
7
  HELP
6
8
  end
@@ -8,17 +10,17 @@ module Rix
8
10
  def execute
9
11
  case ARGV.size
10
12
  when 0
11
- puts Rix::HELP
13
+ out.puts Rix::HELP
12
14
  when 1
13
15
  name = ARGV[0]
14
16
  if name.downcase == 'commands'
15
- puts "Available commands:"
16
- Registry.instance.commands.each_key { |command| puts " #{command}" }
17
+ out.puts "Available commands:"
18
+ Registry.instance.commands.each_key { |command| out.puts " #{command}" }
17
19
  else
18
- puts Registry.instance[name].help
20
+ out.puts Registry.instance[name].help
19
21
  end
20
22
  else
21
- puts HELP
23
+ out.puts HELP
22
24
  end
23
25
  end
24
26
 
@@ -6,10 +6,13 @@ module Rix
6
6
  "Usage: rix remove <xpath> <files>"
7
7
  end
8
8
 
9
- def on_node(node)
10
- node.parent.delete_element node if node.is_a? REXML::Element
11
- # BUG: 'node.element.delete_attribute node' doesn't work
12
- node.element.delete_attribute node.name if node.is_a? REXML::Attribute
9
+ def on_element(element)
10
+ element.parent.delete_element element
11
+ end
12
+
13
+ def on_attribute(attribute)
14
+ # BUG: 'attribute.element.delete_attribute attribute' doesn't work
15
+ attribute.element.delete_attribute attribute.name
13
16
  end
14
17
 
15
18
  def after(path, document)
@@ -16,8 +16,12 @@ module Rix
16
16
  raise "Missing option: -n, --name" if @name.nil? or @name.empty?
17
17
  end
18
18
 
19
- def on_node(node)
20
- node.name = @name if node.respond_to? :name
19
+ def on_element(element)
20
+ element.name = @name
21
+ end
22
+
23
+ def on_attribute(attribute)
24
+ attribute.name = @name
21
25
  end
22
26
 
23
27
  def after(path, document)
@@ -2,7 +2,7 @@ module Rix
2
2
  module Commands
3
3
  class Show < Command
4
4
  def initialize
5
- @formatter = REXML::Formatters::Pretty.new
5
+ @formatter = Formatters::Pretty.new
6
6
  @formatter.compact = true
7
7
  end
8
8
 
@@ -11,8 +11,8 @@ module Rix
11
11
  end
12
12
 
13
13
  def on_node(node)
14
- @formatter.write(node, $stdout)
15
- puts
14
+ @formatter.write(node, out)
15
+ out.puts
16
16
  end
17
17
  end
18
18
  end
@@ -0,0 +1,37 @@
1
+ module Rix
2
+ module Commands
3
+ class Trim < Command
4
+
5
+ def help
6
+ "Usage: rix trim <xpath> <files>"
7
+ end
8
+
9
+ def on_element(element)
10
+ element.text = element.text.strip if element.has_text?
11
+ end
12
+
13
+ def on_attribute(attribute)
14
+ attribute.element.attributes[attribute.name] = attribute.to_s.strip
15
+ attribute.element.attributes[attribute.name]
16
+ end
17
+
18
+ def on_text(text)
19
+ stripped = text.to_s.strip
20
+ # Leave 'empty' nodes intact
21
+ if stripped.size > 0
22
+ child = Text.new(stripped)
23
+ text.replace_with(child)
24
+ child.to_s
25
+ else
26
+ text.to_s
27
+ end
28
+ end
29
+
30
+ def after(path, document)
31
+ File.open(path, 'w') do |file|
32
+ document.write file
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,7 +1,7 @@
1
1
  module Rix
2
2
  module Commands
3
3
  class UnknownCommand
4
- attr_accessor :name
4
+ attr_accessor :out, :name
5
5
 
6
6
  def message
7
7
  "Unknown command: #{name}. Type 'rix help commands' for a list of available commands."
@@ -12,7 +12,7 @@ module Rix
12
12
  end
13
13
 
14
14
  def execute
15
- puts message
15
+ out.puts message
16
16
  end
17
17
  end
18
18
  end
data/lib/rix/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rix
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rix
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-24 00:00:00.000000000Z
12
+ date: 2011-08-28 00:00:00.000000000Z
13
13
  dependencies: []
14
14
  description: Command-line XML editing and refactoring
15
15
  email: richard.hubers@gmail.com
@@ -20,12 +20,14 @@ extra_rdoc_files: []
20
20
  files:
21
21
  - bin/rix
22
22
  - lib/rix/command.rb
23
+ - lib/rix/commands/add_attribute.rb
23
24
  - lib/rix/commands/add_element.rb
24
25
  - lib/rix/commands/count.rb
25
26
  - lib/rix/commands/help.rb
26
27
  - lib/rix/commands/remove.rb
27
28
  - lib/rix/commands/rename.rb
28
29
  - lib/rix/commands/show.rb
30
+ - lib/rix/commands/trim.rb
29
31
  - lib/rix/commands/unknown.rb
30
32
  - lib/rix/help.rb
31
33
  - lib/rix/registry.rb