noir 0.1.4 → 0.1.5

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: 8995959adf4e36125c76b32568e6d6219a5d9e66
4
- data.tar.gz: b5bcaad3754cdb1135cc1f8822ec529a801685cf
3
+ metadata.gz: 90bd80b4b1f6e7433d7768ccb5a84795f60a9ad7
4
+ data.tar.gz: a436503e74bbe62820630f46a22971167dc72412
5
5
  SHA512:
6
- metadata.gz: a17b254027bb5228a9d0349dc7854dce29fb07f6967c62e179f227b005349415eeea74a6a785e286a49406e775d4a9bfa6c7c5e248abbb104feff943a0e69529
7
- data.tar.gz: e265c5fc9db8c6bd4c4241c4dbec68e566f4325a70fefb9d97d415c034a593ea5c6cdd0072f62548d681eba5bceaa4b1ae0b74c6abf933d5577397ab20ea7a7b
6
+ metadata.gz: e0135f35c72625357304488ee8bd959ade2ef844d61564a0a7c53be659d224c318fa9b340a493af9e5dab307ebdfb2b358ea9ae7cbbfab7cf9bcb1652e235856
7
+ data.tar.gz: f9e42d8a89705329f4e163ce9c072413ae9f3c458cf3b5aeafa5a6085e6f29fa363c4672be9479206833047c25e44889570964f1a990104e4109ab4b02b7b81c
data/.travis.yml ADDED
@@ -0,0 +1 @@
1
+ language: ruby
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
1
  # Noir
