ing 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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'