ing 0.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 (59) hide show
  1. data/.gitignore +5 -0
  2. data/GENERATORS.md +2 -0
  3. data/LICENSE +18 -0
  4. data/OPTIONS.md +2 -0
  5. data/README.md +251 -0
  6. data/TASKS.md +21 -0
  7. data/bin/ing +5 -0
  8. data/examples/rspec_convert.rb +102 -0
  9. data/ing.gemspec +29 -0
  10. data/ing.rb +102 -0
  11. data/lib/ing.rb +78 -0
  12. data/lib/ing/actions/create_file.rb +105 -0
  13. data/lib/ing/actions/create_link.rb +57 -0
  14. data/lib/ing/actions/directory.rb +98 -0
  15. data/lib/ing/actions/empty_directory.rb +155 -0
  16. data/lib/ing/actions/file_manipulation.rb +308 -0
  17. data/lib/ing/actions/inject_into_file.rb +109 -0
  18. data/lib/ing/commands/boot.rb +76 -0
  19. data/lib/ing/commands/generate.rb +64 -0
  20. data/lib/ing/commands/help.rb +87 -0
  21. data/lib/ing/commands/implicit.rb +59 -0
  22. data/lib/ing/commands/list.rb +108 -0
  23. data/lib/ing/dispatcher.rb +132 -0
  24. data/lib/ing/files.rb +190 -0
  25. data/lib/ing/lib_trollop.rb +782 -0
  26. data/lib/ing/shell.rb +390 -0
  27. data/lib/ing/trollop/parser.rb +17 -0
  28. data/lib/ing/util.rb +61 -0
  29. data/lib/ing/version.rb +3 -0
  30. data/lib/thor/actions/file_manipulation.rb +30 -0
  31. data/lib/thor/shell/basic.rb +44 -0
  32. data/test/acceptance/ing_run_tests.rb +164 -0
  33. data/test/actions/create_file_spec.rb +209 -0
  34. data/test/actions/create_link_spec.rb +90 -0
  35. data/test/actions/directory_spec.rb +167 -0
  36. data/test/actions/empty_directory_spec.rb +146 -0
  37. data/test/actions/file_manipulation_spec.rb +433 -0
  38. data/test/actions/inject_into_file_spec.rb +147 -0
  39. data/test/fixtures/application.rb +2 -0
  40. data/test/fixtures/app{1}/README +3 -0
  41. data/test/fixtures/bundle/execute.rb +6 -0
  42. data/test/fixtures/bundle/main.thor +1 -0
  43. data/test/fixtures/doc/%file_name%.rb.tt +1 -0
  44. data/test/fixtures/doc/COMMENTER +10 -0
  45. data/test/fixtures/doc/README +3 -0
  46. data/test/fixtures/doc/block_helper.rb +3 -0
  47. data/test/fixtures/doc/components/.empty_directory +0 -0
  48. data/test/fixtures/doc/config.rb +1 -0
  49. data/test/fixtures/doc/config.yaml.tt +1 -0
  50. data/test/fixtures/group.ing.rb +76 -0
  51. data/test/fixtures/invok.ing.rb +50 -0
  52. data/test/fixtures/namespace.ing.rb +52 -0
  53. data/test/fixtures/require.ing.rb +7 -0
  54. data/test/fixtures/task.ing.rb +36 -0
  55. data/test/fixtures/task.thor +10 -0
  56. data/test/spec_helper.rb +2 -0
  57. data/test/test_helper.rb +41 -0
  58. data/todo.yml +7 -0
  59. metadata +147 -0
