svnx 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fd37aad9c296bc3739eced16136fc73f1e8831ba
4
- data.tar.gz: 2b829bf99dad72f3ec1bdc3a4913ff5a7e30879f
3
+ metadata.gz: 1a079b16c8a940b3a4d547cf7181bb598e708134
4
+ data.tar.gz: 362875ae5402a57065a2c923104f29e27c8e7fa7
5
5
  SHA512:
6
- metadata.gz: 840ed6cfcd13332ffbcf8413adcc06fc9d18d7bf3d382f88e788297d776ca16f77b5650de4da706f9d8d63ee0bc5f3cb5ba7f64e44af0c2018febe41c964d64a
7
- data.tar.gz: 637d08aa4258d2e044b01a8c9957a2d93f76eaed0755d5f605546b6dccc8436a167eef16a73f39b38ddf33828a66938ecc9ce22186773e272fe6b81f8e510756
6
+ metadata.gz: 212b6748b84d9298c1b9ff59387a7f5e392fb7829e9487b46801a51472c7f39ff0611f4b820526e1b42091ed5d7e73ea000ddbdfbc5ba7109df0515d9c4e5b1a
7
+ data.tar.gz: fbfbbf3cc940127e16fa01b7a0ab20e1100a862d6c642a7e7f8e8961c7f35cc7ccc0373d2c061671662ca75aa17fe98f5661c9aa1ae86da9e7ec74694d745fe5
@@ -65,7 +65,7 @@ module Svnx::Base
65
65
 
66
66
  if not @output.empty?
67
67
  entries_class ||= begin
68
- modl = ClassUtil::Util.find_module self.class
68
+ modl = ClassUtil.find_module self.class
69
69
  modl::Entries
70
70
  end
71
71
 
@@ -9,10 +9,10 @@ module Svnx::Base
9
9
  include Logue::Loggable
10
10
 
11
11
  def create cmdcls, cmdlinecls: nil, optcls: nil
12
- melements = ClassUtil::Util.module_elements cmdcls
12
+ melements = ClassUtil.module_elements cmdcls
13
13
 
14
14
  optcls ||= begin
15
- modl = ClassUtil::Util.find_module cmdcls
15
+ modl = ClassUtil.find_module cmdcls
16
16
  modl::Options
17
17
  end
18
18
 
@@ -18,20 +18,12 @@ module Svnx::Base
18
18
 
19
19
  attr_reader :size
20
20
 
21
- def initialize xmllines: nil, lines: nil
21
+ def initialize lines
22
22
  # it's a hash, but indexed with integers, for non-sequential access:
23
- @entries = Hash.new
24
-
25
- lines ||= xmllines
26
-
27
- if lines.kind_of? Array
28
- lines = lines.join ''
29
- end
30
-
31
- doc = REXML::Document.new lines
32
-
23
+ @entries = Hash.new
24
+ doc = REXML::Document.new Array(lines).join
33
25
  @elements = get_elements doc
34
- @size = @elements.size
26
+ @size = @elements.size
35
27
  end
36
28
 
37
29
  def get_elements doc
@@ -13,30 +13,16 @@ module Svnx::Base
13
13
  class Entry
14
14
  include Logue::Loggable
15
15
 
16
- def initialize xmllines: nil, xmlelement: nil
17
- if xmllines
18
- if xmllines.kind_of? Array
19
- xmllines = xmllines.join ''
20
- end
21
- doc = REXML::Document.new xmllines
22
- set_from_xml doc
23
- elsif xmlelement
24
- set_from_element xmlelement
25
- else
26
- raise "must be initialized with xmllines (received: #{xmllines.inspect}) or xmlelement (received: #{xmlelement.inspect})"
27
- end
28
- end
29
-
30
- def set_from_xml xmldoc
31
- raise "must be implemented"
16
+ def initialize xmlelement
17
+ set_from_element xmlelement
32
18
  end
33
19
 
34
20
  def set_from_element elmt
35
21
  raise "must be implemented"
36
22
  end
37
23
 
38
- def set_attr_var xmlelement, varname
39
- set_var varname, attribute_value(xmlelement, varname)
24
+ def set_attr_var xmlelement, varname, attrname = varname
25
+ set_var varname, xmlelement && attribute_value(xmlelement, attrname)
40
26
  end
