lit-cli 0.0.3 → 0.5.0

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.
Files changed (7) hide show
  1. checksums.yaml +4 -4
  2. data/bin/lit +15 -2
  3. data/lib/config.rb +124 -0
  4. data/lib/lit_cli.rb +147 -0
  5. data/lib/lit_pry.rb +70 -0
  6. metadata +20 -4
  7. data/lib/api.rb +0 -36
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fce9ba635ef45e726a5c06159effa8a01d5fdaa0a3c4f0343fdcd5abc72a75f7
4
- data.tar.gz: 81de5c8ef9b211a7f8292395f643a65a062786c40cba4d58a7cfd6ffbf4674e9
3
+ metadata.gz: 0d016a1786059f76f691d0dd55ab4a8d2e408f4b2ee5bca3d8e42ea29012d379
4
+ data.tar.gz: 5f0756f25977560051e7b07b86ae795584e954fa14eeb4533f56505c60d9cdfd
5
5
  SHA512:
6
- metadata.gz: 0b88c567d5454350df3129d8e2f49cea0a1f73c5b6431402f9efd88848baa11fa4b451a96ba048f33208b8656fa60b0eb7ea987f0ee4daf7a225347a0e7d2cb0
7
- data.tar.gz: bf8e9a1a16d69c4107ef0ad61acb31341911c66b57edc7e3813d4f1209bfc759b47cad46874f9532efbde1a7e6227022ec127d817f3ca174c18b466d61f23f77
6
+ metadata.gz: b902f2d26e1b868be3026783a2f99e10a34ca1be0851cd73b5c16c2a4ef23fad146b5f9f51ddaca41975b249833c6f382cd47468f21ef6c2ecfa1638a9a2382e
7
+ data.tar.gz: 01c08ebe1937ed4d31240aed5bcda06c4d5f85b9d6c28c23ca21b939e547e6267fc7e6248d7f3d14972bd5e9b1ea27dc74df5c38fd3d39f2aaa0a09e5340fef2
data/bin/lit CHANGED
@@ -8,9 +8,22 @@
8
8
  # lit rails server
9
9
  ################################################################################
10
10
 
11
- # Enable Lit API.
12
11
  ENV['LIT_ENABLED'] = 'true'
13
12
 
13
+ # Get flags from arguments.
14
+ args = []
15
+ flags = []
16
+ ARGV.each do |arg|
17
+ if arg.start_with? '@'
18
+ flags << arg.delete_prefix('@')
19
+ else
20
+ args << arg
21
+ end
22
+ end
23
+ ENV['LIT_FLAGS'] = flags.join " "
24
+
25
+ # Get user input.
26
+ command = args.join " "
27
+
14
28
  # Action original command.
15
- command = ARGV.join " "
16
29
  system command
