ld 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/lib/ld/document/document.rb +65 -0
- data/lib/ld/error/hint.rb +8 -0
- data/lib/ld/error/parameter_error.rb +36 -0
- data/lib/ld/excel/excel.rb +53 -14
- data/lib/ld/excel/sheet.rb +70 -42
- data/lib/ld/file/file.rb +151 -71
- data/lib/ld/print/print.rb +24 -15
- data/lib/ld/project/project.rb +10 -7
- data/lib/ld/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d76c2f14f55e59bb505bd1f9f9214beecb31528a
|
4
|
+
data.tar.gz: 5ef39a8ec6f6a2ffb48932c2e163e92b22662c56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b38e7385928f8f189a1946e6af11c31dfe1ba184f9a89110b92b258c08ed6ec8bca2a313845fcbcc896af3082174a2cf76de72307946cde2a4fa5808f9f7ec32
|
7
|
+
data.tar.gz: d1202b681920724558cf73c931c21c28bd30c76da49778c66598aec8098810afa8dbf5e8870bbd997642176ff0c2ebe0dcd9b77ec4342c8abd4ebc3b20b03214
|
data/README.md
CHANGED
@@ -0,0 +1,65 @@
|
|
1
|
+
class Ld::Document
|
2
|
+
|
3
|
+
attr_accessor :doc, :class_name
|
4
|
+
|
5
|
+
#= 作用 空的实例方法,Ld::Document的大部分功能都由实例提供(个人习惯调用对象方法而不是类方法)
|
6
|
+
def initialize file
|
7
|
+
@class_name = file.split('.rb')[0].camelize
|
8
|
+
@doc = {}
|
9
|
+
lines = file.lines
|
10
|
+
lines.each_with_index do |line, i|
|
11
|
+
arr = line.split(' ')
|
12
|
+
if arr.delete_at(0) == 'def'
|
13
|
+
notes = get_notes(lines, i)
|
14
|
+
if notes.size > 0
|
15
|
+
@doc[arr.delete_at(0)] = {
|
16
|
+
params:arr.join(' '),
|
17
|
+
notes:notes
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_notes lines, i
|
25
|
+
notes = []
|
26
|
+
(i-1).downto(0) do |j|
|
27
|
+
arr = lines[j].split(' ')
|
28
|
+
if arr[0] == '#='
|
29
|
+
notes << {title:arr[1], note:arr[2..(arr.size)].join(' ')}
|
30
|
+
else
|
31
|
+
return notes
|
32
|
+
end
|
33
|
+
end
|
34
|
+
notes
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def class_name
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.write_readme readme_path = '/Users/liudong/ruby/my_gems/ld/README2.md'
|
43
|
+
docs = Ld::File.open('/Users/liudong/ruby/my_gems/ld/lib/ld').search_regexp(/.rb$/).map{|f| Ld::Document.new f}
|
44
|
+
arr = ["# API"]
|
45
|
+
docs.map do |doc|
|
46
|
+
arr << "## #{doc.class_name}"
|
47
|
+
arr << "```ruby"
|
48
|
+
doc.doc.each do |k, v|
|
49
|
+
v[:notes].each do |note|
|
50
|
+
arr << "#{note[:title]}:#{note[:note]}"
|
51
|
+
end
|
52
|
+
arr << "#{k} #{v[:params]}"
|
53
|
+
end
|
54
|
+
arr << "```"
|
55
|
+
end
|
56
|
+
File.open readme_path,'w' do |file|
|
57
|
+
arr.each do |line|
|
58
|
+
arr.puts line
|
59
|
+
end
|
60
|
+
file.colse
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Ld::ParameterError
|
2
|
+
attr_accessor :clazz, :hint
|
3
|
+
|
4
|
+
def initialize clazz, hint
|
5
|
+
@clazz = clazz
|
6
|
+
@hint = hint
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.create clazz, &block
|
10
|
+
runtime_error = self.new clazz
|
11
|
+
block.call runtime_error
|
12
|
+
runtime_error
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_run
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def raise hash
|
20
|
+
lines = []
|
21
|
+
case hash[:error_type]
|
22
|
+
when :example
|
23
|
+
lines =
|
24
|
+
when :scope
|
25
|
+
lines = [
|
26
|
+
"scope参数说明:",
|
27
|
+
" 1 不能为空",
|
28
|
+
" 2 格式'单元格1:单元格2',如'A1:B2'代表读取以A1与B2为对角的矩形范围中的所有内容",
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
lines.each{|line| puts line}
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/lib/ld/excel/excel.rb
CHANGED
@@ -4,6 +4,7 @@ Spreadsheet.client_encoding = 'UTF-8'
|
|
4
4
|
class Ld::Excel
|
5
5
|
attr_accessor :excel, :path
|
6
6
|
|
7
|
+
#= 参数 path(可以为空)
|
7
8
|
def initialize path = nil
|
8
9
|
if path
|
9
10
|
if path.match(/.xls$/)
|
@@ -21,21 +22,37 @@ class Ld::Excel
|
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
25
|
+
#= 作用 打开一个xls文件
|
26
|
+
#= 参数 xls文件的全路径或相对路径的字符串
|
27
|
+
#= 示例 Ld::Excel.open 'project.xls'
|
28
|
+
#= 返回 Ld::Excel实例
|
24
29
|
def self.open path
|
25
30
|
self.new path
|
26
31
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
32
|
+
|
33
|
+
#= 作用 写xls文件(会创建一个新的xls文件)
|
34
|
+
#= 返回 如果创建成功,返回Ld::Excel实例.如果创建失败会返回false(不会导致程序终止)
|
35
|
+
#= 参数1 path 字符串,指定要写的文件路径(最好使用全路径)
|
36
|
+
def self.write path, &block
|
37
|
+
if path.class == Hash
|
38
|
+
path = path[:file_path]
|
39
|
+
end
|
40
|
+
excel = Ld::Excel.new
|
41
|
+
block.call excel
|
42
|
+
excel.save path
|
30
43
|
end
|
31
44
|
|
32
|
-
|
33
|
-
|
45
|
+
#= 作用 write的同名方法,作用和使用方法完全一样
|
46
|
+
def self.create path, &block
|
47
|
+
self.write path, &block
|
34
48
|
end
|
35
49
|
|
36
|
-
|
50
|
+
#= 作用 读xls文件中的内容
|
51
|
+
#= 示例 Ld::Excel.read "Sheet1?A1:B2"
|
52
|
+
#= 示例 Ld::Excel.read "Sheet1?A1:B2+C,D"
|
53
|
+
#= 示例 Ld::Excel.read "Sheet1?A1:B2+C,D,1,2"
|
54
|
+
#= 返回 二维数组
|
37
55
|
def read params, show_location = false
|
38
|
-
|
39
56
|
case params.class.to_s
|
40
57
|
when 'String'
|
41
58
|
shett_name, scope = params.split('?')
|
@@ -50,29 +67,51 @@ class Ld::Excel
|
|
50
67
|
end
|
51
68
|
end
|
52
69
|
|
70
|
+
#= 作用 与read方法相同(但会多返回坐标数据)
|
71
|
+
#= 返回 与read方法相同(但会多返回坐标数据)
|
72
|
+
#= 示例 与read方法相同(但会多返回坐标数据)
|
73
|
+
def read_with_location params
|
74
|
+
read params, true
|
75
|
+
end
|
76
|
+
|
77
|
+
#= 作用 如果xls文件内容有改变,可以刷新(会重新open一次,但这个方法不需要再传入参数了)
|
78
|
+
#= 参数 无需参数
|
79
|
+
#= 返回 Ld::Excel实例
|
80
|
+
def flush
|
81
|
+
@excel = Ld::Excel.open @path
|
82
|
+
end
|
53
83
|
|
54
|
-
|
84
|
+
#= 作用 保存数据到一个路径
|
85
|
+
#= 返回 如果创建成功,返回Ld::Excel实例.如果创建失败会返回false(不会导致程序终止)
|
86
|
+
#= 参数1 path 字符串,指定要写的文件路径(最好使用全路径)
|
55
87
|
def save path
|
56
88
|
puts "Covers a file: #{path}" if File.exist? path
|
57
89
|
@excel.write path
|
58
90
|
puts "Excel save success!"
|
59
91
|
self
|
92
|
+
rescue
|
93
|
+
puts $!
|
94
|
+
puts $@
|
95
|
+
false
|
60
96
|
end
|
61
97
|
|
62
98
|
def new_sheet name
|
63
99
|
Ld::Sheet.new @excel, name
|
64
100
|
end
|
65
101
|
|
102
|
+
def open_sheet name
|
103
|
+
Ld::Sheet.open @excel, name
|
104
|
+
end
|
105
|
+
|
66
106
|
def write_sheet sheet_name, &block
|
67
107
|
sheet = new_sheet sheet_name
|
68
108
|
block.call sheet
|
69
109
|
sheet.save
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
excel.save hash[:file_path]
|
110
|
+
true
|
111
|
+
rescue
|
112
|
+
puts $!
|
113
|
+
puts $@
|
114
|
+
false
|
76
115
|
end
|
77
116
|
|
78
117
|
end
|
data/lib/ld/excel/sheet.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
class Ld::Sheet
|
2
2
|
attr_accessor :excel, :sheet
|
3
3
|
|
4
|
+
# PARAMETER_ERROR ||= Ld::ParameterError.new self do |e|
|
5
|
+
# e.hint :scope => [
|
6
|
+
# "Example:",
|
7
|
+
# " read(String): read('abc?A1:B2')",
|
8
|
+
# " read(Hash): read({sheet:'abc',scope:'A1:B2',insert:'',delete:'',location:false})",
|
9
|
+
# ]
|
10
|
+
# end
|
11
|
+
|
4
12
|
ABSCISSA = {}
|
5
13
|
if ABSCISSA.empty?
|
6
14
|
zm = 'A'
|
@@ -8,6 +16,9 @@ class Ld::Sheet
|
|
8
16
|
19999.times{|i| ABSCISSA[zm.succ!] = i+1}
|
9
17
|
end
|
10
18
|
|
19
|
+
#= 参数1 Ld::Excel实例
|
20
|
+
#= 参数2 String:sheet名称
|
21
|
+
#= 参数3 String:有'new'与'open'两种选择
|
11
22
|
def initialize excel, name, type = 'new'
|
12
23
|
raise "sheet name is nil" if !name
|
13
24
|
@excel = excel
|
@@ -25,27 +36,31 @@ class Ld::Sheet
|
|
25
36
|
@format = @sheet.default_format
|
26
37
|
end
|
27
38
|
|
39
|
+
#= 作用 读sheet页数据
|
40
|
+
#= 参数1 String:指定要读取的范围
|
41
|
+
#= 参数2 Blooean:是否要返回坐标?
|
42
|
+
#= 返回 二维数组
|
28
43
|
def read scope, show_location = false
|
29
44
|
raise "scope params is nil" if !scope
|
30
|
-
map =
|
45
|
+
map = read_scope_to_map scope
|
31
46
|
read_arrs map, show_location
|
32
47
|
end
|
33
48
|
|
49
|
+
#= 作用 解析范围参数
|
34
50
|
def parse_string_scope scope
|
51
|
+
PARAMETER_ERROR.hint_and_raise :scope, "'+' or '-' 只能存在1个" if scope.split('+').size > 2 or scope.split('-').size > 2
|
35
52
|
hash = {}
|
36
53
|
scope.upcase!
|
37
|
-
raise "params error! \n'+' 只能有1个" if scope.split('+').size > 2
|
38
|
-
raise "params error! \n'-' 只能有1个" if scope.split('-').size > 2
|
39
54
|
if scope.include? '+'
|
40
55
|
hash[:scope], other = scope.split('+')
|
41
56
|
if other.include? '-'
|
42
|
-
hash[:
|
57
|
+
hash[:insert], hash[:delete] = other.split('-')
|
43
58
|
else
|
44
|
-
hash[:
|
59
|
+
hash[:insert] = other
|
45
60
|
end
|
46
61
|
else
|
47
62
|
if scope.include? '-'
|
48
|
-
hash[:scope], hash[:
|
63
|
+
hash[:scope], hash[:delete] = scope.split('-')
|
49
64
|
else
|
50
65
|
hash[:scope] = scope
|
51
66
|
end
|
@@ -53,19 +68,18 @@ class Ld::Sheet
|
|
53
68
|
hash
|
54
69
|
end
|
55
70
|
|
56
|
-
|
71
|
+
#= 作用 使用范围参数构建maps(预读)
|
72
|
+
def read_scope_to_map scope
|
57
73
|
scope = parse_string_scope scope if scope.class == String
|
58
|
-
|
59
|
-
raise "params syntax error! lack ':'" if !scope[:scope].match(/:/)
|
60
|
-
raise "params syntax error! ':' 只能有1个" if scope[:scope].split(':').size > 2
|
74
|
+
PARAMETER_ERROR.hint_and_raise :scope, "缺少scope参数,或':',或':'存在多个" if !scope[:scope] or !scope[:scope].match(/:/) or scope[:scope].split(':').size > 2
|
61
75
|
a, b = scope[:scope].split(':').map{|point| parse_point point}
|
62
76
|
cols = (a[:character]..b[:character]).to_a
|
63
77
|
rows = (a[:number]..b[:number]).to_a
|
64
|
-
|
65
|
-
|
78
|
+
insert_maps rows, cols, scope[:insert].upcase if scope[:insert]
|
79
|
+
delete_maps rows, cols, scope[:delete].upcase if scope[:delete]
|
66
80
|
|
67
|
-
if scope[:
|
68
|
-
raise "
|
81
|
+
if scope[:delete]
|
82
|
+
raise "delete 参数只能是 String" if scope[:delete].class != String
|
69
83
|
end
|
70
84
|
rows = rows.uniq.sort
|
71
85
|
cols = cols.uniq.sort
|
@@ -87,47 +101,49 @@ class Ld::Sheet
|
|
87
101
|
maps
|
88
102
|
end
|
89
103
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
104
|
+
#= 作用 多读一些行或列
|
105
|
+
def insert_maps rows, cols, inserts
|
106
|
+
raise "inserts 参数只能是 String" if inserts.class != String
|
107
|
+
insert_arr = inserts.split(',').map do |insert|
|
108
|
+
if insert.match(/:/)
|
109
|
+
raise "insert params syntax error! \n'#{insert}'" if insert.split(':').size > 2
|
110
|
+
a, b = insert.split(':')
|
96
111
|
(a..b).to_a
|
97
112
|
else
|
98
|
-
|
113
|
+
insert
|
99
114
|
end
|
100
115
|
end
|
101
|
-
|
102
|
-
if is_row?
|
103
|
-
rows <<
|
116
|
+
insert_arr.flatten.each do |insert|
|
117
|
+
if is_row? insert
|
118
|
+
rows << insert.to_i
|
104
119
|
else
|
105
|
-
cols <<
|
120
|
+
cols << insert.upcase
|
106
121
|
end
|
107
122
|
end
|
108
123
|
end
|
109
124
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
125
|
+
#= 作用 少读一些行或列
|
126
|
+
def delete_maps rows, cols, deletes
|
127
|
+
raise "deletes 参数只能是 String" if deletes.class != String
|
128
|
+
del_arr = deletes.split(',').map do |del|
|
129
|
+
if del.match(/:/)
|
130
|
+
raise "del params syntax error! \n'#{del}'" if del.split(':').size > 2
|
131
|
+
a, b = del.split(':')
|
116
132
|
(a..b).to_a
|
117
133
|
else
|
118
|
-
|
134
|
+
del
|
119
135
|
end
|
120
136
|
end
|
121
|
-
|
122
|
-
if is_row?
|
123
|
-
rows.delete
|
137
|
+
del_arr.flatten.each do |del|
|
138
|
+
if is_row? del
|
139
|
+
rows.delete del.to_i
|
124
140
|
else
|
125
|
-
cols.delete
|
141
|
+
cols.delete del.upcase
|
126
142
|
end
|
127
143
|
end
|
128
144
|
end
|
129
145
|
|
130
|
-
|
146
|
+
#= 作用 读二维数据(使用maps)
|
131
147
|
def read_arrs map_arrs, show_location
|
132
148
|
map_arrs.map do |map_arr|
|
133
149
|
map_arr.map do |map|
|
@@ -141,7 +157,7 @@ class Ld::Sheet
|
|
141
157
|
end
|
142
158
|
end
|
143
159
|
|
144
|
-
|
160
|
+
#= 作用 通过x,y坐标获取一个单元格的内容
|
145
161
|
def read_unit_by_xy x, y, parse
|
146
162
|
# puts "x: #{x}\ty: #{y}"
|
147
163
|
unit = @sheet.row(y)[x]
|
@@ -153,6 +169,7 @@ class Ld::Sheet
|
|
153
169
|
return unit
|
154
170
|
end
|
155
171
|
|
172
|
+
#= 作用 判断要添加或要移除的是一行还是一列
|
156
173
|
def is_row? row
|
157
174
|
if row.to_i.to_s == row.to_s
|
158
175
|
return true
|
@@ -160,14 +177,17 @@ class Ld::Sheet
|
|
160
177
|
false
|
161
178
|
end
|
162
179
|
|
180
|
+
#= 作用 打开一个sheet
|
163
181
|
def self.open excel, name
|
164
182
|
self.new excel, name, 'open'
|
165
183
|
end
|
166
184
|
|
185
|
+
#= 作用 创建一个sheet
|
167
186
|
def self.create excel, name
|
168
187
|
self.new excel, name, 'new'
|
169
188
|
end
|
170
189
|
|
190
|
+
#= 作用 将数据写入sheet
|
171
191
|
def save
|
172
192
|
point = parse_point @point
|
173
193
|
raise '保存sheet必须要有内容,请 set_rows' if !@rows
|
@@ -184,7 +204,7 @@ class Ld::Sheet
|
|
184
204
|
self
|
185
205
|
end
|
186
206
|
|
187
|
-
|
207
|
+
#= 作用 解析一个字符串坐标(如'A1')返回x,y坐标('A1'返回[0,0])
|
188
208
|
def parse_point point
|
189
209
|
raise "无法解析excel坐标,坐标需要是String,不能是#{point.class.to_s}" if point.class != String
|
190
210
|
point.upcase!
|
@@ -195,11 +215,13 @@ class Ld::Sheet
|
|
195
215
|
{:character => characters[0], :number => numbers[0].to_i}
|
196
216
|
end
|
197
217
|
|
218
|
+
#= 作用 在当前sheet中添加主体数据(传入二维数组),但不写入(只有调用Ld::Excel的实例方法save才会写入io)
|
198
219
|
def set_rows rows
|
199
220
|
raise '必须是一个数组且是一个二维数组' if rows.class != Array && rows.first.class != Array
|
200
221
|
@rows = rows
|
201
222
|
end
|
202
223
|
|
224
|
+
#= 作用 在当前sheet的主体内容顶上方添加一个表头(传入二维数组),但不写入(只有调用Ld::Excel的实例方法save才会写入io)
|
203
225
|
def set_headings headings
|
204
226
|
if headings
|
205
227
|
raise 'headings 必须是一个数组' if headings.class != Array
|
@@ -209,12 +231,13 @@ class Ld::Sheet
|
|
209
231
|
end
|
210
232
|
end
|
211
233
|
|
212
|
-
|
213
|
-
|
234
|
+
#= 作用 在当前sheet的主体内容末尾添加一行数据(传入一维数组),但不写入(只有调用Ld::Excel的实例方法save才会写入io)
|
235
|
+
def insert_row row
|
236
|
+
raise 'insert_row 传入的必须是一个数组' if row.class != Array
|
214
237
|
@rows << row
|
215
238
|
end
|
216
239
|
|
217
|
-
|
240
|
+
#= 作用 通过x,y坐标往一个单元格中写入数据,但不写入(只有调用Ld::Excel的实例方法save才会写入io)
|
218
241
|
def write_unit_by_xy x, y, unit
|
219
242
|
if unit.class == Array
|
220
243
|
unit = unit.to_s
|
@@ -223,23 +246,28 @@ class Ld::Sheet
|
|
223
246
|
@sheet.row(x)[y] = unit
|
224
247
|
end
|
225
248
|
|
249
|
+
#= 作用 设置当前sheet页的字体颜色
|
226
250
|
def set_color color
|
227
251
|
@format.font.color = color
|
228
252
|
end
|
229
253
|
|
254
|
+
#= 作用 设置当前sheet页的字体大小
|
230
255
|
def set_font_size size
|
231
256
|
raise 'size 必须是一个整数' if size.class != Fixnum
|
232
257
|
@format.font.size = size
|
233
258
|
end
|
234
259
|
|
260
|
+
#= 作用 设置当前sheet页的字体
|
235
261
|
def set_font font
|
236
262
|
@format.font.name = font
|
237
263
|
end
|
238
264
|
|
265
|
+
#= 作用 设置当前sheet页的单元格宽度(暂时无效)
|
239
266
|
def set_weight weight
|
240
267
|
@format
|
241
268
|
end
|
242
269
|
|
270
|
+
#= 作用 设置当前sheet页的字体颜色
|
243
271
|
def set_point point
|
244
272
|
@point = point
|
245
273
|
end
|
data/lib/ld/file/file.rb
CHANGED
@@ -1,118 +1,198 @@
|
|
1
1
|
class Ld::File
|
2
2
|
|
3
|
-
attr_accessor :path, :
|
3
|
+
attr_accessor :path, :name, :exist, :size, :mode, :stat
|
4
|
+
@@current_path = Dir.pwd
|
5
|
+
@@exclude = ['.', '..']
|
4
6
|
|
7
|
+
#= 作用 创建一个Ld::File实例(不初始化参数)
|
5
8
|
def initialize path
|
6
|
-
|
7
|
-
@path = path
|
9
|
+
@path = path[0] == '/' ? path : "#{Dir.pwd}/#{path}"
|
8
10
|
@name = File.basename @path
|
9
|
-
|
10
|
-
|
11
|
+
if File.exist? @path
|
12
|
+
@exist = true
|
13
|
+
@type = File.ftype path
|
14
|
+
@stat = File.stat path
|
15
|
+
@size = @stat.size
|
16
|
+
@mode = @stat.mode
|
17
|
+
else
|
18
|
+
@exist = false
|
19
|
+
@type = 'not found'
|
20
|
+
end
|
11
21
|
end
|
12
22
|
|
13
|
-
|
14
|
-
|
23
|
+
#= 作用 创建一个Ld::File实例(始化参数)
|
24
|
+
def self.open path
|
25
|
+
self.new path
|
15
26
|
end
|
16
27
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
return nil
|
22
|
-
end
|
28
|
+
# 作用 返回这个目录下的所有一级目录与一级文件,如果不是目录,会报错
|
29
|
+
def children
|
30
|
+
dir!
|
31
|
+
Dir.foreach(@path).map{|n| Ld::File.new("#{@path}/#{n}") if !is_exclude? n}.compact.sort{|a,b| a.type <=> b.type}
|
23
32
|
end
|
24
33
|
|
25
|
-
def
|
26
|
-
|
34
|
+
def is_exclude? name
|
35
|
+
@@exclude.include? name
|
27
36
|
end
|
28
37
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
38
|
-
arr.sort!{|a,b| b.type-a.type}
|
39
|
-
arr
|
38
|
+
#= 作用 返回当前所在目录(Dir.pwd)
|
39
|
+
def self.current
|
40
|
+
Ld::File.new @@current_path
|
41
|
+
end
|
42
|
+
|
43
|
+
def exist!
|
44
|
+
raise "不存在的 #{path}" if !@exist
|
40
45
|
end
|
41
46
|
|
42
|
-
def
|
43
|
-
|
44
|
-
iter_search_files regexp, arr
|
45
|
-
arr
|
47
|
+
def dir?
|
48
|
+
type == 'directory'
|
46
49
|
end
|
47
50
|
|
48
|
-
def
|
49
|
-
|
50
|
-
iter_search_dir arr
|
51
|
-
arr
|
51
|
+
def file?
|
52
|
+
type == 'file'
|
52
53
|
end
|
53
54
|
|
54
|
-
def
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
def dir!
|
56
|
+
raise "这不是一个目录,而是一个#{type}:#{path}" if type != 'directory'
|
57
|
+
end
|
58
|
+
|
59
|
+
def file!
|
60
|
+
raise "这不是一个文件,而是一个#{type}:#{path}" if type != 'file'
|
61
|
+
end
|
62
|
+
|
63
|
+
#= 作用 返回一个一级目录或文件,如果不存在则返回nil
|
64
|
+
def find name
|
65
|
+
dir!
|
66
|
+
Ld::File.new "#{path}/#{name.to_s}" if File.exist? "#{path}/#{name.to_s}"
|
67
|
+
end
|
68
|
+
|
69
|
+
#= 作用 返回所有精确匹配的(查当前目录下的所有节点)目录和文件
|
70
|
+
def search name, type = :all
|
71
|
+
dir!
|
72
|
+
results = []
|
73
|
+
iter_search name, results
|
74
|
+
case type.to_s
|
75
|
+
when 'all'
|
76
|
+
results
|
77
|
+
when 'file'
|
78
|
+
results.map{|f| f.type == 'file'}
|
79
|
+
when 'dir'
|
80
|
+
results.map{|f| f.type == 'directory'}
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
#= 作用 返回所有模糊匹配的(查当前目录下的所有节点)目录和文件
|
85
|
+
def search_regexp regexp, type = :all
|
86
|
+
dir!
|
87
|
+
results = []
|
88
|
+
iter_search_regexp regexp, results
|
89
|
+
case type.to_s
|
90
|
+
when 'all'
|
91
|
+
results
|
92
|
+
when 'file'
|
93
|
+
results.map{|f| f.type == 'file'}
|
94
|
+
when 'dir'
|
95
|
+
results.map{|f| f.type == 'directory'}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def iter_search name, results
|
100
|
+
children.each do |file|
|
101
|
+
if file.name == name
|
102
|
+
results << file
|
103
|
+
end
|
104
|
+
if file.dir?
|
105
|
+
file.iter_search name, results
|
59
106
|
end
|
60
107
|
end
|
61
|
-
self
|
62
108
|
end
|
63
109
|
|
64
|
-
def
|
65
|
-
children.each do |
|
66
|
-
if
|
67
|
-
|
110
|
+
def iter_search_regexp regexp, results
|
111
|
+
children.each do |file|
|
112
|
+
if file.name.match(regexp)
|
113
|
+
results << file
|
68
114
|
end
|
69
|
-
if
|
70
|
-
|
115
|
+
if file.dir?
|
116
|
+
file.iter_search_regexp regexp, results
|
71
117
|
end
|
72
118
|
end
|
73
|
-
self
|
74
119
|
end
|
75
120
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
Ld::File.new(arr.join('/'))
|
121
|
+
#= 作用 返回所有lines
|
122
|
+
def lines
|
123
|
+
File.open(@path).readlines
|
80
124
|
end
|
81
125
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
126
|
+
# def method_missing name
|
127
|
+
# find name
|
128
|
+
# end
|
129
|
+
|
130
|
+
#= 作用 改名称
|
131
|
+
def rename new_name
|
132
|
+
new_path = "#{dir.path}/#{new_name}"
|
133
|
+
if File.rename @path, new_path
|
134
|
+
@path = new_path
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
#= 作用 删除当前文件
|
139
|
+
def delete
|
140
|
+
puts "删除!:#{path}\n,确认请输入 delete_file,"
|
141
|
+
if gets.chomp == 'delete_file'
|
142
|
+
if File.delete path == 1
|
143
|
+
@exist = false
|
144
|
+
puts "删除成功 #{path}"
|
87
145
|
end
|
88
146
|
end
|
89
|
-
return nil
|
90
147
|
end
|
91
148
|
|
92
|
-
|
93
|
-
|
149
|
+
#= 作用 返回所有文件(下一级)
|
150
|
+
def files
|
151
|
+
children.select{|f| f.type == 'file'}
|
94
152
|
end
|
95
153
|
|
96
|
-
|
97
|
-
|
154
|
+
#= 作用 返回父目录
|
155
|
+
def parent
|
156
|
+
Ld::File.new(File.dirname @path)
|
98
157
|
end
|
99
158
|
|
100
|
-
|
101
|
-
|
159
|
+
#= 作用 返回所有兄弟
|
160
|
+
def siblings
|
161
|
+
parent.children
|
102
162
|
end
|
103
163
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
164
|
+
#= 作用 返回所有目录
|
165
|
+
def dirs
|
166
|
+
children.select{|f| f.type == 'directory'}
|
167
|
+
end
|
168
|
+
|
169
|
+
#= 作用 输出目录中所有条目
|
170
|
+
def ls
|
171
|
+
if type == 'directory'
|
172
|
+
Ld::Print.ls self
|
173
|
+
elsif type == 'file'
|
174
|
+
Ld::Print.ls self.parent
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def save
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
def self.write path, arr
|
183
|
+
File.open(path)
|
108
184
|
end
|
109
185
|
|
110
|
-
|
111
|
-
|
186
|
+
# test:
|
187
|
+
def self.test
|
188
|
+
sdf{100.times{Ld::File.new('app').search_regexp //}}
|
112
189
|
end
|
113
190
|
|
114
|
-
def
|
115
|
-
|
191
|
+
def sdf &block
|
192
|
+
t1 = Time.new
|
193
|
+
block.call
|
194
|
+
t2 = Time.new
|
195
|
+
puts t2 - t1
|
116
196
|
end
|
117
197
|
|
118
198
|
end
|
data/lib/ld/print/print.rb
CHANGED
@@ -2,24 +2,33 @@ require 'terminal-table'
|
|
2
2
|
|
3
3
|
class Ld::Print
|
4
4
|
|
5
|
-
def
|
6
|
-
|
5
|
+
def self.p models, fields
|
6
|
+
self.print "#{models.first.class.to_s}" do |table|
|
7
|
+
table.set_headings (fields.class == Array ? fields : fields.split(',')).map{|f| f.rstrip.lstrip}
|
8
|
+
table.set_rows models.map { |model|
|
9
|
+
fields.map { |field|
|
10
|
+
value = model.send field
|
11
|
+
value = value.strftime("%Y/%m/%d %H:%M:%S") if [Date, Time, DateTime, ActiveSupport::TimeWithZone].include? value.class
|
12
|
+
value
|
13
|
+
}
|
14
|
+
}
|
15
|
+
end
|
7
16
|
end
|
8
17
|
|
9
|
-
def self.
|
18
|
+
def self.print hash
|
10
19
|
t = Terminal::Table.new
|
11
|
-
t.title =
|
12
|
-
|
13
|
-
t.
|
14
|
-
models.map { |model|
|
15
|
-
fields.map { |field|
|
16
|
-
value = model.send field
|
17
|
-
value = value.strftime("%Y/%m/%d %H:%M:%S") if [Date, Time, DateTime, ActiveSupport::TimeWithZone].include? value.class
|
18
|
-
value
|
19
|
-
}
|
20
|
-
}#.sort{|a,b| a[2] <=> b[2]}
|
21
|
-
.each{|row| t.add_row row}
|
20
|
+
t.title = hash[:title]
|
21
|
+
t.headings = hash[:headings]
|
22
|
+
t.rows = hash[:rows]
|
22
23
|
puts t
|
23
24
|
end
|
24
25
|
|
25
|
-
|
26
|
+
def self.ls dir
|
27
|
+
t = Terminal::Table.new
|
28
|
+
t.title = "目录列表:#{dir.path}"
|
29
|
+
t.headings = ["name","type","size","permission"]
|
30
|
+
t.rows = dir.children.map{|f| [f.name, f.type, f.size, f.mode] if f.name[0] != '.'}.compact.sort{|a,b| a[1] <=> b[1]}
|
31
|
+
puts t
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/lib/ld/project/project.rb
CHANGED
@@ -34,7 +34,8 @@ class Ld::Project
|
|
34
34
|
fs = '字段,字段类型,描述,空约束,默认值,精度位数,limit'.split(',')
|
35
35
|
indexs = fs.map{|f| @tables.headings.index(f)}.compact
|
36
36
|
rows = []
|
37
|
-
@tables.rows.select{|a| a[0]==model_name}
|
37
|
+
@tables.rows.select{|a| a[0]==model_name}
|
38
|
+
.each{|arr| rows << indexs.map{|i| arr[i]} }
|
38
39
|
puts Terminal::Table.new(
|
39
40
|
:title => "#{title_str}:字段解释",
|
40
41
|
:headings => fs,
|
@@ -44,9 +45,8 @@ class Ld::Project
|
|
44
45
|
fs = 'has_many,belongs_to,has_one'.split(',')
|
45
46
|
indexs = fs.map{|f| @models.headings.index(f)}.compact
|
46
47
|
rows = []
|
47
|
-
@models.rows.select{|a| a[0]==model_name}.
|
48
|
-
|
49
|
-
}
|
48
|
+
@models.rows.select{|a| a[0]==model_name}.
|
49
|
+
each{|arr| rows << indexs.map{|i| arr[i]} }
|
50
50
|
puts Terminal::Table.new(
|
51
51
|
:title => "#{title_str}:关联关系",
|
52
52
|
:headings => fs,
|
@@ -56,7 +56,8 @@ class Ld::Project
|
|
56
56
|
fs = '控制器,action,请求类型,URI,帮助方法'.split(',')
|
57
57
|
indexs = fs.map{|f| @routes.headings.index(f)}.compact
|
58
58
|
rows = []
|
59
|
-
@routes.rows.select{|a| a[0]==model_name}.
|
59
|
+
@routes.rows.select{|a| a[0]==model_name}.
|
60
|
+
each{|arr| rows << indexs.map{|i| arr[i]} }
|
60
61
|
puts Terminal::Table.new(
|
61
62
|
:title => "#{title_str}:路由",
|
62
63
|
:headings => fs,
|
@@ -66,7 +67,8 @@ class Ld::Project
|
|
66
67
|
fs = '文件夹名,行数,文件名,path'.split(',')
|
67
68
|
indexs = fs.map{|f| @views.headings.index(f)}.compact
|
68
69
|
rows = []
|
69
|
-
@views.rows.select{|a| a[0]==model_name}.
|
70
|
+
@views.rows.select{|a| a[0]==model_name}.
|
71
|
+
each{|arr| rows << indexs.map{|i| arr[i]} }
|
70
72
|
puts Terminal::Table.new(
|
71
73
|
:title => "#{title_str}:视图",
|
72
74
|
:headings => fs,
|
@@ -76,7 +78,8 @@ class Ld::Project
|
|
76
78
|
fs = 'action个数,文件行数,所有action'.split(',')
|
77
79
|
indexs = fs.map{|f| @controllers.headings.index(f)}.compact
|
78
80
|
rows = []
|
79
|
-
@controllers.rows.select{|a| a[0]==model_name}.
|
81
|
+
@controllers.rows.select{|a| a[0]==model_name}.
|
82
|
+
each{|arr| rows << indexs.map{|i| arr[i]} }
|
80
83
|
puts Terminal::Table.new(
|
81
84
|
:title => "#{title_str}:控制器",
|
82
85
|
:headings => fs,
|
data/lib/ld/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ld
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Liu Dong
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: terminal-table
|
@@ -92,6 +92,9 @@ files:
|
|
92
92
|
- bin/setup
|
93
93
|
- ld.gemspec
|
94
94
|
- lib/ld.rb
|
95
|
+
- lib/ld/document/document.rb
|
96
|
+
- lib/ld/error/hint.rb
|
97
|
+
- lib/ld/error/parameter_error.rb
|
95
98
|
- lib/ld/excel/excel.rb
|
96
99
|
- lib/ld/excel/sheet.rb
|
97
100
|
- lib/ld/file/dir.rb
|