41
27
 
42
28
  def set_attr_vars xmlelement, *varnames
@@ -46,7 +32,7 @@ module Svnx::Base
46
32
  end
47
33
 
48
34
  def set_elmt_var xmlelement, varname
49
- set_var varname, element_text(xmlelement, varname)
35
+ set_var varname, xmlelement && element_text(xmlelement, varname)
50
36
  end
51
37
 
52
38
  def set_elmt_vars xmlelement, *varnames
@@ -65,8 +51,7 @@ module Svnx::Base
65
51
 
66
52
  def element_text xmlelement, elmtname
67
53
  elmt = xmlelement.elements[elmtname.to_s]
68
- # some elements don't have text:
69
- (elmt && elmt.text) || ""
54
+ elmt && elmt.text || ""
70
55
  end
71
56
  end
72
57
  end
@@ -9,29 +9,58 @@ module Svnx
9
9
  end
10
10
 
11
11
  module Svnx::Base
12
+ REVISION_FIELD = Proc.new { |x| [ "-r", x.revision ] }
13
+ IGNORE_WHITESPACE = { ignorewhitespace: %w{ -x -bw -x --ignore-eol-style } }
14
+
15
+ REVISION_PATHS_URLS_FIELDS = Hash.new.tap do |h|
16
+ h[:revision] = REVISION_FIELD
17
+ h[:paths] = nil
18
+ h[:urls] = nil
19
+ end
20
+
12
21
  class Options
13
22
  include Svnx::ObjectUtil
14
23
 
15
- def check args, valid = Array.new
16
- invalid = args.keys.reject do |field|
17
- valid.include? field
24
+ class << self
25
+ # Creates a reader method for each field
26
+ def has_fields(*fields)
27
+ what = Array(fields).flatten
28
+ attr_reader(*what)
18
29
  end
30
+ end
19
31
 
20
- unless invalid.empty?
21
- raise "invalid fields for #{self.class}: #{invalid.join(' ')}"
32
+ def initialize args
33
+ fkeys = fields.keys
34
+ assign args, fkeys
35
+ validate args, fkeys
36
+ end
37
+
38
+ def options_to_args
39
+ fields.keys.collect do |fld|
40
+ [ fld, get_args(fld) ]
22
41
  end
23
42
  end
43
+
44
+ def fields
45
+ raise "not implemented for #{self.class}"
46
+ end
24
47
 
25
48
  def to_args
26
- Array.new.tap do |args|
27
- options_to_args.each do |opt|
28
- optname = opt[0]
29
- values = opt[1]
30
- if send optname
31
- args.concat [ values ].flatten
32
- end
33
- end
34
- end
49
+ options_to_args.collect do |opt|
50
+ send(opt.first) ? opt[1] : nil
51
+ end.compact.flatten
35
52
  end
53
+
54
+ def get_args field
55
+ val = fields[field]
56
+ case val
57
+ when Proc
58
+ val.call self
59
+ when nil
60
+ send field
61
+ else
62
+ val
63
+ end
64
+ end
36
65
  end
37
66
  end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'svnx/blame/options'
5
+ require 'svnx/base/command'
6
+
7
+ module Svnx::Blame
8
+ class Command < Svnx::Base::EntriesCommand
9
+ caching
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'svnx/blame/entry'
5
+ require 'svnx/base/entries'
6
+
7
+ module Svnx::Blame
8
+ class Entries < Svnx::Base::Entries
9
+ def get_elements doc
10
+ # blame/target
11
+ doc.elements['blame'].elements['target'].elements
12
+ end
13
+
14
+ def create_entry xmlelement
15
+ Entry.new xmlelement
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'svnx/base/entry'
5
+ require 'time'
6
+
7
+ module Svnx
8
+ module Blame
9
+ end
10
+ end
11
+
12
+ module Svnx::Blame
13
+ class Entry < Svnx::Base::Entry
14
+ include Comparable
15
+
16
+ attr_reader :line_number
17
+ attr_reader :revision
18
+ attr_reader :author
19
+ attr_reader :date
20
+
21
+ def set_from_element elmt
22
+ set_attr_var elmt, 'line_number', 'line-number'
23
+
24
+ commit = elmt.elements['commit']
25
+ set_attr_var commit, 'revision'
26
+ set_elmt_vars commit, 'author', 'date'
27
+ end
28
+
29
+ def set_commit_fields rev, auth, date
30
+ @commit_revision = rev
31
+ @commit_author = auth
32
+ @commit_date = date
33
+ end
34
+
35
+ def <=> other
36
+ line_number <=> other.line_number
37
+ end
38
+
39
+ def datetime
40
+ @dt ||= DateTime.parse date
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'svnx/base/options'
5
+
6
+ module Svnx
7
+ module Blame
8
+ end
9
+ end
10
+
11
+ module Svnx::Blame
12
+ class Options < Svnx::Base::Options
13
+ FIELDS = Svnx::Base::REVISION_PATHS_URLS_FIELDS.merge(Svnx::Base::IGNORE_WHITESPACE)
14
+
15
+ has_fields FIELDS.keys
16
+
17
+ def fields
18
+ FIELDS
19
+ end
20
+ end
21
+ end
@@ -10,16 +10,16 @@ end
10
10
 