data/lib/config.rb ADDED
@@ -0,0 +1,124 @@
1
+ require 'set'
2
+
3
+ module LitCLI
4
+
5
+ ##############################################################################
6
+ # Default config that can be overridden from the command line or application.
7
+ #
8
+ # @usage:
9
+ # LitCLI.configure do |config|
10
+ # config.<property> = <value>
11
+ # end
12
+ #
13
+ # @precedence:
14
+ # 3. Defaults - initialize()
15
+ # 2. Application - LitCLI.configure()
16
+ # 1. Command line flags - cli_configure()
17
+ ##############################################################################
18
+
19
+ class Config
20
+
21
+ # Track errors and only show them once.
22
+ @@errors = Set.new
23
+
24
+ attr_accessor :enabled
25
+ attr_accessor :statuses
26
+ attr_accessor :types
27
+ # Flags.
28
+ attr_accessor :step
29
+ attr_accessor :status
30
+ attr_accessor :type
31
+ attr_accessor :delay
32
+
33
+ def initialize()
34
+
35
+ @statuses = {
36
+ :info => { icon: "ℹ", color: :blue },
37
+ :pass => { icon: "✔", color: :green },
38
+ :warn => { icon: "⚠", color: :yellow },
39
+ :fail => { icon: "⨯", color: :red },
40
+ :error => { icon: "!", color: :red },
41
+ :debug => { icon: "?", color: :purple },
42
+ }
43
+
44
+ @types = nil
45
+
46
+ # Lit is disabled by default, then enabled via the `lit` command.
47
+ # Or it can be permanently enabled, without the use of the `lit` command.
48
+ @enabled = false
49
+
50
+ ##
51
+ # FLAGS.
52
+ #
53
+ # Flag defaults when not supplied via command line.
54
+ ##
55
+
56
+ # Boolean on whether or not to step through each lit() breakpoint.
57
+ @step = false
58
+
59
+ # Array of statuses to filter by, for example: [:warn, :error, :fail]
60
+ @status = nil
61
+
62
+ # Array of types to filter by, for example: [:cat, :dog, :tree]
63
+ @type = nil
64
+
65
+ # Integer or float representing amount of seconds to delay each lit() by.
66
+ @delay = 0
67
+
68
+ cli_configure()
69
+ end
70
+
71
+ # Override config from command line.
72
+ def cli_configure()
73
+ @enabled = true if ENV['LIT_ENABLED'] == 'true'
74
+
75
+ # Convert flag string to hash.
76
+ flags = {}
77
+ if ENV['LIT_FLAGS'] && !ENV['LIT_FLAGS'].empty?
78
+ ENV['LIT_FLAGS'].split().each do |flag|
79
+ values = flag.split('=')
80
+
81
+ key = values.shift.to_sym
82
+
83
+ # No arguments.
84
+ if values.empty?
85
+ flags[key] = nil
86
+ else
87
+ args = values.pop.split(',')
88
+ # Single argument.
89
+ if args.count == 1
90
+ flags[key] = args.first
91
+ # Multiple arguments.
92
+ else
93
+ flags[key] = args
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ @step = true if flags.has_key? :step
100
+ @status = Array(flags[:status]).map(&:to_sym) if valid? flags, :status
101
+ @type = Array(flags[:type]).map(&:to_sym) if valid? flags, :type
102
+ @delay = flags[:delay].to_f if valid? flags, :delay
103
+ end
104
+
105
+ def valid? flags, flag
106
+ # Has flag even been entered on the command line?
107
+ unless flags.has_key? flag
108
+ return false
109
+ end
110
+
111
+ if flags[flag].nil?
112
+ error = "🔥 ERROR: Invalid argument for @#{flag}."
113
+ unless @@errors.include? error
114
+ @@errors.add error
115
+ puts error
116
+ end
117
+ return false
118
+ end
119
+
120
+ true
121
+ end
122
+
123
+ end
124
+ end
data/lib/lit_cli.rb ADDED
@@ -0,0 +1,147 @@
1
+ require 'pry'
2
+ require 'pastel'
3
+ require 'config'
4
+ require 'lit_pry'
5
+
6
+ module LitCLI
7
+ @@pastel = Pastel.new
8
+ @@config = Config.new
9
+ @@is_prying = false
10
+
11
+ def lit(message, status = :info, type = nil)
12
+ if @@config.enabled
13
+ return if LitCLI.filter_status? status
14
+ return if LitCLI.filter_type? type
15
+ LitCLI.render(message, status, type)
16
+ LitCLI.step()
17
+ LitCLI.delay()
18
+ end
19
+ end
20
+ alias 🔥 lit
21
+
22
+ def self.render(message, status, type)
23
+ text = "🔥"
24
+
25
+ # Time.
26
+ time = LitCLI.format(Time.now().strftime("%k:%M"), color: :cyan)
27
+ text << " #{time}"
28
+
29
+ # Status.
30
+ config = @@config.statuses[status]
31
+ text << LitCLI.format(" #{config[:icon]} #{status.to_s}", config)
32
+
33
+ # Type.
34
+ if !@@config.types.nil? && @@config.types.has_key?(type)
35
+ config = @@config.types[type]
36
+ if config.has_key? :icon
37
+ text << LitCLI.format(" #{config[:icon]} #{type.to_s}", config)
38
+ else
39
+ text << LitCLI.format(" #{type.to_s}", config)
40
+ end
41
+ end
42
+
43
+ # Message.
44
+ text << " #{message}"
45
+
46
+ puts text
47
+ end
48
+
49
+ def self.step()
50
+ if @@config.step
51
+ puts "🔥 Press ENTER to step or P to Pry:"
52
+ input = gets.chomp
53
+ binding while input == nil
54
+ @@is_prying = true if input.downcase == "p"
55
+ end
56
+ end
57
+
58
+ def self.filter_status? status
59
+ unless @@config.status.nil? || @@config.status.include?(status)
60
+ return true
61
+ end
62
+
63
+ false
64
+ end
65
+
66
+ def self.filter_type? type
67
+ unless @@config.type.nil? || @@config.type.include?(type)
68
+ return true
69
+ end
70
+
71
+ false
72
+ end
73
+
74
+ def self.delay()
75
+ if @@config.delay > 0
76
+ sleep(@@config.delay)
77
+ end
78
+ end
79
+
80
+ def self.is_prying?
81
+ @@config.step && @@is_prying
82
+ end
83
+
84
+ def self.format(text, config)
85
+
86
+ if config.has_key? :styles
87
+ # Change characters first.
88
+ config[:styles].each do |style|
89
+ case style
90
+ when :upcase
91
+ text = text.upcase
92
+ when :downcase
93
+ text = text.downcase
94
+ end
95
+ end
96
+ # Then apply styling.
97
+ config[:styles].each do |style|
98
+ case style
99
+ when :clear
100
+ text = @@pastel.clear(text)
101
+ when :bold
102
+ text = @@pastel.bold(text)
103
+ when :dim
104
+ text = @@pastel.dim(text)
105
+ when :italic
106
+ text = @@pastel.italic(text)
107
+ when :underline
108
+ text = @@pastel.underline(text)
109
+ when :inverse
110
+ text = @@pastel.inverse(text)
111
+ when :hidden
112
+ text = @@pastel.hidden(text)
113
+ when :strike, :strikethrough
114
+ text = @@pastel.strikethrough(text)
115
+ end
116
+ end
117
+ end
118
+
119
+ if config.has_key? :color
120
+ case config[:color]
121
+ when :blue
122
+ text = @@pastel.bright_blue(text)
123
+ when :green
124
+ text = @@pastel.green(text)
125
+ when :yellow
126
+ text = @@pastel.yellow(text)
127
+ when :red
128
+ text = @@pastel.red(text)
129
+ when :purple, :magenta
130
+ text = @@pastel.magenta(text)
131
+ when :cyan
132
+ text = @@pastel.cyan(text)
133
+ end
134
+ end
135
+
136
+ text
137
+ end
138
+
139
+ # Override config from application.
140
+ def self.configure()
141
+ yield(@@config)
142
+
143
+ # Override config from command line.
144
+ @@config.cli_configure()
145
+ end
146
+
147
+ end
data/lib/lit_pry.rb ADDED
@@ -0,0 +1,70 @@
1
+ # Only override kernel methods when Lit's @step flag is true.
2
+ if ENV['LIT_FLAGS'] && ENV['LIT_FLAGS'].include?('step')
3
+ module Kernel
4
+
5
+ def require_relative relative_path
6
+ filename = relative_path
7
+
8
+ # Get directory of the file that called this file.
9
+ absolute_path = caller_locations.first.absolute_path.split('/')
10
+ absolute_path.pop
11
+
12
+ # When relative path is current directory.
13
+ if relative_path.start_with?('./')
14
+ filename = relative_path.delete_prefix! './'
15
+ end
16
+
17
+ # When relative path is parent directory.
18
+ while relative_path.start_with?('../')
19
+ relative_path.delete_prefix! '../'
20
+ absolute_path.pop
21
+ end
22
+
23
+ # Append default extension.
24
+ unless filename.end_with? '.rb'
25
+ filename << '.rb'
26
+ end
27
+
28
+ filepath = File.join(absolute_path.join('/'), relative_path)
29
+
30
+ # Add pry binding beneath each lit message.
31
+ new_lines = ''
32
+ File.foreach(filepath) do |line|
33
+ new_lines << line
34
+ if line.strip.start_with? 'lit "'
35
+ new_lines << "binding.pry if LitCLI.is_prying?\n"
36
+ new_lines << "@@is_prying = false\n"
37
+ end
38
+ end
39
+
40
+ eval(new_lines)
41
+ end
42
+
43
+ # TODO: Investigate RubyGems `require` before overriding.
44
+ # SEE: https://github.com/ruby/ruby/blob/v2_6_3/lib/rubygems/core_ext/kernel_require.rb
45
+ #
46
+ # def require path
47
+ # absolute_path = File.join(Dir.pwd, path)
48
+ # #p "requiring #{absolute_path}"
49
+ # #p __dir__
50
+ # #p File.dirname(File.realpath(__FILE__))
51
+ # #p File.realpath(__FILE__)
52
+ #
53
+ # # Split client-side and server-side code.
54
+ # new_lines = []
55
+ # binding_line = "binding.pry if LitCLI.is_prying?"
56
+ #
57
+ # # Add pry binding beneath each lit message.
58
+ # p path
59
+ # File.foreach(path) do |line|
60
+ # new_lines << line
61
+ # if line.strip.start_with? 'lit "'
62
+ # new_lines << binding_line
63
+ # end
64
+ # end
65
+ #
66
+ # eval(new_lines.join)
67
+ # end
68
+
69
+ end
70
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lit-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maedi Prichard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-01 00:00:00.000000000 Z
11
+ date: 2021-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pastel
@@ -24,7 +24,21 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- description: Show more detailed logs by starting commands with 'lit'.
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Console logs that are only visible after prefixing commands with 'lit'.
28
42
  email: maediprichard@gmail.com
