groovenauts-thor 0.19.1 → 0.19.1.1

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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -24
  3. data/groovenauts-thor.gemspec +1 -1
  4. data/lib/thor/base.rb +1 -1
  5. data/lib/thor/core_ext/ordered_hash.rb +63 -94
  6. data/lib/thor/parser/arguments.rb +1 -1
  7. data/lib/thor/parser/option.rb +0 -15
  8. data/lib/thor/version.rb +1 -1
  9. data/spec/actions/create_file_spec.rb +168 -0
  10. data/spec/actions/create_link_spec.rb +96 -0
  11. data/spec/actions/directory_spec.rb +169 -0
  12. data/spec/actions/empty_directory_spec.rb +129 -0
  13. data/spec/actions/file_manipulation_spec.rb +392 -0
  14. data/spec/actions/inject_into_file_spec.rb +135 -0
  15. data/spec/actions_spec.rb +331 -0
  16. data/spec/base_spec.rb +298 -0
  17. data/spec/command_spec.rb +79 -0
  18. data/spec/core_ext/hash_with_indifferent_access_spec.rb +48 -0
  19. data/spec/core_ext/ordered_hash_spec.rb +115 -0
  20. data/spec/exit_condition_spec.rb +19 -0
  21. data/spec/fixtures/application.rb +2 -0
  22. data/spec/fixtures/app{1}/README +3 -0
  23. data/spec/fixtures/bundle/execute.rb +6 -0
  24. data/spec/fixtures/bundle/main.thor +1 -0
  25. data/spec/fixtures/command.thor +10 -0
  26. data/spec/fixtures/doc/%file_name%.rb.tt +1 -0
  27. data/spec/fixtures/doc/COMMENTER +11 -0
  28. data/spec/fixtures/doc/README +3 -0
  29. data/spec/fixtures/doc/block_helper.rb +3 -0
  30. data/spec/fixtures/doc/config.rb +1 -0
  31. data/spec/fixtures/doc/config.yaml.tt +1 -0
  32. data/spec/fixtures/doc/excluding/%file_name%.rb.tt +1 -0
  33. data/spec/fixtures/enum.thor +10 -0
  34. data/spec/fixtures/group.thor +128 -0
  35. data/spec/fixtures/invoke.thor +131 -0
  36. data/spec/fixtures/path with spaces b/data/spec/fixtures/path with → spaces +0 -0
  37. data/spec/fixtures/preserve/script.sh +3 -0
  38. data/spec/fixtures/script.thor +220 -0
  39. data/spec/fixtures/subcommand.thor +17 -0
  40. data/spec/group_spec.rb +222 -0
  41. data/spec/helper.rb +80 -0
  42. data/spec/invocation_spec.rb +120 -0
  43. data/spec/line_editor/basic_spec.rb +28 -0
  44. data/spec/line_editor/readline_spec.rb +69 -0
  45. data/spec/line_editor_spec.rb +43 -0
  46. data/spec/parser/argument_spec.rb +53 -0
  47. data/spec/parser/arguments_spec.rb +66 -0
  48. data/spec/parser/option_spec.rb +210 -0
  49. data/spec/parser/options_spec.rb +414 -0
  50. data/spec/quality_spec.rb +75 -0
  51. data/spec/rake_compat_spec.rb +72 -0
  52. data/spec/register_spec.rb +227 -0
  53. data/spec/runner_spec.rb +246 -0
  54. data/spec/sandbox/application.rb +2 -0
  55. data/spec/sandbox/app{1}/README +3 -0
  56. data/spec/sandbox/bundle/execute.rb +6 -0
  57. data/spec/sandbox/bundle/main.thor +1 -0
  58. data/spec/sandbox/command.thor +10 -0
  59. data/spec/sandbox/doc/%file_name%.rb.tt +1 -0
  60. data/spec/sandbox/doc/COMMENTER +11 -0
  61. data/spec/sandbox/doc/README +3 -0
  62. data/spec/sandbox/doc/block_helper.rb +3 -0
  63. data/spec/sandbox/doc/config.rb +1 -0
  64. data/spec/sandbox/doc/config.yaml.tt +1 -0
  65. data/spec/sandbox/doc/excluding/%file_name%.rb.tt +1 -0
  66. data/spec/sandbox/enum.thor +10 -0
  67. data/spec/sandbox/group.thor +128 -0
  68. data/spec/sandbox/invoke.thor +131 -0
  69. data/spec/sandbox/path with spaces b/data/spec/sandbox/path with → spaces +0 -0
  70. data/spec/sandbox/preserve/script.sh +3 -0
  71. data/spec/sandbox/script.thor +220 -0
  72. data/spec/sandbox/subcommand.thor +17 -0
  73. data/spec/shell/basic_spec.rb +337 -0
  74. data/spec/shell/color_spec.rb +119 -0
  75. data/spec/shell/html_spec.rb +31 -0
  76. data/spec/shell_spec.rb +47 -0
  77. data/spec/subcommand_spec.rb +71 -0
  78. data/spec/thor_spec.rb +505 -0
  79. data/spec/util_spec.rb +196 -0
  80. metadata +146 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 50bf117f0d68ddcfe5e636f1870b2fbd2dad3fef