11
11
  module Svnx::Cat
12
12
  class Options < Svnx::Base::Options
13
- FIELDS = [ :revision, :path, :url ]
13
+ FIELDS = Hash.new.tap do |h|
14
+ h[:revision] = Svnx::Base::REVISION_FIELD
15
+ h[:path] = nil
16
+ h[:url] = nil
17
+ end
14
18
 
15
- has_fields FIELDS
19
+ has_fields FIELDS.keys
16
20
 
17
- def options_to_args
18
- Array.new.tap do |a|
19
- a << [ :revision, [ "-r", revision ] ]
20
- a << [ :url, url ]
21
- a << [ :path, path ]
22
- end
21
+ def fields
22
+ FIELDS
23
23
  end
24
24
  end
25
25
  end
@@ -10,15 +10,15 @@ end
10
10
 
11
11
  module Svnx::Commit
12
12
  class Options < Svnx::Base::Options
13
- FIELDS = [ :file, :paths ]
13
+ FIELDS = Hash.new.tap do |h|
14
+ h[:file] = Proc.new { |x| [ "-F", x.file ] }
15
+ h[:paths] = nil
16
+ end
14
17
 
15
- has_fields FIELDS
18
+ has_fields FIELDS.keys
16
19
 
17
- def options_to_args
18
- Array.new.tap do |a|
19
- a << [ :file, [ "-F", file ] ]
20
- a << [ :paths, paths ]
21
- end
22
- end
20
+ def fields
21
+ FIELDS
22
+ end
23
23
  end
24
24
  end
@@ -10,19 +10,18 @@ end
10
10
 
11
11
  module Svnx::Diff
12
12
  class Options < Svnx::Base::Options
13
- FIELDS = [ :commit, :ignoreproperties, :ignorewhitespace, :paths, :url, :depth ]
13
+ FIELDS = Hash.new.tap do |h|
14
+ h[:commit] = Proc.new { |x| [ "-c", x.commit ] }
15
+ h[:ignoreproperties] = "--ignore-properties"
16
+ h[:depth] = Proc.new { |x| [ "--depth", x.depth ] }
17
+ h[:paths] = nil
18
+ h[:url] = nil
19
+ end.merge(Svnx::Base::IGNORE_WHITESPACE)
14
20
 
15
- has_fields FIELDS
21
+ has_fields FIELDS.keys
16
22
 
17
- def options_to_args
18
- Array.new.tap do |a|
19
- a << [ :commit, [ "-c", commit ] ]
20
- a << [ :ignoreproperties, "--ignore-properties" ]
21
- a << [ :depth, [ "--depth", depth ] ]
22
- a << [ :ignorewhitespace, [ "-x", "-bw" ] ]
23
- a << [ :url, url ]
24
- a << [ :paths, paths ]
25
- end
23
+ def fields
24
+ FIELDS
26
25
  end
27
26
  end
28
27
  end
@@ -11,7 +11,7 @@ module Svnx::Info
11
11
  end
12
12
 
13
13
  def create_entry xmlelement
14
- Entry.new :xmlelement => xmlelement
14
+ Entry.new xmlelement
15
15
  end
16
16
  end
17
17
  end
@@ -10,16 +10,16 @@ end
10
10
 
