sugoi_pretty_json 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9eda89c65064b0cab850c65248a31ae67839f482
4
+ data.tar.gz: e2190c3c2a59bb272a8ddf4868f10fd02ca6ab24
5
+ SHA512:
6
+ metadata.gz: dc8c71f07f36d1c576c189a3e7acfbb2d1bb1c98f639b94b2b0369aec23c4c3020ae7385df6838f6649416bc7e1808a8535e3595427c81cff400acdb44ce432e
7
+ data.tar.gz: 08f93deaa7c855fb89561050750579fcefa46c64fbc5620926cf6a103e3ed66e8fd5ca38126c03e68bcf3de071004c07792d6fe4d242246e7f69a10279b5fe83
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.2.0
5
+ before_install: gem install bundler -v 1.13.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sugoi_pretty_print_log.gemspec
4
+ gemspec
@@ -0,0 +1,70 @@
1
+ # SugoiPrettyJSON
2
+ This gem print pretty log for JSON.
3
+
4
+ ## Requirements
5
+ * ruby >= 2.1.0
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'sugoi_pretty_json'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install sugoi_pretty_json
22
+
23
+ ## Usage
24
+ ```ruby
25
+ require "sugoi_pretty_json"
26
+
27
+ log = '{"sid":"5a4d","uid":"","dev":"s","messages":["Started GET \"/facilities/show_afte\" for 127.0.0.1 at 2016-08-06 23:59:59 +0900","Processing by FacilitiesController#show_after as */*"," Parameters: {\"q\"=>{\"0\"=>{\"id\"=>\"175\", \"type\"=>\"Facility\", \"css\"=>\"c-btn__favorite p-faci__btn__favorite\"}, \"1\"=>{\"id\"=>\"13452\", \"type\"=>\"Experience\"}, \"2\"=>{\"id\"=>\"6387\", \"type\"=>\"Note\", \"css\"=>\"c-btn__favorite\"}, \"3\"=>{\"id\"=>\"5881\", \"type\"=>\"Note\", \"css\"=>\"c-btn__favorite\"}}}","Completed 200 OK in 20ms (Views: 0.3ms | ActiveRecord: 3.7ms | Solr: 0.0ms)"],"level":"INFO","mt":"GET","pt":"/main","ip":"127.0.0.1","ua":"Mozilla/5.0 (Linux; Android 4.1.2; SO-04E Build/10.1.1.D.2.31) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36","rf":"http://localhost/175"}'
28
+
29
+ hash = SugoiPrettyJSON.parse(log, only: ['IP Address', 'user_agent', 'params']) do |pretty_json|
30
+ pretty_json.parse_user_agent(json_key: 'ua') do |p|
31
+ p.name = 'user_agent'
32
+ end
33
+ pretty_json.parse_string(json_key: 'messages') do |p|
34
+ p.name = 'IP Address'
35
+ p.source = /for (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) at/
36
+ end
37
+ pretty_json.parse_hash(json_key: 'messages') do |p|
38
+ p.name = 'params'
39
+ p.source = /Parameters: (.*)/m
40
+ end
41
+ end
42
+
43
+ ap hash
44
+ # {
45
+ # "user_agent" => "Chrome Mobile 52.0.2743.98",
46
+ # "params" => {
47
+ # "q" => {
48
+ # "0" => {
49
+ # "id" => "175",
50
+ # "type" => "Facility",
51
+ # "css" => "c-btn__favorite p-faci__btn__favorite"
52
+ # },
53
+ # "1" => {
54
+ # "id" => "13452",
55
+ # "type" => "Experience"
56
+ # },
57
+ # "2" => {
58
+ # "id" => "6387",
59
+ # "type" => "Note",
60
+ # "css" => "c-btn__favorite"
61
+ # },
62
+ # "3" => {
63
+ # "id" => "5881",
64
+ # "type" => "Note",
65
+ # "css" => "c-btn__favorite"
66
+ # }
67
+ # }
68
+ # },
69
+ # "IP Address" => "127.0.0.1"
70
+ # }
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "sugoi_pretty_json"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,75 @@
1
+ require "sugoi_pretty_json/version"
2
+ require "sugoi_pretty_json/sugoi_json"
3
+ require "awesome_print"
4
+ require "user_agent_parser"
5
+ require "json"
6
+
7
+ module SugoiPrettyJSON
8
+ def self.parse(log, options = {})
9
+ parser = Parser.new(log, options)
10
+ if block_given?
11
+ yield(parser)
12
+ end
13
+ parser.parse
14
+ end
15
+
16
+ class ParsedMember
17
+ attr_accessor :name, :source
18
+ attr_reader :json_key
19
+
20
+ def initialize(json_key)
21
+ @json_key = json_key.to_s
22
+ end
23
+ end
24
+
25
+ class Parser
26
+ def initialize(log, options)
27
+ @log = log.strip
28
+ if options[:user_agent]
29
+ parse_user_agent(json_key: options[:user_agent])
30
+ end
31
+ @parsed_hash_members = []
32
+ @parsed_string_members = []
33
+ @assigned_option_only = options[:only] || []
34
+ end
35
+
36
+ def parse
37
+ json = SugoiJSON.new(@log)
38
+ json.parse_user_agent!(@user_agent_member)
39
+ json.parse_hash!(@parsed_hash_members)
40
+ json.parse_string!(@parsed_string_members)
41
+ json.slice_only_option!(build_option_only)
42
+ json.to_hash
43
+ end
44
+
45
+ def parse_string(json_key: )
46
+ parsed_member = ParsedMember.new(json_key)
47
+ yield(parsed_member)
48
+ @parsed_string_members << parsed_member
49
+ end
50
+
51
+ def parse_hash(json_key: )
52
+ parsed_member = ParsedMember.new(json_key)
53
+ yield(parsed_member)
54
+ @parsed_hash_members << parsed_member
55
+ end
56
+
57
+ def parse_user_agent(json_key: )
58
+ parsed_member = ParsedMember.new(json_key)
59
+ yield(parsed_member) if block_given?
60
+ parsed_member.name ||= 'user_agent'
61
+ @user_agent_member = parsed_member
62
+ end
63
+
64
+ private
65
+
66
+ def build_option_only
67
+ return if @assigned_option_only.empty?
68
+ only = []
69
+ only.concat(@assigned_option_only)
70
+ only << @user_agent_member.name if @user_agent_member
71
+ @parsed_hash_members.each { |member| only << member.name }
72
+ only
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,71 @@
1
+ module SugoiPrettyJSON
2
+ class HashPaser
3
+ def self.parse(string)
4
+ string.gsub!('=>', ':')
5
+ string.gsub!(/\r|\n/, '')
6
+ JSON.parse(string)
7
+ end
8
+ end
9
+
10
+ class SugoiJSON
11
+ def initialize(log)
12
+ unless json?
13
+ raise(JSON::ParserError, 'not json')
14
+ end
15
+ @json = JSON.parse(log)
16
+ # 意味ある?
17
+ # rescue JSON::ParserError
18
+ # puts '@@@@ done eval @@@@'
19
+ # JSON.parse(eval(@log).to_json)
20
+ end
21
+
22
+ def to_hash
23
+ @json
24
+ end
25
+
26
+ def parse_user_agent!(user_agent_member)
27
+ if user_agent_member
28
+ @json[user_agent_member.name] =
29
+ UserAgentParser.parse(@json[user_agent_member.json_key]).to_s
30
+ end
31
+ end
32
+
33
+ def parse_string!(parsed_members)
34
+ parse(parsed_members, type: :string)
35
+ end
36
+
37
+ def parse_hash!(parsed_members)
38
+ parse(parsed_members, type: :hash)
39
+ end
40
+
41
+ def slice_only_option!(option_only)
42
+ return unless option_only
43
+ @json.each do |key, value|
44
+ @json.delete_if { |key, value| !option_only.include?(key) }
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def json?
51
+ true
52
+ end
53
+
54
+ def parse(parsed_members, type: )
55
+ parsed_members.each do |parsed_member|
56
+ object = @json[parsed_member.json_key]
57
+ case object
58
+ when Array
59
+ object.each { |item| set_json(parsed_member, item, @json, type) }
60
+ when String
61
+ set_json(parsed_member, object, @json, type)
62
+ end
63
+ end
64
+ end
65
+
66
+ def set_json(parsed_member, object, json, type)
67
+ (parsed_member.source =~ object) || return
68
+ @json[parsed_member.name] = (type == :hash ? HashPaser.parse($1) : $1)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,3 @@
1
+ module SugoiPrettyJSON
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'sugoi_pretty_json/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "sugoi_pretty_json"
7
+ spec.version = SugoiPrettyJSON::VERSION
8
+ spec.authors = ["jiikko"]
9
+ spec.email = ["n905i.1214@gmail.com"]
10
+
11
+ spec.summary = %q{pretty print log.}
12
+ spec.description = spec.summary
13
+ spec.homepage = "https://github.com/jiikko/sugoi_pretty_json"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "awesome_print"
23
+ spec.add_dependency "user_agent_parser"
24
+
25
+ spec.add_development_dependency "bundler"
26
+ spec.add_development_dependency "rake"
27
+ spec.add_development_dependency "rspec"
28
+ spec.add_development_dependency "pry"
29
+ end
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sugoi_pretty_json
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - jiikko
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-10-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: awesome_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: user_agent_parser
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
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: pretty print log.
98
+ email:
99
+ - n905i.1214@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - README.md
109
+ - Rakefile
110
+ - bin/console
111
+ - bin/setup
112
+ - lib/sugoi_pretty_json.rb
113
+ - lib/sugoi_pretty_json/sugoi_json.rb
114
+ - lib/sugoi_pretty_json/version.rb
115
+ - sugoi_pretty_log.gemspec
116
+ homepage: https://github.com/jiikko/sugoi_pretty_json
117
+ licenses: []
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubyforge_project:
135
+ rubygems_version: 2.2.0
136
+ signing_key:
137
+ specification_version: 4
138
+ summary: pretty print log.
139
+ test_files: []