4
- data.tar.gz: 855428579e458e1ea6a90b31af2241225b2df5f1
3
+ metadata.gz: 951deb43fb72171180a7b1c8252e4d828e53739d
4
+ data.tar.gz: d241708a49b81fc3ce9e6e9c5507b21945c5144e
5
5
  SHA512:
6
- metadata.gz: e972d72e4fb95c8d2ec7eeb7778c7ec827061712134202fb762aaca9e406d0fde272dd736cc2a141f32ea9ee46e7e4c8568bffc0ff45f2cea359d75a7df62d53
7
- data.tar.gz: 5765b1f7284d310098ffcb9f2e7a76ff077d15ab85aec4e1a6fc9595d883b09f50fd8d2645de7c8823b59bf023fd147085b407392cb720459de3be692ba3be2c
6
+ metadata.gz: 56285e5f1f3d967d1af3d1044a7aa2f08c6e918416dfd97fab455e3c94d71a7ab8280bea36dec1a3391719f7aeee3ac568303b5fdeb830e08053f56652a02438
7
+ data.tar.gz: c0a5863d78e69670fe0612ade541c3cf2b68dae3e2a88acca5c29bb1d0f642a667d09e24506cf9eb7d4d1843b07579a39338860eed6fa2ea529480a9a84a5a7c
data/CHANGELOG.md CHANGED
@@ -1,27 +1,3 @@
1
- ## 0.19.1, release 2014-03-24
2
- * Fix `say` non-String break regression
3
-
4
- ## 0.19.0, release 2014-03-22
5
- * Add support for a default to #ask
6
- * Avoid @namespace not initialized warning
7
- * Avoid private attribute? warning
8
- * Fix initializing with unknown options
9
- * Loosen required_rubygems_version for compatibility with Ubuntu 10.04
10
- * Shell#ask: support a noecho option for stdin
11
- * Shell#ask: change API to be :echo => false
12
- * Display a message without a stack trace for ambiguous commands
13
- * Make say and say_status thread safe
14
- * Dependency for console io version check
15
- * Alias --help to help on subcommands
16
- * Use mime-types 1.x for Ruby 1.8.7 compatibility for Ruby 1.8 only
17
- * Accept .tt files as templates
18
- * Check if numeric value is in enum
19
- * Use Readline for user input
20
- * Fix dispatching of subcommands (concerning :help and *args)
21
- * Fix warnings when running specs with `$VERBOSE = true`
22
- * Make subcommand help more consistent
23
- * Make the current command chain accessible in command
24
-
25
1
  ## 0.18.1, release 2013-03-30
26
2
  * Revert regressions found in 0.18.0
27
3
 
@@ -10,7 +10,6 @@ Gem::Specification.new do |spec|
10
10
  spec.description = "Thor is a toolkit for building powerful command-line interfaces."
11
11
  # spec.email = "ruby-thor@googlegroups.com"
12
12
  spec.email = "t-akima@groovenauts.jp"
13
- # spec.executables = %w[thor]
14
13
  spec.executables = %w[groovenauts-thor]
15
14
  spec.files = %w[.document groovenauts-thor.gemspec] + Dir['*.md', 'bin/*', 'lib/**/*.rb']
16
15
  # spec.homepage = "http://whatisthor.com/"
@@ -20,5 +19,6 @@ Gem::Specification.new do |spec|
20
19
  spec.require_paths = %w[lib]
21
20
  spec.required_rubygems_version = ">= 1.3.5"
22
21
  spec.summary = spec.description
22
+ spec.test_files = Dir.glob("spec/**/*")
23
23
  spec.version = Thor::VERSION
24
24
  end
