nit 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 553741b0650ad5eba01775f8cda663d3aedf8ca0
4
- data.tar.gz: 9041785b1191731540185990574b2dc3bb3978a9
3
+ metadata.gz: ad661b2510762a5a197158e53996a4b5c48443dc
4
+ data.tar.gz: c7a40b75bb9e2e1a0f15929fd478f08637ee635f
5
5
  SHA512:
6
- metadata.gz: ff8ad770fa0d4022b6712c890128d420e23bb0cefa50445e77a3bf9b895178822e308433ba955de777925d98f475e059e0b26944dff9f7d26074ae60855696d7
7
- data.tar.gz: 0aa20962038881633ce12558f12a0025b5377ed313fa539ca59992a8105320239ffa427730e8e587d3b067847556fdf4735d30aac1a052fc16fc8827527a64e1
6
+ metadata.gz: 2a53d6fcaee8a35a8c37614e211179e6b9c1c56d7501e21a6ae4a07e2bcf8b6175ea6520476eeeb964d788996e5a56177faf65a334d8a3505104ffcf6b59f304
7
+ data.tar.gz: 2a9103e438303f1cdeb3e46fd1f01d1fa8c3bef9c38766e499db0c53325d3ac5c7b9c268c3267425dcad071e50f59283957ffbbd60faec657fbff153833c085a
@@ -0,0 +1,4 @@
1
+ ## 0.0.3
2
+
3
+ * Some bug fixes.
4
+ * Allow passing arbitrary git arguments to all nit commands, like `nit commit -m "awesome work" abc"
data/README.md CHANGED
@@ -46,9 +46,25 @@ First of all, it shows you the current branch in bold.
46
46
 
47
47
  Secondly, the status screen renders a file index for each file which can be used on the command-line.
48
48
 
49
- Indexes per default are characters on the right-hand side of the filename. This can be configured, in case you prefer digits. You can also have the indexes prepended to the filename.
49
+ Indexes per default are characters on the right-hand side of the filename.
50
50
 
51
- However, scientific studies with `nit` over the last 18 years have proven that characters instead of digits are faster to reach when typing. Also, indexes _appended_ to the filename make them easier to read when deciding what to commit.
51
+ ```shell
52
+ # modified: on_stage.rb [a]
53
+ ```
54
+
55
+ This can be configured, in case you prefer digits.
56
+
57
+ ```shell
58
+ # modified: on_stage.rb [0]
59
+ ```
60
+
61
+ You can also have the indexes prepended to the filename.
62
+
63
+ ```shell
64
+ # modified: [a] on_stage.rb
65
+ ```
66
+
67
+ Learn [more](https://github.com/apotonick/nit#alternative-indexing).
52
68
 
53
69
  ## Commit
54
70
 
@@ -154,6 +170,12 @@ Will figure out the current branch and run
154
170
  git push origin <current branch>
155
171
  ```
156
172
 
173
+ Note that `pull` and `push` accept command-line options, so this will push your tags as well, if you're releasing.
174
+
175
+ ```shell
176
+ nit push --tags
177
+ ```
178
+
157
179
  ## Pull
158
180
 
159
181
  The same works for `nit pull`.
@@ -165,7 +187,7 @@ You can use nit's index interpolation for any git command.
165
187
 
166
188
  ```shell
167
189
  nit diff ab
168
- ``
190
+ ```
169
191
 
170
192
 
171
193
  ## Manual Configuration
@@ -202,6 +224,8 @@ Nap in the park.
202
224
  index_renderer = "PrependIndexRenderer"