11
11
  module Svnx::Info
12
12
  class Options < Svnx::Base::Options
13
- FIELDS = [ :revision, :url, :path ]
13
+ FIELDS = Hash.new.tap do |h|
14
+ h[:revision] = Svnx::Base::REVISION_FIELD
15
+ h[:path] = nil
16
+ h[:url] = nil
17
+ end
14
18
 
15
- has_fields FIELDS
19
+ has_fields FIELDS.keys
16
20
 
17
- def options_to_args
18
- Array.new.tap do |a|
19
- a << [ :revision, [ "-r", revision ] ]
20
- a << [ :url, url ]
21
- a << [ :path, path ]
22
- end
21
+ def fields
22
+ FIELDS
23
23
  end
24
24
  end
25
25
  end
@@ -16,15 +16,15 @@ module Svnx::Log
16
16
  end
17
17
 
18
18
  def create_entry xmlelement
19
- Entry.new xmlelement: xmlelement
19
+ Entry.new xmlelement
20
20
  end
21
21
 
22
22
  def match action, filter
23
- matching = Array.new
24
- each do |entry|
25
- matching.concat entry.match(action, filter)
26
- end
27
- matching.sort
23
+ Array.new.tap do |a|
24
+ each do |entry|
25
+ a.concat entry.match(action, filter)
26
+ end
27
+ end.sort
28
28
  end
29
29
  end
30
30
  end
@@ -10,18 +10,18 @@ end
10
10
 
11
11
  module Svnx::Log
12
12
  class Options < Svnx::Base::Options
13
- FIELDS = [ :limit, :verbose, :revision, :url, :path ]
13
+ FIELDS = Hash.new.tap do |h|
14
+ h[:limit] = Proc.new { |x| [ "--limit", x.limit ] }
15
+ h[:verbose] = "-v"
16
+ h[:revision] = Proc.new { |x| "-r" + x.revision.to_s }
17
+ h[:url] = nil
18
+ h[:path] = nil
19
+ end
20
+
21
+ has_fields FIELDS.keys
14
22
 
15
- has_fields FIELDS
16
-
17
- def options_to_args
18
- Array.new.tap do |a|
19
- a << [ :limit, [ "--limit", limit ] ]
20
- a << [ :verbose, "-v" ]
21
- a << [ :revision, "-r" + revision.to_s ]
22
- a << [ :url, url ]
23
- a << [ :path, path ]
24
- end
23
+ def fields
24
+ FIELDS
25
25
  end
26
26
  end
27
27
  end
@@ -10,20 +10,18 @@ end
10
10
 
11
11
  module Svnx::Merge
12
12
  class Options < Svnx::Base::Options
13
- # FIELDS = [ :commit, :range, :accept, :from, :path, :url ]
14
- FIELDS = [ :commit, :range, :accept, :from, :to ]
13
+ FIELDS = Hash.new.tap do |h|
14
+ h[:commit] = Proc.new { |x| [ "-c", x.commit ] }
15
+ h[:range] = Proc.new { |x| [ "-r", x.range ] }
16
+ h[:accept] = Proc.new { |x| [ "--accept", x.accept ] }
17
+ h[:from] = nil
18
+ h[:to] = nil
19
+ end
15
20
 
16
- has_fields FIELDS
21
+ has_fields FIELDS.keys
17
22
 
18
- def options_to_args
19
- # an array, not a hash, because "from" should be in the exec args before "url"/"path"
20
- Array.new.tap do |a|
21
- a << [ :commit, [ "-c", commit ] ]
22
- a << [ :range, [ "-r", range ] ]
23
- a << [ :accept, [ "--accept", accept ] ]
24
- a << [ :from, from ]
25
- a << [ :to, to ]
26
- end
27
- end
23
+ def fields
24
+ FIELDS
25
+ end
28
26
  end
29
27
  end
@@ -1,26 +1,19 @@
1
1
  #!/usr/bin/ruby -w
2
2
  # -*- ruby -*-
3
3
 
4
- require 'logue/loggable'
5
-
6
4
  module Svnx
7
5
  end
8
6
 
9
7
  # A low-level wrapper around the Svnx commands, converting arguments (svnx/<command>/options) into
10
8
  # entries (svnx/<command>/entry) or output. Enhances the low level functionality.