29
43
  executables:
30
44
  - lit
@@ -32,7 +46,9 @@ extensions: []
32
46
  extra_rdoc_files: []
33
47
  files:
34
48
  - bin/lit
35
- - lib/api.rb
49
+ - lib/config.rb
50
+ - lib/lit_cli.rb
51
+ - lib/lit_pry.rb
36
52
  homepage: https://reflekt.dev/lit
37
53
  licenses:
38
54
  - MPL-2.0
data/lib/api.rb DELETED
@@ -1,36 +0,0 @@
1
- # TODO: Define environment variable in parent process, not just child process.
2
- # ENV['LIT_SUPPORTED'] = 'true'
3
-
4
- require 'pastel'
5
-
6
- module LitAPI
7
-
8
- @@pastel = Pastel.new
9
-
10
- def lit(message, status = :info)
11
-
12
- if ENV['LIT_ENABLED'] == 'true'
13
-
14
- time = Time.now().strftime("%k:%M")
15
- status_style = status.to_s.upcase
16
- status_icons = {
17
- :info => "ℹ",
18
- :pass => "✔",
19
- :fail => "⨯"
20
- }
21
-
22
- message = "🔥 #{time}: #{message} (#{status_icons[status]} #{status_style})"
23
-
24
- case status
25
- when :info
26
- puts @@pastel.bright_blue(message)
27
- when :pass, :success
28
- puts @@pastel.green(message)
29
- when :fail
30
- puts @@pastel.red(message)
31
- end
32
-
33
- end
34
- end
35
-
36
- end