data/lib/thor/base.rb CHANGED
@@ -343,7 +343,7 @@ class Thor
343
343
  #
344
344
  def all_commands
345
345
  @all_commands ||= from_superclass(:all_commands, Thor::CoreExt::OrderedHash.new)
346
- @all_commands.merge!(commands)
346
+ @all_commands.merge(commands)
347
347
  end
348
348
  alias_method :all_tasks, :all_commands
349
349
 
@@ -1,127 +1,96 @@
1
1
  class Thor
2
- module CoreExt
3
- class OrderedHash < ::Hash
4
- if RUBY_VERSION < "1.9"
5
- def initialize(*args, &block)
6
- super
7
- @keys = []
8
- end
2
+ module CoreExt #:nodoc:
3
+ if RUBY_VERSION >= "1.9"
4
+ class OrderedHash < ::Hash
5
+ end
6
+ else
7
+ # This class is based on the Ruby 1.9 ordered hashes.
8
+ #
9
+ # It keeps the semantics and most of the efficiency of normal hashes
10
+ # while also keeping track of the order in which elements were set.
11
+ #
12
+ class OrderedHash #:nodoc:
13
+ include Enumerable
14
+
15
+ Node = Struct.new(:key, :value, :next, :prev)
9
16
 
10
- def initialize_copy(other)
11
- super
12
- # make a deep copy of keys
13
- @keys = other.keys
17
+ def initialize
18
+ @hash = {}
14
19
  end
15
20
 
16
- def []=(key, value)
17
- @keys << key unless key?(key)
18
- super
21
+ def [](key)
22
+ @hash[key] && @hash[key].value
19
23
  end
20
24
 
21
- def delete(key)
22
- if key? key
23
- index = @keys.index(key)
24
- @keys.delete_at index
25
+ def []=(key, value)
26
+ if node = @hash[key] # rubocop:disable AssignmentInCondition
27
+ node.value = value
28
+ else
29
+ node = Node.new(key, value)
30
+
31
+ if !defined?(@first) || @first.nil?
32
+ @first = @last = node
33
+ else
34
+ node.prev = @last
35
+ @last.next = node
36
+ @last = node
37
+ end
25
38
  end
26
- super
27
- end
28
39
 
29
- def delete_if
30
- super
31
- sync_keys!
32
- self
40
+ @hash[key] = node
41
+ value
33
42
  end
34
43
 
35
- alias_method :reject!, :delete_if
36
-
37
- def reject(&block)
38
- dup.reject!(&block)
39
- end
44
+ def delete(key)
45
+ if node = @hash[key] # rubocop:disable AssignmentInCondition
46
+ prev_node = node.prev
47
+ next_node = node.next
40
48
 
41
- def keys
42
- @keys.dup
43
- end
49
+ next_node.prev = prev_node if next_node
50
+ prev_node.next = next_node if prev_node
44
51
 
45
- def values
46
- @keys.map { |key| self[key] }
47
- end
52
+ @first = next_node if @first == node
53
+ @last = prev_node if @last == node
48
54
 
49
- def to_hash
50
- self
51
- end
55
+ value = node.value
56
+ end
52
57
 
53
- def to_a
54
- @keys.map { |key| [key, self[key]] }
58
+ @hash.delete(key)
59
+ value
55
60
  end
56
61
 
57
- def each_key
58
- return to_enum(:each_key) unless block_given?
59
- @keys.each { |key| yield(key) }
60
- self
62
+ def keys
63
+ map { |k, v| k }
61
64
  end
62
65
 
63
- def each_value
64
- return to_enum(:each_value) unless block_given?
65
- @keys.each { |key| yield(self[key]) }
66
- self
66
+ def values
67
+ map { |k, v| v }
67
68
  end
68
69
 
69
70
  def each
70
- return to_enum(:each) unless block_given?
71
- @keys.each { |key| yield([key, self[key]]) }
72
- self
73
- end
74
-
75
- def each_pair
76
- return to_enum(:each_pair) unless block_given?
77
- @keys.each { |key| yield(key, self[key]) }
71
+ return unless defined?(@first) && @first
72
+ yield [@first.key, @first.value]
73
+ node = @first
74
+ yield [node.key, node.value] while node = node.next # rubocop:disable AssignmentInCondition
78
75
  self
79
76
  end
80
77
 