11
9
 
12
- class Svnx::Project
13
- include Logue::Loggable
14
-
10
+ class Svnx::Project
15
11
  attr_reader :dir
16
12
 
17
13
  def initialize dir: nil, url: nil, cls: nil
18
14
  @dir = dir
19
15
  @url = url
20
16
  @cls = cls
21
- debug "dir: #{dir}"
22
- debug "url: #{url}"
23
- debug "cls: #{cls}"
24
17
  end
25
18
 
26
19
  def where
@@ -38,47 +31,34 @@ class Svnx::Project
38
31
  info.path
39
32
  end
40
33
 
41
- def run_command cmdcls, cmdargs, args
42
- cmd = cmdcls.new cmdargs, cls: @cls
43
- cmd.respond_to?(:entries) ? cmd.entries : cmd.output
44
- end
34
+ def self.add_delegator cmd
35
+ require "svnx/#{cmd}/command"
36
+ require "svnx/#{cmd}/options"
45
37
 
46
- def self.add_command_delegator name, takes_multiple_paths
47
- require "svnx/#{name}/command"
48
-
49
- pathargs = takes_multiple_paths ? "paths: [ @dir ]" : "path: @dir"
38
+ initargs = Hash[url: "@url", path: "@dir", paths: "[ @dir ]"]
39
+ optcls = Kernel.const_get "Svnx::#{cmd.to_s.capitalize}::Options"
40
+ opts = optcls.new Hash.new
41
+ fields = opts.fields.keys
42
+ params = fields.collect { |key| key.to_s + ": " + (initargs[key] || "nil") }.join ", "
43
+ cmdargs = fields.collect { |key| key.to_s + ": " + key.to_s }.join ", "
50
44
 
51
- unless NOURL.include? name
52
- pathargs << ", url: @url"
53
- end
45
+ src = Array.new.tap do |a|
46
+ a << "def #{cmd} #{params}, cls: @cls"
47
+ a << " cmd = Svnx::#{cmd.to_s.capitalize}::Command.new({ #{cmdargs} }, cls: cls)"
48
+ a << " cmd.respond_to?(:entries) ? cmd.entries : cmd.output"
49
+ a << "end"
50
+ end.join "\n"
54
51
 
55
- args = [
56
- "Svnx::#{name.to_s.capitalize}::Command",
57
- "{ " + pathargs + " }",
58
- "**args"
59
- ]
60
-
61
- src = [
62
- "def #{name} cls: nil, **args",
63
- " run_command " + args.join(", ") + ", cls: @cls",
64
- "end"
65
- ].join("\n")
66
-
67
- module_eval src
52
+ class_eval src
68
53
  end
69
54
 
70
- NOURL = [ :diff, :update, :merge ]
71
-
72
- add_command_delegator :info, false
73
-
74
- add_command_delegator :update, true
75
-
76
- add_command_delegator :commit, true
77
- add_command_delegator :log, false
78
-
79
- add_command_delegator :diff, true
80
- add_command_delegator :propset, false
81
- add_command_delegator :propget, false
55
+ add_delegator :commit
56
+ add_delegator :diff
57
+ add_delegator :info
58
+ add_delegator :log
59
+ add_delegator :propget
60
+ add_delegator :propset
61
+ add_delegator :update
82
62
 
83
63
  def to_s
84
64
  where.to_s
@@ -11,7 +11,7 @@ module Svnx::Propget
11
11
  end
12
12
 
13
13
  def create_entry xmlelement
14
- Entry.new :xmlelement => xmlelement
14
+ Entry.new xmlelement
15
15
  end
16
16
  end
17
17
  end
@@ -9,19 +9,19 @@ module Svnx
9
9
  end
10
10
 
11
11
  module Svnx::Propget
12
- class Options < Svnx::Base::Options
13
- FIELDS = [ :revision, :revprop, :name, :url, :path ]
12
+ class Options < Svnx::Base::Options
13
+ FIELDS = Hash.new.tap do |h|
14
+ h[:revision] = Svnx::Base::REVISION_FIELD
15
+ h[:revprop] = "--revprop"
16
+ h[:name] = nil
17
+ h[:url] = nil
18
+ h[:path] = nil
19
+ end
14
20
 
