lhj-tools 0.1.2 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lhj/tree/node'
4
+ require 'lhj/tree/directory_renderer'
5
+ require 'lhj/tree/number_renderer'
6
+ require 'lhj/tree/hash_walker'
7
+ require 'lhj/tree/path_walker'
8
+
9
+ module Lhj
10
+ class Tree
11
+ # @api public
12
+ def self.[](data)
13
+ new(data)
14
+ end
15
+
16
+ # The list of nodes in this tree.
17
+ attr_reader :nodes
18
+
19
+ # Create a Tree
20
+ #
21
+ # @param [String,Dir,Hash] data
22
+ #
23
+ # @api public
24
+ def initialize(data = nil, options = {}, &block)
25
+ @data = data ? data.dup.freeze : nil
26
+ @walker = select_walker.new(options)
27
+ @nodes = []
28
+
29
+ if @data
30
+ @walker.traverse(data)
31
+ @nodes = @walker.nodes
32
+ end
33
+
34
+ @nodes_stack = []
35
+
36
+ instance_eval(&block) if block_given?
37
+
38
+ freeze
39
+ end
40
+
41
+ # Add node to this tree.
42
+ #
43
+ # @param [Symbol,String] name
44
+ # the name for the node
45
+ #
46
+ # @param [Node, LeafNode] type
47
+ # the type of node to add
48
+ #
49
+ # @example
50
+ # TTY::Tree.new do
51
+ # node '...' do
52
+ # node '...'
53
+ # end
54
+ # end
55
+ #
56
+ # @api public
57
+ def node(name, type = Node, &block)
58
+ parent = @nodes_stack.empty? ? Node::ROOT : @nodes_stack.last
59
+ level = [0, @nodes_stack.size - 1].max
60
+ prefix = ':pipe' * level
61
+ if parent.class == LeafNode
62
+ prefix = ':space' * level
63
+ end
64
+ node = type.new(name, parent.full_path, prefix, @nodes_stack.size)
65
+ @nodes << node
66
+
67
+ return unless block_given?
68
+
69
+ @nodes_stack << node
70
+ if block.arity.zero?
71
+ instance_eval(&block)
72
+ else
73
+ instance_eval(&(->(*_args) { block[node] }))
74
+ end
75
+ @nodes_stack.pop
76
+ end
77
+
78
+ # Add leaf node
79
+ #
80
+ # @api public
81
+ def leaf(name, &block)
82
+ node(name, LeafNode, &block)
83
+ end
84
+
85
+ # @api public
86
+ def render(options = {})
87
+ as = options.delete(:as) || :dir
88
+ renderer = select_renderer(as).new(nodes, options)
89
+ renderer.render
90
+ end
91
+
92
+ private
93
+
94
+ # @api private
95
+ def select_walker
96
+ if @data.is_a?(Hash) || @data.nil?
97
+ HashWalker
98
+ else
99
+ @data ||= Dir.pwd
100
+ PathWalker
101
+ end
102
+ end
103
+
104
+ def select_renderer(as)
105
+ case as
106
+ when :dir, :directory then DirectoryRenderer
107
+ when :num, :number then NumberRenderer
108
+ end
109
+ end
110
+ end
111
+ end
112
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lhj-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - lihaijian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-20 00:00:00.000000000 Z
11
+ date: 2022-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: claide
@@ -104,6 +104,40 @@ dependencies:
104
104
  - - "~>"
105
105
  - !ruby/object:Gem::Version
106
106
  version: 0.8.0
107
+ - !ruby/object:Gem::Dependency
108
+ name: addressable
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '2.8'
114
+ type: :runtime
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '2.8'
121
+ - !ruby/object:Gem::Dependency
122
+ name: tty-spinner
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: 0.8.0
128
+ - - "<"
129
+ - !ruby/object:Gem::Version
130
+ version: 1.0.0
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 0.8.0
138
+ - - "<"
139
+ - !ruby/object:Gem::Version
140
+ version: 1.0.0
107
141
  - !ruby/object:Gem::Dependency
108
142
  name: faraday-cookie_jar
109
143
  requirement: !ruby/object:Gem::Requirement
@@ -212,6 +246,7 @@ files:
212
246
  - lib/lhj/command/local/local.rb
213
247
  - lib/lhj/command/local/local_upload.rb
214
248
  - lib/lhj/command/local/micro_service.rb
249
+ - lib/lhj/command/oss.rb
215
250
  - lib/lhj/command/oss/del.rb
216
251
  - lib/lhj/command/oss/list.rb
217
252
  - lib/lhj/command/oss/upload.rb
@@ -229,6 +264,12 @@ files:
229
264
  - lib/lhj/helper/trans_helper.rb
230
265
  - lib/lhj/tools.rb
231
266
  - lib/lhj/tools/version.rb
267
+ - lib/lhj/tree/directory_renderer.rb
268
+ - lib/lhj/tree/hash_walker.rb
269
+ - lib/lhj/tree/node.rb
270
+ - lib/lhj/tree/number_renderer.rb
271
+ - lib/lhj/tree/path_walker.rb
272
+ - lib/lhj/tree/tree.rb
232
273
  homepage:
233
274
  licenses:
234
275
  - MIT