@@ -0,0 +1,147 @@
1
+ require File.expand_path('../spec_helper', File.dirname(__FILE__))
2
+ require File.expand_path("../../lib/ing/files", File.dirname(__FILE__))
3
+
4
+ describe Ing::Files::InjectIntoFile do
5
+ include SpecHelpers
6
+
7
+ def reset
8
+ ::FileUtils.rm_rf(destination_root)
9
+ ::FileUtils.cp_r(source_root, destination_root)
10
+ end
11
+
12
+ def invoker(options={})
13
+ @invoker ||= begin
14
+ i = MyCounter.new(options)
15
+ i.destination_root = destination_root
16
+ i.call 1,2
17
+ i
18
+ end
19
+ end
20
+
21
+ def revoker
22
+ @revoker ||= begin
23
+ r = MyCounter.new({:revoke => true})
24
+ r.destination_root = destination_root
25
+ r.call 1,2
26
+ r
27
+ end
28
+ end
29
+
30
+ def invoke!(*args, &block)
31
+ capture(:stdout){ invoker.insert_into_file(*args, &block) }
32
+ end
33
+
34
+ def revoke!(*args, &block)
35
+ capture(:stdout){ revoker.insert_into_file(*args, &block) }
36
+ end
37
+
38
+ def file
39
+ File.join(destination_root, "doc/README")
40
+ end
41
+
42
+ describe "#invoke!" do
43
+ before { reset }
44
+
45
+ it "changes the file adding content after the flag" do
46
+ invoke! "doc/README", "\nmore content", :after => "__start__"
47
+ assert_equal "__start__\nmore content\nREADME\n__end__\n", File.read(file)
48
+ end
49
+
50
+ it "changes the file adding content before the flag" do
51
+ invoke! "doc/README", "more content\n", :before => "__end__"
52
+ assert_equal "__start__\nREADME\nmore content\n__end__\n", File.read(file)
53
+ end
54
+
55
+ it "accepts data as a block" do
56
+ invoke! "doc/README", :before => "__end__" do
57
+ "more content\n"
58
+ end
59
+ assert_equal "__start__\nREADME\nmore content\n__end__\n", File.read(file)
60
+ end
61
+
62
+ it "logs status" do
63
+ assert_equal " insert doc/README\n",
64
+ invoke!("doc/README", "\nmore content", :after => "__start__")
65
+ end
66
+
67
+ it "does not change the file if pretending" do
68
+ invoker :pretend => true
69
+ invoke! "doc/README", "\nmore content", :after => "__start__"
70
+ assert_equal "__start__\nREADME\n__end__\n", File.read(file)
71
+ end
72
+
73
+ it "does not change the file if already include content" do
74
+ invoke! "doc/README", :before => "__end__" do
75
+ "more content\n"
76
+ end
77
+ assert_equal "__start__\nREADME\nmore content\n__end__\n", File.read(file)
78
+
79
+ invoke! "doc/README", :before => "__end__" do
80
+ "more content\n"
81
+ end
82
+ assert_equal "__start__\nREADME\nmore content\n__end__\n", File.read(file)
83
+ end
84
+
85
+ it "does change the file if already include content and :force == true" do
86
+ invoke! "doc/README", :before => "__end__" do
87
+ "more content\n"
88
+ end
89
+ assert_equal "__start__\nREADME\nmore content\n__end__\n", File.read(file)
90
+
91
+ invoke! "doc/README", :before => "__end__", :force => true do
92
+ "more content\n"
93
+ end
94
+ assert_equal "__start__\nREADME\nmore content\nmore content\n__end__\n", File.read(file)
95
+ end
96
+
97
+ end
98
+
99
+ describe "#revoke!" do
100
+ before { reset }
101
+
102
+ it "substracts the destination file after injection" do
103
+ invoke! "doc/README", "\nmore content", :after => "__start__"
104
+ revoke! "doc/README", "\nmore content", :after => "__start__"
105
+ assert_equal "__start__\nREADME\n__end__\n", File.read(file)
106
+ end
107
+
108
+ it "substracts the destination file before injection" do
109
+ invoke! "doc/README", "more content\n", :before => "__start__"
110
+ revoke! "doc/README", "more content\n", :before => "__start__"
111
+ assert_equal "__start__\nREADME\n__end__\n", File.read(file)
112
+ end
113
+
114
+ it "substracts even with double after injection" do
115
+ invoke! "doc/README", "\nmore content", :after => "__start__"
116
+ invoke! "doc/README", "\nanother stuff", :after => "__start__"
117
+ revoke! "doc/README", "\nmore content", :after => "__start__"
118
+ assert_equal "__start__\nanother stuff\nREADME\n__end__\n", File.read(file)
119
+ end
120
+
121
+ it "substracts even with double before injection" do
122
+ invoke! "doc/README", "more content\n", :before => "__start__"
123
+ invoke! "doc/README", "another stuff\n", :before => "__start__"
124
+ revoke! "doc/README", "more content\n", :before => "__start__"
125
+ assert_equal "another stuff\n__start__\nREADME\n__end__\n", File.read(file)
126
+ end
127
+
128
+ it "substracts when prepending" do
129
+ invoke! "doc/README", "more content\n", :after => /\A/
130
+ invoke! "doc/README", "another stuff\n", :after => /\A/
131
+ revoke! "doc/README", "more content\n", :after => /\A/
132
+ assert_equal "another stuff\n__start__\nREADME\n__end__\n", File.read(file)
133
+ end
134
+
135
+ it "substracts when appending" do
136
+ invoke! "doc/README", "more content\n", :before => /\z/
137
+ invoke! "doc/README", "another stuff\n", :before => /\z/
138
+ revoke! "doc/README", "more content\n", :before => /\z/
139
+ assert_equal "__start__\nREADME\n__end__\nanother stuff\n", File.read(file)
140
+ end
141
+
142
+ it "shows progress information to the user" do
143
+ invoke!("doc/README", "\nmore content", :after => "__start__")
144
+ assert_equal " subtract doc/README\n", revoke!("doc/README", "\nmore content", :after => "__start__")
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,2 @@
1
+ class Application < Base
2
+ end
@@ -0,0 +1,3 @@
1
+ __start__
2
+ README
3
+ __end__
@@ -0,0 +1,6 @@
1
+ class Execute < Thor
2
+ desc "ls", "Execute ls"
3
+ def ls
4
+ system "ls"
5
+ end
6
+ end
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), 'execute')
@@ -0,0 +1 @@
1
+ FOO = <%= "FOO" %>
@@ -0,0 +1,10 @@
1
+ __start__
2
+ # greenblue
3
+ # yellowblue
4
+ #yellowred
5
+ #greenred
6
+ orange
7
+ purple
8
+ ind#igo
9
+ # ind#igo
10
+ __end__
@@ -0,0 +1,3 @@
1
+ __start__
2
+ README
3
+ __end__
@@ -0,0 +1,3 @@
1
+ <% world do -%>
2
+ Hello
3
+ <% end -%>
File without changes
@@ -0,0 +1 @@
1
+ class <%= @klass %>; end
@@ -0,0 +1 @@
1
+ --- Hi from yaml
@@ -0,0 +1,76 @@
1
+ # Note: these are Ing::Files fixtures
2
+ # used in actions specs adapted from Thor
3
+
4
+ class MyCounter
5
+
6
+ def self.specify_options(expect)
7
+ expect.opt :third, "The third argument", :type => :numeric, :default => 3,
8
+ :short => "t"
9
+ expect.opt :fourth, "The fourth argument", :type => :numeric
10
+ expect.banner "This generator runs three tasks: one, two and three."
11
+ end
12
+
13
+ include Ing::Files
14
+
15
+ def source_root
16
+ File.expand_path(File.dirname(__FILE__))
17
+ end
18
+
19
+ attr_accessor :destination_root, :options, :first, :second, :shell
20
+
21
+ def shell
22
+ @shell ||= Ing.shell_class.new
23
+ end
24
+
25
+ def initialize(options)
26
+ self.options = options
27
+ end
28
+
29
+ def call(*args)
30
+ self.first, self.second = args.shift, args.shift
31
+ one; two; three
32
+ end
33
+
34
+ def one
35
+ first
36
+ end
37
+
38
+ def two
39
+ second
40
+ end
41
+
42
+ def three
43
+ options[:third]
44
+ end
45
+
46
+ def world(&block)
47
+ result = capture(&block)
48
+ concat(result.strip + " world!")
49
+ end
50
+
51
+ end
52
+
53
+
54
+ class WhinyGenerator
55
+ include Ing::Files
56
+
57
+ def source_root
58
+ File.expand_path(File.dirname(__FILE__))
59
+ end
60
+
61
+ attr_accessor :destination_root, :options, :shell
62
+
63
+ def shell
64
+ @shell ||= Ing.shell_class.new
65
+ end
66
+
67
+ def initialize(options)
68
+ self.options = options
69
+ end
70
+
71
+ def call(*args)
72
+ end
73
+
74
+ def wrong_arity(required)
75
+ end
76
+ end
@@ -0,0 +1,50 @@
1
+ # Translates Thor's example
2
+ # https://github.com/wycats/thor/wiki/Invocations
3
+ #
4
+ module Invoking
5
+
6
+ class Counter
7
+
8
+ def initialize(options); end
9
+
10
+ def one
11
+ puts 1
12
+ Ing.invoke self.class, :two
13
+ Ing.invoke self.class, :three
14
+ end
15
+
16
+ def two
17
+ puts 2
18
+ Ing.invoke self.class, :three
19
+ end
20
+
21
+ def three
22
+ puts 3
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ module Executing
29
+
30
+ class Counter
31
+
32
+ def initialize(options); end
33
+
34
+ def one
35
+ puts 1
36
+ Ing.execute self.class, :two
37
+ Ing.execute self.class, :three
38
+ end
39
+
40
+ def two
41
+ puts 2
42
+ Ing.execute self.class, :three
43
+ end
44
+
45
+ def three
46
+ puts 3
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,52 @@
1
+ module SomeBaseNamespace
2
+
3
+ module One
4
+
5
+ module Two
6
+
7
+ module Three
8
+
9
+ class Echo
10
+
11
+ def initialize(options); end
12
+
13
+ def call(arg)
14
+ puts arg
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ module One
28
+ module Two
29
+ module Three
30
+ class Echo
31
+
32
+ def initialize(options); end
33
+
34
+ def call(arg)
35
+ puts "wrong"
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+
44
+ class Echo
45
+
46
+ def initialize(options); end
47
+
48
+ def call(arg)
49
+ puts "also wrong"
50
+ end
51
+
52
+ end
@@ -0,0 +1,7 @@
1
+ 
2
+ class DynamicRequire
3
+
4
+ def initialize(options); end
5
+
6
+ def call(*args); end
7
+ end
@@ -0,0 +1,36 @@
1
+ 
2
+ class CountArgs
3
+
4
+ attr_accessor :options
5
+
6
+ def initialize(options)
7
+ self.options = options
8
+ end
9
+
10
+ def call(*args)
11
+ puts "#{self.class} called with #{args.length} args"
12
+ end
13
+
14
+ end
15
+
16
+ class Amazing
17
+
18
+ def self.specify_options(expect)
19
+ expect.banner "describe NAME"
20
+ expect.text "say that someone is amazing"
21
+ expect.opt :forcefully
22
+ end
23
+
24
+ attr_accessor :options
25
+
26
+ def initialize(options)
27
+ self.options = options
28
+ end
29
+
30
+ def describe(name)
31
+ ret = "#{name} is amazing"
32
+ puts options[:forcefully] ? ret.upcase : ret
33
+ end
34
+
35
+ end
36
+
@@ -0,0 +1,10 @@
1
+ # module: random
2
+
3
+ class Amazing < Thor
4
+ desc "describe NAME", "say that someone is amazing"
5
+ method_options :forcefully => :boolean
6
+ def describe(name, opts)
7
+ ret = "#{name} is amazing"
8
+ puts opts["forcefully"] ? ret.upcase : ret
9
+ end
10
+ end
@@ -0,0 +1,2 @@
1
+ # This file is just needed for compatibility with running Thor specs
2
+ require_relative 'test_helper'