15
- has_fields FIELDS
21
+ has_fields FIELDS.keys
16
22
 
17
- def options_to_args
18
- Array.new.tap do |a|
19
- a << [ :revision, [ "-r", revision ] ]
20
- a << [ :revprop, "--revprop" ]
21
- a << [ :name, name ]
22
- a << [ :url, url ]
23
- a << [ :path, path ]
24
- end
23
+ def fields
24
+ FIELDS
25
25
  end
26
26
  end
27
27
  end
@@ -10,19 +10,20 @@ end
10
10
 
11
11
  module Svnx::Propset
12
12
  class Options < Svnx::Base::Options
13
- FIELDS = [ :file, :revision, :name, :value, :url, :path ]
13
+
14
+ FIELDS = Hash.new.tap do |h|
15
+ h[:name] = nil
16
+ h[:revision] = Proc.new { |x| [ "--revprop", "-r", x.revision ] }
17
+ h[:file] = Proc.new { |x| [ "--file", x.file ] }
18
+ h[:value] = nil
19
+ h[:url] = nil
20
+ h[:path] = nil
21
+ end
14
22
 
15
- has_fields FIELDS
23
+ has_fields FIELDS.keys
16
24
 
17
- def options_to_args
18
- Array.new.tap do |a|
19
- a << [ :name, name ]
20
- a << [ :revision, [ "--revprop", "-r", revision ] ]
21
- a << [ :file, [ "--file", file ] ]
22
- a << [ :value, value ]
23
- a << [ :url, url ]
24
- a << [ :path, path ]
25
- end
25
+ def fields
26
+ FIELDS
26
27
  end
27
28
  end
28
29
  end
@@ -6,9 +6,9 @@ require 'svnx/base/entries'
6
6
 
7
7
  module Svnx::Status
8
8
  class Entries < Svnx::Base::Entries
9
- def initialize args = Hash.new
10
- @rootpath = args[:rootpath]
11
- super
9
+ def initialize lines, rootpath: nil
10
+ @rootpath = rootpath
11
+ super lines
12
12
  end
13
13
 
14
14
  def get_elements doc
@@ -17,7 +17,7 @@ module Svnx::Status
17
17
  end
18
18
 
19
19
  def create_entry xmlelement
20
- Entry.new xmlelement: xmlelement, rootpath: @rootpath
20
+ Entry.new xmlelement, rootpath: @rootpath
21
21
  end
22
22
  end
23
23
  end
@@ -20,9 +20,9 @@ module Svnx::Status
20
20
  attr_reader :commit_revision
21
21
  attr_reader :name
22
22
 
23
- def initialize xmlelement: nil, rootpath: nil
23
+ def initialize xmlelement, rootpath: nil
24
24
  @rootpath = rootpath
25
- super xmlelement: xmlelement
25
+ super xmlelement
26
26
  # @status is an Svnx::Action
27
27
  @action = @status
28
28
  end
@@ -32,10 +32,10 @@ module Svnx::Status
32
32
 
33
33
  wcstatus = elmt.elements['wc-status']
34
34
  @status = Svnx::Action.new(wcstatus.attributes['item'])
35
- @status_revision = wcstatus.attributes['revision']
35
+ set_attr_var wcstatus, 'status_revision', 'revision'
36
36
 
37
37
  commit = wcstatus.elements['commit']
38
- @commit_revision = commit && commit.attributes['revision']
38
+ set_attr_var commit, 'commit_revision', 'revision'
39
39
  @name = @path.dup
40
40
 
41
41
  if @rootpath
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/ruby -w
2
2
  # -*- ruby -*-
3
3
 
4
- require 'svnx/util/objutil'
4
+ require 'svnx/base/options'
5
5
 
6
6
  module Svnx
7
7
  module Status
@@ -10,16 +10,16 @@ end
10
10
 
11
11
  module Svnx::Status
12
12
  class Options < Svnx::Base::Options
13
- FIELDS = [ :revision, :url, :paths ]
14
-
15
- has_fields FIELDS
13
+ FIELDS = Hash.new.tap do |h|
14
+ h[:revision] = Svnx::Base::REVISION_FIELD
15
+ h[:paths] = nil
16
+ h[:url] = nil
17
+ end
16
18
 