2
+ [![Gem Version](https://badge.fury.io/rb/noir.svg)](http://badge.fury.io/rb/noir)
3
+ [![Build Status](https://travis-ci.org/atton-/noir.svg)](https://travis-ci.org/atton-/noir)
4
+ [![Code Climate](https://codeclimate.com/github/atton-/noir/badges/gpa.svg)](https://codeclimate.com/github/atton-/noir)
2
5
 
3
6
  Noir is utility commands for atton.
4
7
 
@@ -13,9 +16,9 @@ Noir is utility commands for atton.
13
16
 
14
17
  ## Enable Completion
15
18
 
16
- Add this code in .zshrc
19
+ Add this code in .zshrc
17
20
 
18
- ``` if which noir >& /dev/null; then eval "$(noir init zsh)"; fi ```
21
+ if which noir >& /dev/null; then eval "$(noir init zsh)"; fi
19
22
 
20
23
  ## Contributing
21
24
 
data/Rakefile CHANGED
@@ -1 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/lib/noir/command.rb CHANGED
@@ -10,6 +10,8 @@ end
10
10
 
11
11
  require 'noir/command/init'
12
12
  require 'noir/command/completion'
13
+
14
+ require 'noir/command/calculate'
15
+ require 'noir/command/edit'
13
16
  require 'noir/command/help'
14
17
  require 'noir/command/new'
15
- require 'noir/command/edit'
@@ -0,0 +1,5 @@
1
+ class Noir::Command::Calculate < Noir::Base::Command
2
+ @description = 'calculate utilities'
3
+ end
4
+
5
+ require 'noir/command/calculate/time'
@@ -0,0 +1,79 @@
1
+ require 'time'
2
+
3
+ class Noir::Command::Calculate::Time < Noir::Base::TerminalCommand
4
+ @description = 'calculate formatted time in .txt file. time format : (%Y/%m/%d %H:%M:%S)'
5
+
6
+ TimeFormat = "%Y/%m/%d %H:%M:%S"
7
+ TimeRegexp = Regexp.new('^\s*\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}$')
8
+
9
+ class << self
10
+ def execute *args
11
+ raise 'Please input target on commant arguments. (directory or .txt file)' if args.size.zero?
12
+
13
+ files = args.map{|f| extract_path(f)}.flatten
14
+
15
+ time_pairs = files.map{|f| pick_up_times(f)}
16
+
17
+ total_time = 0
18
+ files.zip(time_pairs) do |file, pairs|
19
+ print_file_total file, pairs
20
+ total_time += calc_total(pairs)
21
+ puts '-----'
22
+ end
23
+
24
+ puts "all total time : #{seconds_to_string(total_time)}"
25
+ end
26
+
27
+ def extract_path path
28
+ raise "File not found. #{path}" unless File.exists?(path)
29
+ return path if File.file?(path)
30
+
31
+ if File.directory?(path)
32
+ return Dir.entries(path).reject{|filename| filename.start_with?('.') || File.directory?(filename)}
33
+ end
34
+
35
+ raise "Invalid path. please input file or directory #{path}"
36
+ end
37
+
38
+ def pick_up_times path
39
+ text = File.read(path)
40
+ times = text.split("\n").select{|t| t =~ TimeRegexp}.map{|t| t.match(TimeRegexp).to_s.gsub(/^\s*/, '')}
41
+
42
+ raise "Count of formatted time is not even. : #{path}" unless times.size.even?
43
+
44
+ times = times.map{|t| Time.strptime(t, TimeFormat)}
45
+
46
+ raise "Formatted time was not sorted in #{path}" unless times.sort == times
47
+
48
+ diffs = times.map.each_slice(2).to_a
49
+ end
50
+
51
+ def calc_total time_pairs
52
+ time_pairs.map{|start, finish| finish - start}.inject(:+) || 0
53
+ end
54
+
55
+ def print_file_total file, time_pairs
56
+ if time_pairs.empty?
57
+ puts("Formatted time not found in : #{file}")
58
+ return
59
+ end
60
+
61
+ puts file
62
+
63
+ time_pairs.each do |start, finish|
64
+ diff = finish - start
65
+ puts "#{start.strftime(TimeFormat)} => #{finish.strftime(TimeFormat)} : #{seconds_to_string(diff)}"
66
+ end
67
+
68
+ puts "file total : #{seconds_to_string(calc_total(time_pairs))}"
69
+ end
70
+
71
+ def seconds_to_string time_sec
72
+ hours = time_sec.to_i / 3600
73
+ mins = (time_sec - (3600 * hours)) / 60
74
+ seconds = (time_sec - (3600 * hours)) % 60
75
+
76
+ format("%d:%02d:%02d", hours, mins, seconds)
77
+ end
78
+ end
79
+ end
data/lib/noir/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Noir
2
- VERSION = "0.1.4"
2
+ VERSION = '0.1.5'
3
3
  end
@@ -0,0 +1,127 @@
1
+ require 'noir'
2
+ require 'spec_helper'
3
+
4
+ describe 'Noir::Command::Calculate::Time' do
5
+ before do
6
+ @paths = 10.times.map{Random.rand.to_s}
7
+ @path = @paths.first
8
+ end
9
+
10
+ it 'is inherited Noir::Base::TerminalCommand' do
11
+ expect(Noir::Command::Calculate::Time.superclass).to eq(Noir::Base::TerminalCommand)
12
+ end
13
+
14
+ it 'is raise exception when non-arguments' do
15
+ expect{ Noir::Command::Calculate::Time.execute }.to raise_error
16
+ end
17
+
18
+ describe '.extract_directory' do
19
+
20
+ def path_is_not_file path
21
+ allow(File).to receive(:exists?).with(path).and_return(false)
22
+ end
23
+
24
+ def path_is_file path
25
+ allow(File).to receive(:exists?).with(path).and_return(true)
26
+ allow(File).to receive(:file?).with(path).and_return(true)
27
+ end
28
+
29
+ def path_is_directory path
30
+ allow(File).to receive(:exists?).with(path).and_return(true)
31
+ allow(File).to receive(:file?).with(path).and_return(false)
32
+ allow(File).to receive(:directory?).with(path).and_return(true)
33
+ end
34
+
35
+ it 'is raise when not found file path.' do
36
+ path_is_not_file @path
37
+ expect{ Noir::Command::Calculate::Time.extract_path(@path) }.to raise_error(RuntimeError, /^File not/)
38
+ end
39
+
40
+ it 'is return raw path by exist file path' do
41
+ @paths.each do |path|
42
+ path_is_file @path
43
+ expect(Noir::Command::Calculate::Time.extract_path(@path)).to eq(@path)
44
+ end
45
+ end
46
+
47
+ it 'is return extracted path by exist directory path' do
48
+ @paths.each do |path|
49
+ path_is_directory @path
50
+ entry_of_directory = 'hoge'
51
+ allow(Dir).to receive(:entries).with(@path).and_return([entry_of_directory])
52
+ allow(File).to receive(:directory?).with(entry_of_directory).and_return(false)
53
+ expect(Noir::Command::Calculate::Time.extract_path(@path)).to eq([entry_of_directory])
54
+ end
55
+ end
56
+
57
+ it 'is return extracted path rejected start_with by exist directory path' do
58
+ path_is_directory @path
59
+ entries_of_directory = ['aaa', '.aaa', 'bbb', '.bbb', 'ccc']
60
+ entries_of_directory.each do |entry|
61
+ allow(File).to receive(:directory?).with(entry).and_return(false)
62
+ end
63
+ allow(Dir).to receive(:entries).with(@path).and_return(entries_of_directory)
64
+ expect(Noir::Command::Calculate::Time.extract_path(@path)).to eq(["aaa", "bbb", "ccc"])
65
+ end
66
+
67
+ it 'is return extracted path rejected directory' do
68
+ path_is_directory @path
69
+ allow(Dir).to receive(:entries).with(@path).and_return(['aaa', 'bbb'])
70
+ allow(File).to receive(:directory?).with('aaa').and_return(false)
71
+ allow(File).to receive(:directory?).with('bbb').and_return(true)
72
+ expect(Noir::Command::Calculate::Time.extract_path(@path)).to eq(['aaa'])
73
+ end
74
+ end
75
+
76
+ describe '.pick_up_times' do
77
+ it 'is raise error when count of formatted time in txt is odd.' do
78
+ allow(File).to receive(:read).with(@path).and_return('2014/09/04 18:49:00')
79
+ expect{ Noir::Command::Calculate::Time.pick_up_times(@path) }.to raise_error(RuntimeError, /not even/)
80
+ end
81
+
82
+ it 'is not raise when formatted time was not found' do
83
+ allow(File).to receive(:read).with(@path).and_return('')
84
+ expect(Noir::Command::Calculate::Time.pick_up_times(@path)).to eq([])
85
+ end
86
+
87
+ it 'is return time pair when sorted formatted time pair' do
88
+ allow(File).to receive(:read).with(@path).and_return("2014/10/04 18:49:00\n2014/09/04 21:09:43")
89
+ expect{ Noir::Command::Calculate::Time.pick_up_times(@path) }.to raise_error(RuntimeError, /not sorted/)
90
+ end
91
+
92
+ it 'is return time pair when sorted formatted time pair' do
93
+ allow(File).to receive(:read).with(@path).and_return("2014/09/04 18:49:00\n2014/09/04 21:09:43")
94
+ expect(Noir::Command::Calculate::Time.pick_up_times(@path)).to eq([[Time.new(2014, 9, 4, 18, 49),
95
+ Time.new(2014, 9, 4, 21, 9, 43)]])
96
+ end
97
+
98
+ it 'is return time pair when sorted formatted time pair with space' do
99
+ allow(File).to receive(:read).with(@path).and_return(" 2014/09/04 18:49:00\n 2014/09/04 21:09:43")
100
+ expect(Noir::Command::Calculate::Time.pick_up_times(@path)).to eq([[Time.new(2014, 9, 4, 18, 49),
101
+ Time.new(2014, 9, 4, 21, 9, 43)]])
102
+ end
103
+ end
104
+
105
+ describe '.print_file_total' do
106
+ it 'is output "not found" when time_pairs was empty' do
107
+ expect{ Noir::Command::Calculate::Time.print_file_total(@path, []) }.to output(/not found in .* #{@path}/ ).to_stdout
108
+ end
109
+
110
+ it 'is output when time_pairs was not empty' do
111
+ expect{ Noir::Command::Calculate::Time.print_file_total(@path, [[Time.new(2014, 9, 4, 18, 49),
112
+ Time.new(2014, 9, 4, 21, 9, 43)]]) }.to output(/total/).to_stdout
113
+ end
114
+ end
115
+
116
+ describe '.calc_total' do
117
+ it 'is return 0 when time_pair is empty' do
118
+ expect(Noir::Command::Calculate::Time.calc_total []).to eq(0)
119
+ end
120
+
121
+ it 'is return summed time diff' do
122
+ dummy_params = [[5, 10], [20, 100]]
123
+ expect(Noir::Command::Calculate::Time.calc_total dummy_params).to eq(85)
124
+ end
125
+ end
126
+
127
+ end
@@ -0,0 +1,10 @@
1
+ require 'noir'
2
+ require 'spec_helper'
3
+
4
+ describe 'Noir::Command::Calculate' do
5
+ it 'is inherited Noir::Base::Command' do
6
+ expect(Noir::Command::Calculate.superclass).to eq(Noir::Base::Command)
7
+ end
8
+ end
9
+
10
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noir
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - atton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-02 00:00:00.000000000 Z
11
+ date: 2014-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -61,6 +61,7 @@ extensions: []
61
61
  extra_rdoc_files: []
62
62
  files:
63
63
  - ".gitignore"
64
+ - ".travis.yml"
64
65
  - Gemfile
65
66
  - LICENSE.txt
66
67
  - README.md
@@ -71,6 +72,8 @@ files:
71
72
  - lib/noir/base/command.rb
72
73
  - lib/noir/base/terminal_command.rb
73
74
  - lib/noir/command.rb
75
+ - lib/noir/command/calculate.rb
76
+ - lib/noir/command/calculate/time.rb
74
77
  - lib/noir/command/completion.rb
75
78
  - lib/noir/command/edit.rb
76
79
  - lib/noir/command/edit/note.rb
@@ -99,6 +102,8 @@ files:
99
102
  - lib/noir/options.rb
100
103
  - lib/noir/version.rb
101
104
  - noir.gemspec
105
+ - spec/noir/command/calculate/time_spec.rb
106
+ - spec/noir/command/calculate_spec.rb
102
107
  - spec/noir/command/completion_spec.rb
103
108
  - spec/noir/command/edit/note_spec.rb
104
109
  - spec/noir/command/edit/weekly_report/friday_spec.rb
@@ -151,11 +156,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
156
  version: '0'
152
157
  requirements: []
153
158
  rubyforge_project:
154
- rubygems_version: 2.3.0
159
+ rubygems_version: 2.4.1
155
160
  signing_key:
156
161
  specification_version: 4
157
162
  summary: Utilities for atton.
158
163
  test_files:
164
+ - spec/noir/command/calculate/time_spec.rb
165
+ - spec/noir/command/calculate_spec.rb
159
166
  - spec/noir/command/completion_spec.rb
160
167
  - spec/noir/command/edit/note_spec.rb
161
168
  - spec/noir/command/edit/weekly_report/friday_spec.rb
@@ -188,3 +195,4 @@ test_files:
188
195
  - spec/noir/noir_spec.rb
189
196
  - spec/noir/options_spec.rb
190
197
  - spec/spec_helper.rb
198
+ has_rdoc: