so-pretty 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ebcbc2fa619e3b9d8456f1173803b48896bb0244
4
+ data.tar.gz: 9156649bc47e57c81af01f411813c1f14b6e16b0
5
+ SHA512:
6
+ metadata.gz: 213252e82e13d776c79c19b2c4c2a4c2a451adce5aaaf9eeac2a0547b5f161443464a3b3fa3a142cdc684c3ac3dcae21e364af56eca5043d8e6d9b6003800e2d
7
+ data.tar.gz: a17ad9329dd6218fb7ec7bfa5e6c23f1d834e73368bbbfc39a5a173fe2809f3decd04c09a70f745b27e560f2f95a39e66750945e67edf9c4f2997b8a53d54471
@@ -0,0 +1,15 @@
1
+ ## Usage
2
+
3
+ ```
4
+ Usage: sp [options]
5
+ -i, --input [instream] Input stream, one of: '-', 'STDIN', or a file name
6
+ -o, --output [outstream] Output stream, one of: '-', 'STDOUT', 'STDERR' or a file name
7
+ -f, --format [format] Output format, one of: 'yaml', 'json', 'ruby', 'minjson'
8
+ ```
9
+
10
+ ## TODO
11
+
12
+ - add formats
13
+ * csv
14
+ * toml
15
+ * some specs would be nice
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'so-pretty'
4
+
5
+ prettifier = SoPretty::Base.from_cli( ARGV )
6
+ prettifier.prettify
data/bin/sp ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'so-pretty'
4
+
5
+ prettifier = SoPretty::Base.from_cli( ARGV )
6
+ prettifier.prettify
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'json'
5
+ require 'zlib'
6
+ require 'yaml'
7
+ require 'optparse'
8
+
9
+ begin
10
+ require 'awesome_print'
11
+ rescue LoadError => e
12
+ STDERR.puts "awesome_print is not installed. Install it to get better printing from the :ruby format. `gem install awesome_print`"
13
+ end
14
+
15
+ module SoPretty
16
+ class Base
17
+ def initialize( options = {} )
18
+ @instream = to_stream( :input, options[:instream] )
19
+ @outstream = to_stream( :output, options[:outstream] )
20
+ @outformat = options[:format]
21
+ end
22
+
23
+ def prettify
24
+ if @outformat == :yaml
25
+ @outstream.puts YAML::dump( parsed )
26
+ return
27
+ end
28
+
29
+ if @outformat == :ruby
30
+ if defined?( AwesomePrint )
31
+ @outstream.puts parsed.ai( plain: true, index: false )
32
+ else
33
+ @outstream.puts parsed.inspect
34
+ end
35
+
36
+ return
37
+ end
38
+
39
+ if @outformat == :minjson
40
+ @outstream.puts JSON.dump( parsed )
41
+ return
42
+ end
43
+
44
+ @outstream.puts JSON.pretty_generate( parsed )
45
+ ensure
46
+ close_streams
47
+ end
48
+
49
+ def parsed
50
+ return @parsed if @parsed
51
+
52
+ begin
53
+ data = JSON.load( string )
54
+ return @parsed = data
55
+ rescue JSON::ParserError => e
56
+ end
57
+
58
+ begin
59
+ data = YAML::load( string )
60
+ return @parsed = data
61
+ rescue Psych::SyntaxError => e
62
+ end
63
+
64
+ begin
65
+ data = Kernel.eval( string )
66
+ return @parsed = data
67
+ rescue StandardError => e
68
+ end
69
+
70
+ raise ArgumentError, "Input was unparsable as JSON or YAML."
71
+ end
72
+
73
+ def string
74
+ return @string if @string
75
+
76
+ str = @instream.read
77
+
78
+ zstream = Zlib::Inflate.new
79
+ begin
80
+ buf = zstream.inflate(str)
81
+ zstream.finish
82
+ zstream.close
83
+
84
+ return @string = buf
85
+ rescue Exception => e
86
+ end
87
+
88
+ return @string = str
89
+ end
90
+
91
+ def close_streams
92
+ @instream.flush
93
+ @instream.close
94
+
95
+ @outstream.flush
96
+ @outstream.close
97
+ end
98
+
99
+ def self.from_cli( argv )
100
+ options = {
101
+ :instream => "-",
102
+ :outstream => "-",
103
+ :format => :yaml,
104
+ }
105
+
106
+ parser = OptionParser.new do |opts|
107
+ opts.banner = "Usage: sp [options]"
108
+
109
+ opts.on( "-i", "--input [instream]", "Input stream, one of: '-', 'STDIN', or a file name" ) do |instream|
110
+ options[:instream] = instream
111
+ end
112
+
113
+ opts.on( "-o", "--output [outstream]", "Output stream, one of: '-', 'STDOUT', 'STDERR' or a file name" ) do |outstream|
114
+ options[:outstream] = outstream
115
+ end
116
+
117
+ opts.on( "-f", "--format [format]", "Output format, one of: 'yaml', 'json', 'ruby', 'minjson'") do |format|
118
+ options[:format] = format.to_sym
119
+ end
120
+ end
121
+
122
+ parser.parse( argv )
123
+
124
+ return self.new( options )
125
+ end
126
+
127
+ private
128
+ def to_stream( input_output, maybe_stream )
129
+ case maybe_stream.downcase
130
+ when "stdin"
131
+ raise ArgumentError, "Output stream cannot be STDIN"
132
+ return STDIN
133
+ when "stdout"
134
+ raise ArgumentError, "Input stream cannot be STDOUT"
135
+ return STDOUT
136
+ when "stderr"
137
+ raise ArgumentError, "Input stream cannot be STDERR"
138
+ return STDERR
139
+ end
140
+
141
+ if maybe_stream == "-"
142
+ if input_output == :input
143
+ return STDIN
144
+ end
145
+
146
+ return STDOUT
147
+ end
148
+
149
+ mode = input_output == :input ? "r" : "w"
150
+ return File.open( maybe_stream, mode )
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,3 @@
1
+ module SoPretty
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,52 @@
1
+ lib_path = "./lib"
2
+ spec_path = "./spec"
3
+ bin_path = "./bin"
4
+
5
+ libs = Dir.glob("#{lib_path}/**/*.rb")
6
+ libs += Dir.glob("#{lib_path}/**/*.erb")
7
+
8
+ specs = Dir.glob("#{spec_path}/**/*.rb")
9
+ bins = Dir.glob("#{bin_path}/so-pretty")
10
+ bins += Dir.glob("#{bin_path}/sp")
11
+
12
+ flist = libs + specs + bins
13
+ flist << "so-pretty.gemspec"
14
+ flist << "README.md"
15
+
16
+ require_relative './lib/so-pretty/version'
17
+
18
+ summary = <<-EOD
19
+ A gem to pretty print anything. Currently supports input formats:
20
+
21
+ - ruby (.inspect formatted)
22
+ - yaml
23
+ - json
24
+
25
+ And will auto-detect input type, though you can force detection.
26
+
27
+ Outputs yaml by default, but can output ruby, yaml, or json. Input streams
28
+ or files may be compressed with zlib/deflate, however, gzip is not currently
29
+ supported.
30
+ EOD
31
+
32
+ Gem::Specification.new do |gem|
33
+ gem.name = "so-pretty"
34
+ gem.version = SoPretty::VERSION
35
+ gem.authors = ["Brett Nakashima"]
36
+ gem.email = ["brettnak@gmail.com"]
37
+ gem.summary = "SoPretty print anything"
38
+ gem.description = summary
39
+
40
+ # TODO: Rename this repo to match the gem name
41
+ gem.homepage = "http://gitlab.com/brettnak/pretty"
42
+
43
+ gem.files = flist
44
+ gem.executables = bins.map{ |f| File.basename(f) }
45
+ gem.test_files = specs
46
+ gem.require_paths = ["lib/"]
47
+
48
+ gem.add_development_dependency 'rspec', '~> 3.1'
49
+ gem.add_development_dependency 'awesome_print'
50
+
51
+ gem.license = "MIT"
52
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: so-pretty
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brett Nakashima
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-09-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: awesome_print
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: |
42
+ A gem to pretty print anything. Currently supports input formats:
43
+
44
+ - ruby (.inspect formatted)
45
+ - yaml
46
+ - json
47
+
48
+ And will auto-detect input type, though you can force detection.
49
+
50
+ Outputs yaml by default, but can output ruby, yaml, or json. Input streams
51
+ or files may be compressed with zlib/deflate, however, gzip is not currently
52
+ supported.
53
+ email:
54
+ - brettnak@gmail.com
55
+ executables:
56
+ - so-pretty
57
+ - sp
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - "./bin/so-pretty"
62
+ - "./bin/sp"
63
+ - "./lib/so-pretty.rb"
64
+ - "./lib/so-pretty/version.rb"
65
+ - README.md
66
+ - bin/so-pretty
67
+ - bin/sp
68
+ - so-pretty.gemspec
69
+ homepage: http://gitlab.com/brettnak/pretty
70
+ licenses:
71
+ - MIT
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib/
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 2.6.12
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: SoPretty print anything
93
+ test_files: []