17
- def options_to_args
18
- Array.new.tap do |a|
19
- a << [ :revision, [ "-r", revision ] ]
20
- a << [ :url, url ]
21
- a << [ :paths, paths ]
22
- end
19
+ has_fields FIELDS.keys
20
+
21
+ def fields
22
+ FIELDS
23
23
  end
24
24
  end
25
25
  end
@@ -10,15 +10,15 @@ end
10
10
 
11
11
  module Svnx::Update
12
12
  class Options < Svnx::Base::Options
13
- FIELDS = [ :revision, :paths ]
14
-
15
- has_fields FIELDS
13
+ FIELDS = Hash.new.tap do |h|
14
+ h[:revision] = Svnx::Base::REVISION_FIELD
15
+ h[:paths] = nil
16
+ end
16
17
 
17
- def options_to_args
18
- Array.new.tap do |a|
19
- a << [ :revision, [ "-r", revision ] ]
20
- a << [ :paths, paths ]
21
- end
18
+ has_fields FIELDS.keys
19
+
20
+ def fields
21
+ FIELDS
22
22
  end
23
23
  end
24
24
  end
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/ruby -w
2
2
  # -*- ruby -*-
3
3
 
4
- module ClassUtil
5
- module Util
4
+ class ClassUtil
5
+ class << self
6
6
  def module_elements cls
7
7
  mods = cls.name.split "::"
8
8
  mods[0 .. -2]
@@ -12,8 +12,5 @@ module ClassUtil
12
12
  mod = module_elements(cls) * "::"
13
13
  Kernel.const_get mod
14
14
  end
15
-
16
- module_function :module_elements
17
- module_function :find_module
18
15
  end
19
16
  end
@@ -10,27 +10,37 @@ module Svnx
10
10
  end
11
11
  end
12
12
 
13
+ # raises an exception if any element in +args+ is not in +valid+.
13
14
  def validate args, valid = Array.new
14
- invalid = args.keys.reject do |field|
15
- valid.include? field
16
- end
15
+ invalid = args.keys.reject { |field| valid.include? field }
16
+ invalid.empty? || raise(create_invalid_fields_message invalid)
17
+ end
17
18
 
18
- unless invalid.empty?
19
- raise "invalid fields for #{self.class}: #{invalid.join(' ')}"
20
- end
19
+ def create_invalid_fields_message fields
20
+ Array.new.tap do |a|
21
+ a << "invalid"
22
+ a << (fields.size == 1 ? "field" : "fields" )
23
+ a << "for"
24
+ a << self.class.to_s + ":"
25
+ a.concat fields
26
+ end.join(" ")
21
27
  end
22
28
 
23
- module ClassMethods
24
- def attr_readers symbols = Array.new
25
- attr_reader(*symbols)
29
+ module ClassMethods
30
+ def attr_readers(*symbols)
31
+ what = Array(symbols).flatten
32
+ attr_reader(*what)
26
33
  end
27
34
 
28
- def has_fields fields
29
- attr_reader(*fields)
35
+ # Creates a reader method for each field, and assigns and validates them from an initialize
36
+ # method, which is also created.
37
+ def xhas_fields(*fields)
38
+ what = Array(fields).flatten
39
+ attr_reader(*what)
30
40
 
31
41
  define_method :initialize do |args|
32
- assign args, fields
33
- validate args, fields
42
+ assign args, what
43
+ validate args, what
34
44
  end
35
45
  end
36
46
  end
@@ -3,5 +3,5 @@
3
3
 
4
4
  module Svnx
5
5
  NAME = 'svnx'
6
- VERSION = '2.1.0'
6
+ VERSION = '2.2.0'
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: svnx
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Pace
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-04 00:00:00.000000000 Z
11
+ date: 2018-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -113,6 +113,10 @@ files:
113
113
  - lib/svnx/base/entry.rb
114
114
  - lib/svnx/base/env.rb
115
115
  - lib/svnx/base/options.rb
116
+ - lib/svnx/blame/command.rb
117
+ - lib/svnx/blame/entries.rb
118
+ - lib/svnx/blame/entry.rb
119
+ - lib/svnx/blame/options.rb
116
120
  - lib/svnx/cat/command.rb
117
121
  - lib/svnx/cat/options.rb
118
122
  - lib/svnx/commit/command.rb