ld 0.2.3 → 0.2.6
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 +4 -4
- data/README.md +2 -2
- data/lib/ld/project/controllers.rb +40 -0
- data/lib/ld/project/models.rb +30 -0
- data/lib/ld/project/project.rb +51 -0
- data/lib/ld/project/routes.rb +30 -0
- data/lib/ld/project/tables.rb +81 -0
- data/lib/ld/project/views.rb +28 -0
- data/lib/ld/version.rb +1 -1
- data/lib/ld.rb +6 -6
- metadata +7 -3
- data/lib/ld/project/parse.rb +0 -110
- data/lib/ld/project/structure.rb +0 -57
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d537a523fd57cca3f98c2662fc9ac9a208b7522b
|
4
|
+
data.tar.gz: 492bba9c5d819c7e58a063f0bc791679c2a6e873
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3044f77a5e29d12d8b4aee5e3af93ac79bfa74f8d906749181116e1dfac1dfed264522b55ef055990297bc0a8b539ca3e3bff191324a53ffa749fffce3662df2
|
7
|
+
data.tar.gz: 6c326e0433bde9e60f55c2259871549eb39c8f9de1e1b4c22d246f0900462ffe79d4281b0c02a7edb89aa83ce504f08c52c690f2006663ee4c2f8ad59c209f3e
|
data/README.md
CHANGED
@@ -85,8 +85,8 @@ Ld::Excel.open('/Users/liudong/Desktop/excel_test.xls').read('sheet1?a1:e10')
|
|
85
85
|
# Read Dir
|
86
86
|
Ld::File.open_dir('dir_path').children.each{|f| puts f.path}
|
87
87
|
|
88
|
-
# Project details to xls 查看项目详情,会生成xls文件,在:
|
89
|
-
Ld::Project.new
|
88
|
+
# Project Structure details to /project.xls 查看项目详情,会生成xls文件,在: /project.xls
|
89
|
+
Ld::Project::Structure.new(Ld::File.new(Rails.root.to_s)).generate
|
90
90
|
|
91
91
|
```
|
92
92
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class Ld::Controllers
|
2
|
+
|
3
|
+
attr_accessor :headings, :rows
|
4
|
+
|
5
|
+
def initialize root, models
|
6
|
+
@root = root
|
7
|
+
@models = models
|
8
|
+
parse
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse
|
12
|
+
@rows = @root.app.controllers.search_files(/_controller.rb$/).map { |c|
|
13
|
+
model_name = c.name.split('_controller')[0].singularize
|
14
|
+
model_name = @models.models.include?(model_name) ? model_name : nil
|
15
|
+
lines = c.lines
|
16
|
+
actions = lines.map{|l| l.split('def ')[1] if l.match(/def /)}.compact
|
17
|
+
[model_name, c.name,actions.size, lines.size, c.path,actions.join(',')]
|
18
|
+
}.sort{|a,b| b[2] <=> a[2]}
|
19
|
+
@headings = ['所属模型名称', '控制器名','action个数', '文件行数','path', '所有action']
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse_by_model_name model_name
|
23
|
+
controller = find_controller model_name.pluralize
|
24
|
+
if controller
|
25
|
+
controller_lines = controller.lines
|
26
|
+
controller_methods = controller_lines.map{|l| l.split('def ')[1] if l.match(/def /)}.compact
|
27
|
+
end
|
28
|
+
controller
|
29
|
+
end
|
30
|
+
|
31
|
+
def find_controller model_name
|
32
|
+
@controllers.each do |c|
|
33
|
+
if c.name.split('_controller.rb')[0] == model_name
|
34
|
+
return c
|
35
|
+
end
|
36
|
+
end
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Ld::Models
|
2
|
+
attr_accessor :headings, :rows, :models
|
3
|
+
|
4
|
+
def initialize root, tables
|
5
|
+
@root = root
|
6
|
+
@tables = tables
|
7
|
+
parse
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse
|
11
|
+
rows = []
|
12
|
+
model_files = @root.app.models.search_files(/.rb$/).map{|m|
|
13
|
+
m if @tables.tables.include?(m.name.split('.')[0].pluralize)
|
14
|
+
}.compact
|
15
|
+
@rows = model_files.map{ |file|
|
16
|
+
name = file.name.split('.')[0]
|
17
|
+
lines = file.lines
|
18
|
+
methods_full = lines.map{|l| l.split('def ')[1] if l.match(/def /)}.compact
|
19
|
+
methods = methods_full.map{|method_full| method_full.split(' ')[0]}
|
20
|
+
instance = name.camelize.constantize.new
|
21
|
+
data_count = name.camelize.constantize.count
|
22
|
+
fields = instance.attributes.keys
|
23
|
+
[name,name.pluralize,name.camelize,data_count,lines.size,file.path,methods.size,methods.join(','),fields.join(','),fields.size]
|
24
|
+
}.compact.sort{|a,b| b[2] <=> a[2]} # 按 模型文件行数 排序
|
25
|
+
@models = @rows.map{|arr| arr[0]}.uniq
|
26
|
+
@headings = ['模型名','表名','类','数据数量','行数','path', '方法数','所有方法', '所有字段','字段数量']
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class Ld::Project
|
2
|
+
|
3
|
+
attr_accessor :root, :tables, :models, :controllers, :views, :routes
|
4
|
+
|
5
|
+
def initialize path = Rails.root.to_s
|
6
|
+
@root = Ld::File.new path
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse_project
|
10
|
+
@routes = Ld::Routes.new @root
|
11
|
+
@tables = Ld::Tables.new @root, nil
|
12
|
+
@models = Ld::Models.new @root, @tables
|
13
|
+
@tables = Ld::Tables.new @root, @models
|
14
|
+
@views = Ld::Views.new @root, @models
|
15
|
+
@controllers = Ld::Controllers.new @root, @models
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_xls path = "#{@root.path}/project.xls"
|
19
|
+
parse_project
|
20
|
+
Ld::Excel.create path do |excel|
|
21
|
+
# sheet.set_format({color: :black, font_size: 14, font: '微软雅黑'})
|
22
|
+
excel.write_sheet 'routes' do |sheet|
|
23
|
+
sheet.set_headings @routes.headings
|
24
|
+
sheet.set_rows @routes.rows
|
25
|
+
end
|
26
|
+
excel.write_sheet 'tables' do |sheet|
|
27
|
+
sheet.set_headings @tables.headings
|
28
|
+
sheet.set_rows @tables.rows
|
29
|
+
end
|
30
|
+
excel.write_sheet 'models' do |sheet|
|
31
|
+
sheet.set_headings @models.headings
|
32
|
+
sheet.set_rows @models.rows
|
33
|
+
end
|
34
|
+
excel.write_sheet 'views' do |sheet|
|
35
|
+
sheet.set_headings @views.headings
|
36
|
+
sheet.set_rows @views.rows
|
37
|
+
end
|
38
|
+
excel.write_sheet 'controllers' do |sheet|
|
39
|
+
sheet.set_headings @controllers.headings
|
40
|
+
sheet.set_rows @controllers.rows
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def camelize name
|
47
|
+
name.camelize
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Ld::Routes
|
2
|
+
|
3
|
+
attr_accessor :headings, :rows
|
4
|
+
|
5
|
+
def initialize root
|
6
|
+
@root = root
|
7
|
+
parse
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse
|
11
|
+
system "rake routes > #{@root.path}/routes.txt"
|
12
|
+
rows = @root.find('routes.txt').lines.map{|line|
|
13
|
+
arr = line.split(' ')
|
14
|
+
arr.unshift(nil) if arr.size == 3
|
15
|
+
arr
|
16
|
+
}
|
17
|
+
.delete_if{|arr| arr.size >= 5 or arr.size <= 2 }
|
18
|
+
.map{|row|
|
19
|
+
controller, action = row[3].split('#')
|
20
|
+
type = row[1]
|
21
|
+
help_method = row[0]
|
22
|
+
uri = row[2]
|
23
|
+
#
|
24
|
+
[controller, action, type, uri, help_method]
|
25
|
+
}
|
26
|
+
File.delete("#{@root.path}/routes.txt") if File.exist? "#{@root.path}/routes.txt"
|
27
|
+
@headings = ['控制器', 'action', '请求类型','URI','帮助方法']
|
28
|
+
@rows = rows
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class Ld::Tables
|
2
|
+
|
3
|
+
attr_accessor :headings, :rows, :tables
|
4
|
+
|
5
|
+
def initialize root, models
|
6
|
+
@root = root
|
7
|
+
@models = models
|
8
|
+
parse
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse
|
12
|
+
tables = {}
|
13
|
+
read_flag = false
|
14
|
+
table = ""
|
15
|
+
@root.db.find('schema.rb').lines.each do |l|
|
16
|
+
if l.split(' ')[0] == 'end'
|
17
|
+
read_flag = false
|
18
|
+
end
|
19
|
+
if l.split(' ')[0] == 'create_table'
|
20
|
+
read_flag = true
|
21
|
+
table = l.split('"')[1]
|
22
|
+
tables[table] = []
|
23
|
+
end
|
24
|
+
if read_flag
|
25
|
+
tables[table] << l
|
26
|
+
end
|
27
|
+
end
|
28
|
+
rows = []
|
29
|
+
tables.each do |table_name, lines|
|
30
|
+
model_class = parse_class table_name
|
31
|
+
lines.delete_at(0)
|
32
|
+
lines.each do |line|
|
33
|
+
hash = parse_line line
|
34
|
+
if hash[:type] != 'index'
|
35
|
+
if @models
|
36
|
+
@model_name = @models.models.include?(table_name.singularize) ? table_name.singularize : nil
|
37
|
+
end
|
38
|
+
rows << [@model_name,table_name,hash[:field],hash[:type],hash[:comment],hash[:null],hash[:default],hash[:precision],hash[:limit]]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
@headings = ['所属模型','表名','字段','字段类型','描述','空约束','默认值','精度位数','limit']
|
43
|
+
@rows = rows.sort{|a,b| b[1] <=> a[1]}
|
44
|
+
@tables = tables.keys
|
45
|
+
end
|
46
|
+
|
47
|
+
def parse_line line
|
48
|
+
arr = line.split(' ')
|
49
|
+
hash = {}
|
50
|
+
if arr[0].match(/^t./)
|
51
|
+
hash[:type] = arr[0].split('.')[1]
|
52
|
+
i = nil
|
53
|
+
if hash[:type] == 'index'
|
54
|
+
hash[:name] = arr[i + 1] if i = arr.index('name:')
|
55
|
+
hash[:unique] = arr[i + 1] if i = arr.index('unique:')
|
56
|
+
hash[:using] = arr[i + 1] if i = arr.index('using:')
|
57
|
+
else
|
58
|
+
hash[:field] = line.split('"')[1]
|
59
|
+
hash[:null] = arr[i + 1] if i = arr.index('name:')
|
60
|
+
hash[:limit] = arr[i + 1] if i = arr.index('limit:')
|
61
|
+
hash[:comment] = arr[i + 1].split('"')[1] if i = arr.index('comment:')
|
62
|
+
hash[:default] = arr[i + 1] if i = arr.index('default:')
|
63
|
+
hash[:precision] = arr[i + 1] if i = arr.index('precision:')
|
64
|
+
hash[:precision] = arr[i + 1] if i = arr.index('precision:')
|
65
|
+
end
|
66
|
+
return hash
|
67
|
+
else
|
68
|
+
|
69
|
+
end
|
70
|
+
return false
|
71
|
+
end
|
72
|
+
|
73
|
+
def parse_class table_name
|
74
|
+
model_class = table_name.singularize.camelize.constantize
|
75
|
+
return model_class
|
76
|
+
rescue
|
77
|
+
return nil
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Ld::Views
|
2
|
+
attr_accessor :headings, :rows
|
3
|
+
|
4
|
+
def initialize root, models
|
5
|
+
@root = root
|
6
|
+
@models = models
|
7
|
+
parse
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse
|
11
|
+
@rows = @root.app.views.search_files(/.html/).map{|v|
|
12
|
+
dir_name = v.father.name
|
13
|
+
model_name = @models.models.include?(dir_name.singularize) ? dir_name.singularize : nil
|
14
|
+
[model_name,v.lines.size,dir_name,v.name,v.path]
|
15
|
+
}.sort{|a,b| b[1] <=> a[1]}
|
16
|
+
@headings = ['所属模型名','行数','文件夹名','文件名','path']
|
17
|
+
end
|
18
|
+
|
19
|
+
def find model_name
|
20
|
+
@view_dirs.each do |view_dir|
|
21
|
+
if view_dir.name == model_name.pluralize
|
22
|
+
return Ld::View.new view_dir
|
23
|
+
end
|
24
|
+
end
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/lib/ld/version.rb
CHANGED
data/lib/ld.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
require "ld/version"
|
2
2
|
|
3
3
|
module Ld
|
4
|
-
module Project
|
5
|
-
module Parse
|
6
|
-
end
|
7
|
-
end
|
8
4
|
end
|
9
5
|
|
10
6
|
require "ld/file/file"
|
11
7
|
require "ld/file/files"
|
12
8
|
|
13
|
-
require "ld/project/
|
14
|
-
require "ld/project/
|
9
|
+
require "ld/project/project"
|
10
|
+
require "ld/project/routes"
|
11
|
+
require "ld/project/tables"
|
12
|
+
require "ld/project/models"
|
13
|
+
require "ld/project/controllers"
|
14
|
+
require "ld/project/views"
|
15
15
|
|
16
16
|
require "ld/excel/excel"
|
17
17
|
require "ld/excel/sheet"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ld
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Liu Dong
|
@@ -98,8 +98,12 @@ files:
|
|
98
98
|
- lib/ld/file/file.rb
|
99
99
|
- lib/ld/file/files.rb
|
100
100
|
- lib/ld/print/print.rb
|
101
|
-
- lib/ld/project/
|
102
|
-
- lib/ld/project/
|
101
|
+
- lib/ld/project/controllers.rb
|
102
|
+
- lib/ld/project/models.rb
|
103
|
+
- lib/ld/project/project.rb
|
104
|
+
- lib/ld/project/routes.rb
|
105
|
+
- lib/ld/project/tables.rb
|
106
|
+
- lib/ld/project/views.rb
|
103
107
|
- lib/ld/version.rb
|
104
108
|
homepage: https://github.com/18810625123/ld
|
105
109
|
licenses:
|
data/lib/ld/project/parse.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
module Ld::Project::Parse
|
2
|
-
|
3
|
-
def parse_routes root
|
4
|
-
system "rake routes > #{root.path}/routes.txt"
|
5
|
-
rows = root.find('routes.txt').lines.map{|line|
|
6
|
-
arr = line.split(' ')
|
7
|
-
arr.unshift(nil) if arr.size == 3
|
8
|
-
arr
|
9
|
-
}
|
10
|
-
.delete_if{|arr| arr.size >= 5 or arr.size <= 2 }
|
11
|
-
.map{|row|
|
12
|
-
controller, action = row[3].split('#')
|
13
|
-
type = row[1]
|
14
|
-
help_method = row[0]
|
15
|
-
uri = row[2]
|
16
|
-
#
|
17
|
-
[controller, action, type, uri, help_method]
|
18
|
-
}
|
19
|
-
File.delete("#{root.path}/routes.txt") if File.exist? "#{root.path}/routes.txt"
|
20
|
-
{
|
21
|
-
:headings => ['控制器', 'action', '请求类型','URI','帮助方法'],
|
22
|
-
:rows => rows
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
def parse_schema root
|
27
|
-
lines = root.db.find('schema.rb').lines
|
28
|
-
tables = {}
|
29
|
-
read_flag = false
|
30
|
-
table = ""
|
31
|
-
lines.each do |l|
|
32
|
-
if l.lstrip.rstrip.split('end').size == 0
|
33
|
-
read_flag = false
|
34
|
-
end
|
35
|
-
if l.match(/create_table /) and l.match(/ do /)
|
36
|
-
read_flag = true
|
37
|
-
table = l.split('"')[1]
|
38
|
-
tables[table] = []
|
39
|
-
end
|
40
|
-
if read_flag
|
41
|
-
tables[table] << l
|
42
|
-
end
|
43
|
-
end
|
44
|
-
rows = tables.map{|k, v|
|
45
|
-
v.delete_at(0)
|
46
|
-
[k, v.join(':')]
|
47
|
-
}
|
48
|
-
{
|
49
|
-
:headings => ['tables', 'comment'],
|
50
|
-
:rows => rows
|
51
|
-
}
|
52
|
-
end
|
53
|
-
|
54
|
-
def parse_models root
|
55
|
-
rows = []
|
56
|
-
@models = root.app.models.search_files(/.rb$/)
|
57
|
-
@controllers = root.app.controllers.search_files(/_controller.rb$/)
|
58
|
-
@views = root.app.views.search_dirs
|
59
|
-
@tables = parse_schema root
|
60
|
-
@models.each do |model_file|
|
61
|
-
model_name = model_file.name.split('.')[0]
|
62
|
-
next if !@tables[model_name.pluralize]
|
63
|
-
model_lines = model_file.lines
|
64
|
-
actions_full_name = model_lines.map{|l| l.split('def ')[1] if l.match(/def /)}.compact
|
65
|
-
actions = actions_full_name.map{|action| action.split(' ')[0]}
|
66
|
-
model_instance = eval("#{model_name.camelize}.new")
|
67
|
-
fields = model_instance.attributes.keys
|
68
|
-
|
69
|
-
controller = find_controller model_name.pluralize
|
70
|
-
if controller
|
71
|
-
controller_lines = controller.lines
|
72
|
-
controller_methods = controller_lines.map{|l| l.split('def ')[1] if l.match(/def /)}.compact
|
73
|
-
end
|
74
|
-
|
75
|
-
view = find_view model_name.pluralize
|
76
|
-
if view
|
77
|
-
views = view.search_files(/.html/)
|
78
|
-
end
|
79
|
-
|
80
|
-
rows << [
|
81
|
-
model_name, # 模型
|
82
|
-
model_name.camelize, # 类
|
83
|
-
model_lines.size, # 模型lines
|
84
|
-
model_file.path, # 模型文件
|
85
|
-
(controller.nil? ? '' : controller.path), # 控制器文件
|
86
|
-
(controller.nil? ? 0 : controller_lines.size),# 控制器lines
|
87
|
-
actions.size, # 模型方法size
|
88
|
-
actions.join(','), # 模型方法
|
89
|
-
fields.size, # 字段size
|
90
|
-
fields.join(','), # 字段
|
91
|
-
(views.nil? ? 0 : views.size), # 视图size
|
92
|
-
(views.nil? ? '' : views.map{|v| "#{v.name.split('.')[0]}-#{v.path}"}.join(',')), # 视图
|
93
|
-
(controller_methods.nil? ? 0 : controller_methods.size), # action-size
|
94
|
-
(controller_methods.nil? ? '' : controller_methods.join(',')) # actions
|
95
|
-
]
|
96
|
-
end
|
97
|
-
rows = rows.compact.sort{|a,b| b[2] <=> a[2]} # 按 模型文件行数 排序
|
98
|
-
{
|
99
|
-
:headings => ['模型','类',
|
100
|
-
'模型lines','模型文件',
|
101
|
-
'控制器文件','控制器lines',
|
102
|
-
'模型方法size','模型方法',
|
103
|
-
'字段size','字段',
|
104
|
-
'视图size', '视图',
|
105
|
-
'action-size','actions'],
|
106
|
-
:rows => rows
|
107
|
-
}
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|
data/lib/ld/project/structure.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
class Ld::Project::Structure
|
2
|
-
include Ld::Project::Parse
|
3
|
-
attr_accessor :root, :name, :path
|
4
|
-
|
5
|
-
def initialize path = Rails.root.to_s
|
6
|
-
@root = Ld::File.new path
|
7
|
-
@name = @root.name
|
8
|
-
@path = @root.path
|
9
|
-
end
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def generate path = "#{@root.path}/project.xls"
|
14
|
-
Ld::Excel.create path do |excel|
|
15
|
-
# sheet.set_format({color: :black, font_size: 14, font: '微软雅黑'})
|
16
|
-
excel.write_sheet 'routes' do |sheet|
|
17
|
-
@routes = parse_routes @root
|
18
|
-
sheet.set_headings @routes[:headings]
|
19
|
-
sheet.set_rows @routes[:rows]
|
20
|
-
end
|
21
|
-
excel.write_sheet 'tables' do |sheet|
|
22
|
-
@tables = parse_schema @root
|
23
|
-
sheet.set_headings @tables[:headings]
|
24
|
-
sheet.set_rows @tables[:rows]
|
25
|
-
end
|
26
|
-
excel.write_sheet 'models' do |sheet|
|
27
|
-
@models = parse_models @root
|
28
|
-
sheet.set_headings @models[:headings]
|
29
|
-
sheet.set_rows @models[:rows]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def find_controller model_name
|
35
|
-
@controllers.each do |c|
|
36
|
-
if c.name.split('_controller.rb')[0] == model_name
|
37
|
-
return c
|
38
|
-
end
|
39
|
-
end
|
40
|
-
nil
|
41
|
-
end
|
42
|
-
|
43
|
-
def find_view model_name
|
44
|
-
@views.each do |v|
|
45
|
-
if v.name == model_name
|
46
|
-
return v
|
47
|
-
end
|
48
|
-
end
|
49
|
-
nil
|
50
|
-
end
|
51
|
-
|
52
|
-
def camelize name
|
53
|
-
name.camelize
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
end
|