81
- alias_method :select, :find_all
82
-
83
- def clear
84
- super
85
- @keys.clear
86
- self
87
- end
88
-
89
- def shift
90
- k = @keys.first
91
- v = delete(k)
92
- [k, v]
93
- end
78
+ def merge(other)
79
+ hash = self.class.new
94
80
 
95
- def merge!(other_hash)
96
- if block_given?
97
- other_hash.each { |k, v| self[k] = key?(k) ? yield(k, self[k], v) : v }
98
- else
99
- other_hash.each { |k, v| self[k] = v }
81
+ each do |key, value|
82
+ hash[key] = value
100
83
  end
101
- self
102
- end
103
-
104
- alias_method :update, :merge!
105
-
106
- def merge(other_hash, &block)
107
- dup.merge!(other_hash, &block)
108
- end
109
84
 
110
- # When replacing with another hash, the initial order of our keys must come from the other hash -ordered or not.
111
- def replace(other)
112
- super
113
- @keys = other.keys
114
- self
115
- end
85
+ other.each do |key, value|
86
+ hash[key] = value
87
+ end
116
88
 
117
- def inspect
118
- "#<#{self.class} #{super}>"
89
+ hash
119
90
  end
120
91
 
121
- private
122
-
123
- def sync_keys!
124
- @keys.delete_if { |k| !key?(k) }
92
+ def empty?
93
+ @hash.empty?
125
94
  end
126
95
  end
127
96
  end
@@ -1,6 +1,6 @@
1
1
  class Thor
2
2
  class Arguments #:nodoc: # rubocop:disable ClassLength
3
- NUMERIC = /[-+]?(\d*\.\d+|\d+)/
3
+ NUMERIC = /(\d*\.\d+|\d+)/
4
4
 
5
5
  # Receives an array of args and returns two arrays, one with arguments
6
6
  # and one with switches.
@@ -108,21 +108,6 @@ class Thor
108
108
 
109
109
  def validate!
110
110
  fail ArgumentError, "An option cannot be boolean and required." if boolean? && required?
111
- validate_default_type!
112
- end
113
-
114
- def validate_default_type!
115
- default_type = case @default
116
- when nil
117
- return
118
- when TrueClass, FalseClass
119
- :boolean
120
- when Numeric
121
- :numeric
122
- when Hash, Array, String
123
- @default.class.name.downcase.to_sym
124
- end
125
- fail ArgumentError, "An option's default must match its type." unless default_type == @type
126
111
  end
127
112
 
128
113
  def dasherized?
data/lib/thor/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Thor
2
- VERSION = "0.19.1"
2
+ VERSION = "0.19.1.1"
3
3
  end