203
225
  ```
204
226
 
227
+ However, scientific studies with `nit` over the last 18 years have proven that characters instead of digits are faster to reach when typing. Also, indexes _appended_ to the filename make them easier to read when deciding what to commit.
228
+
205
229
  ## Extending Nit
206
230
 
207
231
  Extending nit with your own commands can be done either with gems or by placing the extensions into your `.nit` directory. This will be implemented and documented soon.
data/Thorfile CHANGED
@@ -12,6 +12,7 @@ class Default < Thor
12
12
  Rake::Task["build"].execute
13
13
  end
14
14
 
15
+ # sometimes gem install pkg/nit-0.x.x works.
15
16
  desc "install", "Build and install nit-#{Nit::VERSION}.gem into system gems"
16
17
  def install
17
18
  Rake::Task["install"].execute
@@ -1,11 +1,14 @@
1
1
  require "thor"
2
2
  require "nit/files"
3
3
  require "nit/lines"
4
- require "nit/status"
5
- require "nit/commit"
6
4
  require "nit/config"
7
- require "nit/ignore"
8
-
5
+ require "nit/command"
6
+ require "nit/command/status"
7
+ require "nit/command/commit"
8
+ require "nit/command/ignore"
9
+ require "nit/command/push"
10
+ require "nit/command/pull"
11
+ require "nit/command/dynamic"
9
12
 
10
13
 
11
14
  # TODO:
@@ -23,42 +26,36 @@ module Nit
23
26
  default_command(:status)
24
27
 
25
28
  desc "status", "bla"
26
- def status
27
- puts Status.new(config).call
29
+ def status(*args)
30
+ puts Command::Status.new(config).call(args)
28
31
  end
29
32
 
30
33
  desc "commit", "blubb"
31
34
  def commit(*args)
32
- puts Commit.new(config).call(`git status`, args)
35
+ puts Command::Commit.new(config).call(args)
33
36
  end
34
37
 
35
38
  desc "ignore", "blubb"
36
39
  def ignore(*args)
37
- puts Ignore.new(config).call(`git status`, args)
40
+ puts Command::Ignore.new(config).call(args)
38
41
  end
39
42
 
40
43
  desc "unignore", "blubb"
41
44
  def unignore(*args)
42
- puts Unignore.new(config).call(`git status`, args)
45
+ puts Command::Unignore.new(config).call(args)
43
46
  end
44
47
 
45
-
46
48
  desc "pull", "pull from current branch at origin"
47
- def pull
48
- `git pull origin #{current_branch}`
49
+ def pull(*args)
50
+ puts Command::Pull.new(config).call(args)
49
51
  end
50
52
 
51
53
  desc "push", "push to current branch at origin"
52
- def push
53
- `git push origin #{current_branch}`
54
+ def push(*args)
55
+ puts Command::Push.new(config).call(args)
54
56
  end
55
57
 
56
58
  private
57
- def current_branch
58
- output = `git branch`
59
- branch = output.match(/\* (.+)/)[1].strip
60
- end
61
-
62
59
  def config
63
60
  @config ||= Config.new # TODO: eventually pass path.
64
61
  end
@@ -69,11 +66,8 @@ module Nit
69
66
 
70
67
  #class DynamicCommand < Thor::DynamicCommand
71
68
  Thor::DynamicCommand.class_eval do # see https://github.com/erikhuda/thor/pull/358
72
- def run(app, indexes)
73
- command = self.name
74
- state = Status::State.new(`git status`, app.send(:config))
75
-
76
- puts `git #{command} #{state.files.list(indexes)}`
69
+ def run(app, args)
70
+ puts Command::Dynamic.new(app.send(:config), name).call(args)
77
71
  end
78
72
  end
79
73
  end
@@ -0,0 +1,38 @@
1
+ module Nit
2
+ class Command
3
+ def initialize(config)
4
+ @config = config
5
+ end
6
+
7
+ def call(args, original=`git status`)
8
+ state = Status::State.new(original, @config)
9
+
10
+ indexes, args = process_args(args)
11
+
12
+ process(state, indexes, args)
13
+ end
14
+
15
+ private
16
+ def process_args(args)
17
+ ArgsProcessor.new(@config).call(args)
18
+ end
19
+
20
+ class ArgsProcessor
21
+ def initialize(config)
22
+ end
23
+
24
+ def call(thor_args)
25
+ args = []
26
+ indexes = []
27
+
28
+ thor_args.reverse.each do |arg|
29
+ next unless arg.size == 1 or arg =~ /^\w+$/
30
+ indexes << arg
31
+ end
32
+
33
+
34
+ [indexes.reverse, thor_args-indexes]
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,7 +1,7 @@
1
- module Nit
1
+ class Nit::Command
2
2
  class Commit < Status