@@ -0,0 +1,168 @@
1
+ require "helper"
2
+ require "thor/actions"
3
+
4
+ describe Thor::Actions::CreateFile do
5
+ before do
6
+ @silence = false
7
+ ::FileUtils.rm_rf(destination_root)
8
+ end
9
+
10
+ def create_file(destination = nil, config = {}, options = {})
11
+ @base = MyCounter.new([1, 2], options, :destination_root => destination_root)
12
+ allow(@base).to receive(:file_name).and_return("rdoc")
13
+
14
+ @action = Thor::Actions::CreateFile.new(@base, destination, "CONFIGURATION", {:verbose => !@silence}.merge(config))
15
+ end
16
+
17
+ def invoke!
18
+ capture(:stdout) { @action.invoke! }
19
+ end
20
+
21
+ def revoke!
22
+ capture(:stdout) { @action.revoke! }
23
+ end
24
+
25
+ def silence!
26
+ @silence = true
27
+ end
28
+
29
+ describe "#invoke!" do
30
+ it "creates a file" do
31
+ create_file("doc/config.rb")
32
+ invoke!
33
+ expect(File.exist?(File.join(destination_root, "doc/config.rb"))).to be true
34
+ end
35
+
36
+ it "does not create a file if pretending" do
37
+ create_file("doc/config.rb", {}, :pretend => true)
38
+ invoke!
39
+ expect(File.exist?(File.join(destination_root, "doc/config.rb"))).to be false
40
+ end
41
+
42
+ it "shows created status to the user" do
43
+ create_file("doc/config.rb")
44
+ expect(invoke!).to eq(" create doc/config.rb\n")
45
+ end
46
+
47
+ it "does not show any information if log status is false" do
48
+ silence!
49
+ create_file("doc/config.rb")
50
+ expect(invoke!).to be_empty
51
+ end
52
+
53
+ it "returns the given destination" do
54
+ capture(:stdout) do
55
+ expect(create_file("doc/config.rb").invoke!).to eq("doc/config.rb")
56
+ end
57
+ end
58
+
59
+ it "converts encoded instructions" do
60
+ create_file("doc/%file_name%.rb.tt")
61
+ invoke!
62
+ expect(File.exist?(File.join(destination_root, "doc/rdoc.rb.tt"))).to be true
63
+ end
64
+
65
+ describe "when file exists" do
66
+ before do
67
+ create_file("doc/config.rb")
68
+ invoke!
69
+ end
70
+
71
+ describe "and is identical" do
72
+ it "shows identical status" do
73
+ create_file("doc/config.rb")
74
+ invoke!
75
+ expect(invoke!).to eq(" identical doc/config.rb\n")
76
+ end
77
+ end
78
+
79
+ describe "and is not identical" do
80
+ before do
81
+ File.open(File.join(destination_root, "doc/config.rb"), "w") { |f| f.write("FOO = 3") }
82
+ end
83
+
84
+ it "shows forced status to the user if force is given" do
85
+ expect(create_file("doc/config.rb", {}, :force => true)).not_to be_identical
86
+ expect(invoke!).to eq(" force doc/config.rb\n")
87
+ end
88
+
89
+ it "shows skipped status to the user if skip is given" do
90
+ expect(create_file("doc/config.rb", {}, :skip => true)).not_to be_identical
91
+ expect(invoke!).to eq(" skip doc/config.rb\n")
92
+ end
93
+
94
+ it "shows forced status to the user if force is configured" do
95
+ expect(create_file("doc/config.rb", :force => true)).not_to be_identical
96
+ expect(invoke!).to eq(" force doc/config.rb\n")
97
+ end
98
+
99
+ it "shows skipped status to the user if skip is configured" do
100
+ expect(create_file("doc/config.rb", :skip => true)).not_to be_identical
101
+ expect(invoke!).to eq(" skip doc/config.rb\n")
102
+ end
103
+
104
+ it "shows conflict status to the user" do
105
+ file = File.join(destination_root, "doc/config.rb")
106
+ expect(create_file("doc/config.rb")).not_to be_identical
107
+ expect(Thor::LineEditor).to receive(:readline).with("Overwrite #{file}? (enter \"h\" for help) [Ynaqdh] ", anything).and_return("s")
108
+
109
+ content = invoke!
110
+ expect(content).to match(/conflict doc\/config\.rb/)
111
+ expect(content).to match(/skip doc\/config\.rb/)
112
+ end
113
+
114
+ it "creates the file if the file collision menu returns true" do
115
+ create_file("doc/config.rb")
116
+ expect(Thor::LineEditor).to receive(:readline).and_return("y")
117
+ expect(invoke!).to match(/force doc\/config\.rb/)
118
+ end
119
+
120
+ it "skips the file if the file collision menu returns false" do
121
+ create_file("doc/config.rb")
122
+ expect(Thor::LineEditor).to receive(:readline).and_return("n")
123
+ expect(invoke!).to match(/skip doc\/config\.rb/)
124
+ end
125
+
126
+ it "executes the block given to show file content" do
127
+ create_file("doc/config.rb")
128
+ expect(Thor::LineEditor).to receive(:readline).and_return("d", "n")
129
+ expect(@base.shell).to receive(:system).with(/diff -u/)
130
+ invoke!
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ describe "#revoke!" do
137
+ it "removes the destination file" do
138
+ create_file("doc/config.rb")
139
+ invoke!
140
+ revoke!
141
+ expect(File.exist?(@action.destination)).to be false
142
+ end
143
+
144
+ it "does not raise an error if the file does not exist" do
145
+ create_file("doc/config.rb")
146
+ revoke!
147
+ expect(File.exist?(@action.destination)).to be false
148
+ end
149
+ end
150
+
151
+ describe "#exists?" do
152
+ it "returns true if the destination file exists" do
153
+ create_file("doc/config.rb")
154
+ expect(@action.exists?).to be false
155
+ invoke!
156
+ expect(@action.exists?).to be true
157
+ end
158
+ end
159
+
160
+ describe "#identical?" do
161
+ it "returns true if the destination file exists and is identical" do
162
+ create_file("doc/config.rb")
163
+ expect(@action.identical?).to be false
164
+ invoke!
165
+ expect(@action.identical?).to be true
166
+ end
167
+ end
168
+ end