3
- def process(state, indexes)
4
- system "git add #{state.files.list(indexes)} && git commit"
3
+ def process(state, indexes, args)
4
+ system "git add #{state.files.list(indexes)} && git commit #{args.join(" ")}"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,14 @@
1
+ module Nit
2
+ class Command
3
+ class Dynamic < Command
4
+ def initialize(config, name)
5
+ super(config)
6
+ @command = name
7
+ end
8
+
9
+ def process(state, indexes, args)
10
+ `git #{@command} #{args.join(" ")} #{state.files.list(indexes)}`
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,38 @@
1
+ module Nit
2
+ class Command
3
+ class Ignore < Status
4
+ def initialize(*)
5
+ super
6
+ @ignores = Files.new(@config.ignored_files, @config.indexer)
7
+ end
8
+ attr_reader :ignores
9
+
10
+ private
11
+ def process(state, indexes, args)
12
+ return show if indexes.size == 0
13
+
14
+ file_list = state.files.evaluate(indexes).compact
15
+
16
+ @config.ignored_files=(@config.ignored_files + file_list)
17
+ end
18
+
19
+ def show
20
+ return if ignores.size == 0
21
+
22
+ output = "Ignored files:\n"
23
+ ignores.each { |f| output << "[#{ignores.index(f)}] #{f}\n" }
24
+
25
+ output
26
+ end
27
+ end
28
+
29
+ class Unignore < Ignore
30
+ private
31
+ def process(state, indexes, args)
32
+ file_list = state.ignored.evaluate(indexes).compact
33
+
34
+ @config.ignored_files=(@config.ignored_files - file_list.map(&:to_s)) # FIXME: make this work with strings and File instances.
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,8 @@
1
+ class Nit::Command
2
+ class Pull < Push
3
+ private
4
+ def command
5
+ "pull"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,20 @@
1
+ module Nit
2
+ class Command
3
+ class Push < Command
4
+ def call(args, original=`git branch`)
5
+ branch = current_branch_for(original)
6
+
7
+ system("git #{command} origin #{branch} #{args.join(" ")}")
8
+ end
9
+
10
+ private
11
+ def command
12
+ "push"
13
+ end
14
+
15
+ def current_branch_for(screen)
16
+ screen.match(/\* (.+)/)[1].strip
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,90 @@
1
+ module Nit
2
+ class Command
3
+ class Status < Command
4
+ # Encapsulates the process of computing the file index from `git status`.
5
+ class State # DISCUSS: alternative names: Screen, ScreenState, FileIndexes?
6
+ # TODO: test me.
7
+ def initialize(screen_state, config)
8
+ @screen = Lines.new(screen_state)
9
+
10
+ @files, @ignored = files_for(screen, config)
11
+ end
12
+ attr_reader :files, :ignored, :screen
13
+
14
+ private
15
+ def files_for(screen, config)
16
+ files = screen.files
17
+
18
+ ignored = [] # TODO: that must be implemented by Files.
19
+ files.delete_if { |f| config.ignored_files.include?(f.path) ? ignored << f : false }
20
+
21
+ [Files.new(files, config.indexer), Files.new(ignored, config.indexer)]
22
+ end
23
+ end
24
+
25
+
26
+ def initialize(config)
27
+ super
28
+ extend config.index_renderer
29
+ end
30
+
31
+ private
32
+ def process(state, indexes, args)
33
+ files, screen, ignored = state.files, state.screen, state.ignored
34
+
35
+ files.each do |file| # TODO: should we have redundant file patterns here? it is better readable, thou.
36
+ ln = file.line
37
+ i = files.index(file)
38
+
39
+ if ln.match(screen.file_patterns[:modified])
40
+ process_modified(i, file, ln)
41
+ elsif ln.match(screen.file_patterns[:new])
42
+ process_new(i, file, ln)
43
+ end
44
+ end
45
+
46
+ # TODO: should be pluggable:
47
+ ignore_files(screen, ignored)
48
+ bold_branch(screen)
49
+
50
+ screen.to_s
51
+ end
52
+
53
+ module AppendIndexRenderer
54
+ def process_modified(i, file, line)
55
+ line << " [#{i}]"
56
+ end
57
+
58
+ def process_new(*args)
59
+ process_modified(*args)
60
+ end
61
+ end
62
+
63
+ module PrependIndexRenderer
64
+ def process_modified(i, file, line)
65
+ line.sub!("#\tmodified:", "#\tmodified: [#{i}] ")
66
+ end
67
+
68
+ def process_new(i, file, line)
69
+ line.sub!("#\t", "#\t [#{i}] ")
70
+ end
71
+ end
72
+
73
+
74
+ def bold_branch(lines)
75
+ lines.find(/# On branch (.+)/) do |ln, matches|
76
+ line = "# On branch \033[1m#{matches[1]}\033[22m"
77
+ ln.replace(line)
78
+ end
79
+ end
80
+
81
+ def ignore_files(screen, ignored)
82
+ return unless ignored.size > 0
83
+
84
+ ignored.each { |f| f.line.delete }
85
+ screen << "#"
86
+ screen << "# Ignored files: #{ignored.size}"
87
+ end
88
+ end
89
+ end
90
+ end
@@ -64,7 +64,7 @@ module Nit
64
64
 
65
65
  def index_renderer
66
66
  const = file.read("index_renderer") || "AppendIndexRenderer"
67
- Nit::Status.const_get(const)
67
+ Nit::Command::Status.const_get(const)
68
68
  end
69
69
 
70
70
  def index_renderer=(value)
@@ -1,6 +1,6 @@
1
1
  module Nit
2
2
  class Files < Array
3
- def initialize(arr=[], indexer=IntegerIndexer)
3
+ def initialize(arr=[], indexer=IntegerIndexer) # FIXME: make 2nd arg obligatory.
4
4
  super(arr)
5
5
  extend indexer
6
6
  end
@@ -1,3 +1,3 @@
1
1
  module Nit
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,53 @@
1
+ require 'test_helper'
2
+
3
+ class CommandsTest < MiniTest::Spec
4
+ let (:config) { Nit::Config.new }
5
+ let (:cmd_obj) { Nit::Command.const_get(klass).new(config) }
6
+ let (:cmd) { cmd_obj.tap do |obj|
7
+ obj.instance_eval do
8
+ def system(string); string; end
9
+ end
10
+ end }
11
+
12
+
13
+ describe "push" do
14
+ let (:klass) { "Push" }
15
+ let (:screen) { "* master\n" }
16
+
17
+ it { cmd.call([], screen).must_equal("git push origin master ") }
18
+ it { cmd.call(["--tags"], screen).must_equal("git push origin master --tags") }
19
+ end
20
+
21
+ describe "pull" do
22
+ let (:klass) { "Pull" }
23
+ let (:screen) { "* master\n" }
24
+
25
+ it { cmd.call([], screen).must_equal("git pull origin master ") }
26
+ it { cmd.call(["--tags"], screen).must_equal("git pull origin master --tags") }
27
+ end
28
+
29
+ describe "commit" do
30
+ let (:klass) { "Commit" }
31
+ let (:screen) { output }
32
+
33
+ it "also ignores files when commiting" do
34
+ config.ignored_files = ["new.rb", "brandnew.rb", "staged.rb"] # TODO: make this more generic.
35
+
36
+ cmd.call(["b"], output).must_equal "git add ../lib/new.rb && git commit "
37
+ end
38
+
39
+ it { cmd.call(["-m", '"awesome work"', "b"], output).must_equal "git add ../lib/new.rb && git commit -m \"awesome work\"" }
40
+
41
+ # TODO: test nit commit -a
42
+ end
43
+ end
44
+
45
+ class ArgsProcessorTest < MiniTest::Spec
46
+ let (:config) { Nit::Config.new }
47
+ subject { Nit::Command::ArgsProcessor.new(config) }
48
+
49
+ it { subject.call([]).must_equal [[], []] }
50
+ it { subject.call(["-a"]).must_equal [[], ["-a"]] }
51
+ it { subject.call(["-a", "-m", '"message"', "abc"]).must_equal [["abc"], ["-a", "-m", '"message"']] }
52
+ it { subject.call(["-m", '"message"', "a", "b"]).must_equal [["a", "b"], ["-m", '"message"']] }
53
+ end
@@ -11,5 +11,5 @@ class ConfigTest < MiniTest::Spec
11
11
  subject.indexer.must_equal Nit::Files::CharIndexer
12
12
  end
13
13
 
14
- it { subject.index_renderer.must_equal Nit::Status::AppendIndexRenderer }
14
+ it { subject.index_renderer.must_equal Nit::Command::Status::AppendIndexRenderer }
15
15
  end
@@ -1,36 +1,35 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class IgnoreTest < StatusTest
4
- let (:config) { cfg = Nit::Config.new; cfg.indexer = "IntegerIndexer"; cfg }
5
-
4
+ let (:config) { Nit::Config.new }
6
5
  after do
7
6
  config.send(:file).rm!
8
7
  end
9
8
 
10
9
  it "ignores invalid indexes" do
11
- Nit::Ignore.new(config).call(output, [100])
10
+ Nit::Command::Ignore.new(config).call(["z"], output)
12
11
  config.ignored_files.must_equal []
13
12
  end
14
13
 
15
14
  it "what" do
16
15
  config.ignored_files.must_equal []
17
16
 
18
- Nit::Ignore.new(config).call(output, [0,1])
17
+ Nit::Command::Ignore.new(config).call(["ab"], output)
19
18
 
20
19
  config.ignored_files.must_equal ["on_stage.rb", "staged.rb"]
21
20
  end
22
21
 
23
22
  describe "ignore (no arguments)" do
24
23
  it "blanks when nothing ignored" do
25
- Nit::Ignore.new(config).call(output, []).must_equal nil
24
+ Nit::Command::Ignore.new(config).call([], output).must_equal nil
26
25
  end
27
26
 
28
27
  it "shows ignored files" do
29
- Nit::Ignore.new(config).call(output, [1])
28
+ Nit::Command::Ignore.new(config).call(["b"], output)
30
29
 
31
- Nit::Ignore.new(config).call(output, []).must_equal <<-EOF
30
+ Nit::Command::Ignore.new(config).call([], output).must_equal <<-EOF
32
31
  Ignored files:
33
- [0] staged.rb
32
+ [a] staged.rb
34
33
  EOF
35
34
  # FIXME: why is <<- not working?
36
35
  end
@@ -38,8 +37,8 @@ EOF
38
37
 
39
38
  describe "unignore 1 2" do
40
39
  it "what" do
41
- Nit::Ignore.new(config).call(output, [0,1])
42
- Nit::Unignore.new(config).call(output, [1])
40
+ Nit::Command::Ignore.new(config).call(["ab"], output)
41
+ Nit::Command::Unignore.new(config).call(["b"], output)
43
42
  config.ignored_files.must_equal ["on_stage.rb"]
44
43
  end
45
44
  end
@@ -35,8 +35,10 @@ class DynamicCommandTest < NitTest
35
35
  end
36
36
  end
37
37
 
38
- class DiffTest < NitTest
38
+ class ArbitraryGitCommandsTest < NitTest
39
39
  it { nit(" diff b").must_match "a\/staged.rb" }
40
+
41
+ it { nit(" diff --raw b").must_equal ":100644 100644 e69de29... 0000000... M\tstaged.rb\n" }
40
42
  end
41
43
 
42
44
  class NitWithCharIndexerTest < NitTest
@@ -8,30 +8,12 @@ class StatusTest < MiniTest::Spec
8
8
  end
9
9
  end
10
10
 
11
- let (:output) do <<-EOF
12
- # On branch master
13
- # Changes not staged for commit:
14
- # (use "git add <file>..." to update what will be committed)
15
- # (use "git checkout -- <file>..." to discard changes in working directory)
16
- #
17
- #\tmodified: on_stage.rb
18
- #\tmodified: staged.rb
19
- #
20
- # Untracked files:
21
- # (use "git add <file>..." to include in what will be committed)
22
- #
23
- #\tbrandnew.rb
24
- #\tnew.rb
25
- #\t../lib/new.rb
26
- no changes added to commit (use "git add" and/or "git commit -a")
27
- EOF
28
- end
29
- subject { Nit::Status.new(config) }
11
+ subject { Nit::Command::Status.new(config) }
30
12
 
31
13
 
32
14
  describe "indexing" do
33
15
  it "numbers files" do
34
- console = subject.call(output)
16
+ console = subject.call([], output)
35
17
  console.must_match "modified: [0] on_stage.rb"
36
18
  console.must_match "modified: [1] staged.rb"
37
19
  console.must_match "[2] brandnew.rb"
@@ -43,7 +25,7 @@ class StatusTest < MiniTest::Spec
43
25
  it "indexes files" do
44
26
  config.indexer = "CharIndexer"
45
27
 
46
- console = subject.call(output)
28
+ console = subject.call([], output)
47
29
  console.must_match "modified: [a] on_stage.rb"
48
30
  console.must_match "modified: [b] staged.rb"
49
31
  console.must_match "[c] brandnew.rb"
@@ -57,13 +39,13 @@ class StatusTest < MiniTest::Spec
57
39
  end
58
40
 
59
41
  it "doesn't show ignored files count per default" do
60
- subject.call(output).wont_match(/Ignored files:/)
42
+ subject.call([], output).wont_match(/Ignored files:/)
61
43
  end
62
44
 
63
45
  it "shows ignored files when ignoring" do
64
46
  config.ignored_files = ["new.rb", "brandnew.rb", "staged.rb"] # TODO: make this more generic.
65
47
 
66
- console = subject.call(output)
48
+ console = subject.call([], output)
67
49
  console.must_match "[1] ../lib/new.rb" # this file has a new index since all other ignored.
68
50
  console.must_match "Ignored files: 3"
69
51
  console.wont_match " staged.rb"
@@ -71,18 +53,5 @@ class StatusTest < MiniTest::Spec
71
53
  console.wont_match " brandnew.rb"
72
54
  console.must_match " ../lib/new.rb"
73
55
  end
74
-
75
- it "also ignores files when commiting" do
76
- config.ignored_files = ["new.rb", "brandnew.rb", "staged.rb"] # TODO: make this more generic.
77
-
78
- commit = Nit::Commit.new(config)
79
- commit.instance_eval do
80
- def system(command)
81
- command
82
- end
83
- end
84
-
85
- commit.call(output, [1]).must_equal "git add ../lib/new.rb && git commit"
86
- end
87
56
  end
88
57
  end
@@ -1,2 +1,23 @@
1
1
  require 'minitest/autorun'
2
2
  require 'nit/app'
3
+
4
+ MiniTest::Spec.class_eval do
5
+ let (:output) do <<-EOF
6
+ # On branch master
7
+ # Changes not staged for commit:
8
+ # (use "git add <file>..." to update what will be committed)
9
+ # (use "git checkout -- <file>..." to discard changes in working directory)
10
+ #
11
+ #\tmodified: on_stage.rb
12
+ #\tmodified: staged.rb
13
+ #
14
+ # Untracked files:
15
+ # (use "git add <file>..." to include in what will be committed)
16
+ #
17
+ #\tbrandnew.rb
18
+ #\tnew.rb
19
+ #\t../lib/new.rb
20
+ no changes added to commit (use "git add" and/or "git commit -a")
21
+ EOF
22
+ end
23
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-12 00:00:00.000000000 Z
11
+ date: 2013-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -75,6 +75,7 @@ extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
77
  - .gitignore
78
+ - CHANGES.md
78
79
  - Gemfile
79
80
  - LICENSE.txt
80
81
  - README.md
@@ -84,14 +85,19 @@ files:
84
85
  - lib/nit.rb
85
86
  - lib/nit/CHANGES.mk
86
87
  - lib/nit/app.rb
87
- - lib/nit/commit.rb
88
+ - lib/nit/command.rb
89
+ - lib/nit/command/commit.rb
90
+ - lib/nit/command/dynamic.rb
91
+ - lib/nit/command/ignore.rb
92
+ - lib/nit/command/pull.rb
93
+ - lib/nit/command/push.rb
94
+ - lib/nit/command/status.rb
88
95
  - lib/nit/config.rb
89
96
  - lib/nit/files.rb
90
- - lib/nit/ignore.rb
91
97
  - lib/nit/lines.rb
92
- - lib/nit/status.rb
93
98
  - lib/nit/version.rb
94
99
  - nit.gemspec
100
+ - test/commands_test.rb
95
101
  - test/config_test.rb
96
102
  - test/dummies/stage/.gitignore
97
103
  - test/dummies/stage/brandnew.rb
@@ -152,6 +158,7 @@ signing_key:
152
158
  specification_version: 4
153
159
  summary: Nit improves your git workflows.
154
160
  test_files:
161
+ - test/commands_test.rb
155
162
  - test/config_test.rb
156
163
  - test/dummies/stage/.gitignore
157
164
  - test/dummies/stage/brandnew.rb
@@ -1,36 +0,0 @@
1
- module Nit
2
- class Ignore < Status
3
- def initialize(*)
4
- super
5
- @ignores = Files.new(@config.ignored_files)
6
- end
7
- attr_reader :ignores
8
-
9
- private
10
- def process(state, indexes)
11
- return show if indexes.size == 0
12
-
13
- file_list = state.files.evaluate(indexes).compact
14
-
15
- @config.ignored_files=(@config.ignored_files + file_list)
16
- end
17
-
18
- def show
19
- return if ignores.size == 0
20
-
21
- output = "Ignored files:\n"
22
- ignores.each { |f| output << "[#{ignores.index(f)}] #{f}\n" }
23
-
24
- output
25
- end
26
- end
27
-
28
- class Unignore < Ignore
29
- private
30
- def process(state, indexes)
31
- file_list = state.ignored.evaluate(indexes).compact
32
-
33
- @config.ignored_files=(@config.ignored_files - file_list.map(&:to_s)) # FIXME: make this work with strings and File instances.
34
- end
35
- end
36
- end
@@ -1,94 +0,0 @@
1
- module Nit
2
- class Status
3
- # Encapsulates the process of computing the file index from `git status`.
4
- class State # DISCUSS: alternative names: Screen, ScreenState, FileIndexes?
5
- # TODO: test me.
6
- def initialize(screen_state, config)
7
- @screen = Lines.new(screen_state)
8
-
9
- @files, @ignored = files_for(screen, config)
10
- end
11
- attr_reader :files, :ignored, :screen
12
-
13
- private
14
- def files_for(screen, config)
15
- files = screen.files
16
-
17
- ignored = [] # TODO: that must be implemented by Files.
18
- files.delete_if { |f| config.ignored_files.include?(f.path) ? ignored << f : false }
19
-
20
- [Files.new(files, config.indexer), Files.new(ignored, config.indexer)]
21
- end
22
- end
23
-
24
-
25
- def initialize(config)
26
- @config = config
27
- extend config.index_renderer
28
- end
29
-
30
- def call(original=`git status`, *args)
31
- state = State.new(original, @config)
32
-
33
- process(state, *args)
34
- end
35
-
36
- private
37
- def process(state)
38
- files, screen, ignored = state.files, state.screen, state.ignored
39
-
40
- files.each do |file| # TODO: should we have redundant file patterns here? it is better readable, thou.
41
- ln = file.line
42
- i = files.index(file)
43
-
44
- if ln.match(screen.file_patterns[:modified])
45
- process_modified(i, file, ln)
46
- elsif ln.match(screen.file_patterns[:new])
47
- process_new(i, file, ln)
48
- end
49
- end
50
-
51
- # TODO: should be pluggable:
52
- ignore_files(screen, ignored)
53
- bold_branch(screen)
54
-
55
- screen.to_s
56
- end
57
-
58
- module AppendIndexRenderer
59
- def process_modified(i, file, line)
60
- line << " [#{i}]"
61
- end
62
-
63
- def process_new(*args)
64
- process_modified(*args)
65
- end
66
- end
67
-
68
- module PrependIndexRenderer
69
- def process_modified(i, file, line)
70
- line.sub!("#\tmodified:", "#\tmodified: [#{i}] ")
71
- end
72
-
73
- def process_new(i, file, line)
74
- line.sub!("#\t", "#\t [#{i}] ")
75
- end
76
- end
77
-
78
-
79
- def bold_branch(lines)
80
- lines.find(/# On branch (.+)/) do |ln, matches|
81
- line = "# On branch \033[1m#{matches[1]}\033[22m"
82
- ln.replace(line)
83
- end
84
- end
85
-
86
- def ignore_files(screen, ignored)
87
- return unless ignored.size > 0
88
-
89
- ignored.each { |f| f.line.delete }
90
- screen << "#"
91
- screen << "# Ignored files: #{ignored.size}"
92
- end
93
- end
94
- end