diff_resource 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ad6f41ec3ad9423f89448b5333f72916e2e27e0
4
- data.tar.gz: f9ad3f44844d83f1095acfb24c203ccf18222a56
3
+ metadata.gz: f83a8b303a0e68fe400890c01806943b3e859e8c
4
+ data.tar.gz: 6c46fc4c27851bf2995a2a6914f43d0f99494562
5
5
  SHA512:
6
- metadata.gz: 74e7bec7cfd0aacc680d27636cdf55c5b8751fdc33da706a5afa45a3c025ae55e99b6a167f526a5ff615c01d60f74addc226763e300a72616f4d8a58ea1fc205
7
- data.tar.gz: daf3b517b903c5a03341b6748639085c318cfa05f2ac720a5a64f6fe8610efbab419592f51e7717bc629bfc2aee1c2ce12a248992c1b261ed0bde141f838202a
6
+ metadata.gz: d3bd3ef70dc9d71bbe7c0ea28b7a43d7c782ad32b65ba570a4c287e9965ecad6e1ccd6d7078659169d318c4f91d07678c85259a02ffaffa54b9d513d728889c1
7
+ data.tar.gz: a006e492731f9f5456ebf03b86a9db5fe77c82a3b98a9a0309c15254cc5328230e59e66f36388954ad0e4f7491a6d76f8129a7332248d7805932bfe8358df06f
data/README.md CHANGED
@@ -23,32 +23,106 @@ Or install it yourself as:
23
23
 
24
24
  ## Usage
25
25
 
26
- output your resource file's diff list, you execute under command
26
+ To output your resource file's diff list, you run under command.
27
27
 
28
28
  Usage:
29
29
  ```bash
30
- diff_resource create <directory> <comparison> <file> [<options>] -t, --type=TYPE
30
+ diff_resource create <directory> <comparison> <file> <type> [<options>]
31
31
  ```
32
32
 
33
33
  Options:
34
- - -t, --type=TYPE : resource file type
35
34
  - -o, [--output=OUTPUT] : output file path.
36
35
  - -c, [--compare=COMPARE] : comparison target type. other directory or git object
36
+ - -s, [--setting=SETTING] : setting file path
37
37
 
38
38
  Arguments:
39
39
  - directory: resource file root path
40
40
  - comparison: compare directory path or git hash
41
41
  - file: resource file name format ex) test.resource, \*.resource, \*-en.resource
42
+ - type: resource file type. you can set custom type in .diffresource.yml
42
43
 
44
+ You should run on git root directory when using git mode.
43
45
 
44
- Show detail, you execute under command
46
+ To show detail, you run under command.
45
47
  ```bash
46
48
  diff_resource help create
47
49
  ```
48
50
 
49
- ## Development
51
+ ## Settings File Format
50
52
 
51
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
53
+ To create custom resource type and set custom default option value, you create ".diffresource.yml" as the following.
54
+ ```yaml
55
+ types:
56
+ custom-resource : # custom resource type name
57
+ format: "xml" # file format. xml, json, yaml are enable value
58
+ root : "data" # resources object name. if object is nested, you set path split "."
59
+ key : "key" # resource name. * means resources object is hash
60
+ value : "value" # resource value
61
+
62
+ comparison: "dir" # custom comparison value
63
+
64
+ output: "./dir" # custom output value
65
+ ```
66
+
67
+ It is enable to parse like these format resources.
68
+
69
+ ```xml
70
+ <?xml version="1.0" encoding="utf-8"?>
71
+ <root>
72
+ <data key="string1">
73
+ <value>hello</value>
74
+ </data>
75
+ <data key="string2">
76
+ <value>hello hello</value>
77
+ </data>
78
+ </root>
79
+ ```
80
+
81
+ Case resources object is nested, you should set path split "." as the following.
82
+
83
+ ```yaml
84
+ types:
85
+ custom-resource :
86
+ format: "json"
87
+ root : "root.data"
88
+ key : "key"
89
+ value : "value"
90
+ ```
91
+
92
+ It is enable to parse like these format resources.
93
+ ```json
94
+ {
95
+ "root" :{
96
+ "data" : [
97
+ {
98
+ "key" : "string1",
99
+ "value" : "hello"
100
+ },
101
+ {
102
+ "key" : "string2",
103
+ "value" : "hello hello"
104
+ }
105
+ ]
106
+ }
107
+ }
108
+ ```
109
+
110
+ Case resources object is hash, you should set "\*" to key as the following.
111
+ ```yaml
112
+ types:
113
+ custom-resource :
114
+ format: "yaml"
115
+ root : "root.data"
116
+ key : "*"
117
+ ```
118
+
119
+ It is enable to parse like these format resources.
120
+ ```yaml
121
+ root:
122
+ data:
123
+ string1: "hello"
124
+ string2: "hello hello"
125
+ ```
52
126
 
53
127
  ## Contributing
54
128
 
@@ -10,18 +10,10 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["katsu.generation.888@gmail.com"]
11
11
 
12
12
  spec.summary = "Output resource file diffs"
13
- spec.description = "Output resource file diffs.You can set resource directory, resource type, output file path, etc..."
13
+ spec.description = "Output resource file diffs.You can output original format resource file diff"
14
14
  spec.homepage = "https://github.com/katsugeneration/diff-resource"
15
15
  spec.license = "MIT"
16
16
 
17
- # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
- # delete this section to allow pushing this gem to any host.
19
- if spec.respond_to?(:metadata)
20
- # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
- else
22
- raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
- end
24
-
25
17
  spec.files = `git ls-files -z`.split("\x0").reject do |file|
26
18
  file =~ %r{^(?:
27
19
  spec/.*
@@ -35,9 +27,12 @@ Gem::Specification.new do |spec|
35
27
  spec.bindir = "bin"
36
28
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
37
29
  spec.require_paths = ["lib"]
30
+ spec.required_ruby_version = "~> 2.0"
38
31
 
39
32
  spec.add_development_dependency "bundler"
40
33
  spec.add_development_dependency "rake", "~> 10.0"
41
34
  spec.add_development_dependency "rspec"
35
+
42
36
  spec.add_runtime_dependency "thor"
37
+ spec.add_runtime_dependency "xml-simple"
43
38
  end
data/lib/diff_resource.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "diff_resource/version"
2
2
 
3
+ require "diff_resource/inputer/inputer"
3
4
  require "diff_resource/inputer/directory_inputer"
4
5
  require "diff_resource/inputer/git_inputer"
5
6
 
@@ -8,7 +9,12 @@ require "diff_resource/outputer"
8
9
  require "diff_resource/comparer"
9
10
 
10
11
  require "diff_resource/parser/parser"
12
+ require "diff_resource/parser/xml_parser"
11
13
  require "diff_resource/parser/resx_parser"
14
+ require "diff_resource/parser/json_parser"
15
+ require "diff_resource/parser/yaml_parser"
16
+
17
+ require "diff_resource/settings.rb"
12
18
 
13
19
  require "diff_resource/factory/parser_factory"
14
20
  require "diff_resource/factory/inputer_factory"
@@ -2,34 +2,67 @@ require 'thor'
2
2
 
3
3
  module DiffResource
4
4
  class Cli < Thor
5
- desc "create <directory> <comparison> <file> [<options>]", <<-EOS
5
+ desc "create <directory> <comparison> <file> <type> [<options>]", <<-EOS
6
6
  create resource diff file
7
7
  - directory: resource file root path
8
8
  - comparison: compare directory path or git object
9
9
  - file: resource file name format
10
10
  ex) test.resource, *.resource, *-en.resource
11
+ - type: resource file type
12
+ you set custom type in .diffresource.yml
11
13
 
12
14
  EOS
13
- method_option :type, :aliases => "-t", :enum => %w(resx), :required => true, :desc => "resource file type"
14
- method_option :output, :aliases => "-o", :type => :string, :default => "./diffs.csv", :desc => "output file path."
15
- method_option :compare, :aliases => "-c", :enum => %w(dir git), :default => "dir", :desc => "comparison target type. other directory or git hash"
16
- def create target_dir = nil, comparison_target = nil, target_file = nil
17
- parser = DiffResource::ParserFactory.create options[:type]
15
+ method_option :output, :aliases => "-o", :type => :string, :desc => "output file path."
16
+ method_option :comparison, :aliases => "-c", :enum => %w(dir git), :desc => "comparison target type. other directory or git hash"
17
+ method_option :setting, :aliases => "-s", :default => "./.diffresource.yml", :desc => "setting file path"
18
+ def create target_dir = nil, comparison_target = nil, target_file = nil, target_type = nil
19
+ p target_type
20
+ option = DiffResource::Cli.make_options options, target_type
21
+
22
+ parser = DiffResource::ParserFactory.create option[:type]
18
23
  inputer = DiffResource::InputerFactory.create "dir"
19
- comparison_inputer = DiffResource::InputerFactory.create options[:compare]
24
+ comparison_inputer = DiffResource::InputerFactory.create option[:comparison]
20
25
 
21
- # when git pattern, comparison target is same to new resources and comprison_target is git object
22
- if options[:compare] == "git"
26
+ # in git mode, comparison dir is same to new resources and comprison_target is git object
27
+ if option[:comparison] == "git"
23
28
  comparison_inputer.reference = comparison_target
24
29
  comparison_target = target_dir
25
30
  end
26
31
 
27
32
  new_resources = inputer.parse_files target_dir, target_file, parser
28
33
  old_resources = comparison_inputer.parse_files comparison_target, target_file, parser
29
-
30
34
  comparer = DiffResource::Comparer.new new_resources, old_resources
35
+
31
36
  outputer = DiffResource::Outputer.new
32
- outputer.output comparer.diffs, options[:output]
37
+ outputer.output comparer.diffs, option[:output]
38
+ end
39
+
40
+ def self.load_settings file_name
41
+ begin
42
+ open file_name do |file|
43
+ return DiffResource::Settings.new file
44
+ end
45
+ rescue
46
+ return DiffResource::Settings.new ""
47
+ end
48
+ end
49
+
50
+ def self.add_resx_format settings
51
+ settings.types["resx"] = { "format" => "resx", "root" => "data", "key" => "name", "value" => "value" }
52
+ return settings
53
+ end
54
+
55
+ def self.make_options options, type
56
+ ret = {}
57
+
58
+ settings = DiffResource::Cli.load_settings options[:setting]
59
+ settings = DiffResource::Cli.add_resx_format settings
60
+
61
+ ret[:type] = settings.types[type]
62
+ ret[:comparison] = options[:comparison] || settings.comparison || "dir"
63
+ ret[:output] = options[:output] || settings.output || "./diffs.csv"
64
+
65
+ return ret
33
66
  end
34
67
  end
35
68
  end
@@ -2,9 +2,15 @@
2
2
  module DiffResource
3
3
  class ParserFactory
4
4
  def self.create type
5
- return case type
5
+ return case type["format"]
6
6
  when "resx"
7
7
  DiffResource::ResxParser.new
8
+ when "xml"
9
+ DiffResource::XmlParser.new
10
+ when "json"
11
+ DiffResource::JsonParser.new type
12
+ when "yaml"
13
+ DiffResource::YamlParser.new type
8
14
  else
9
15
  fail ArgumentError.new, 'undefined parser type'
10
16
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module DiffResource
3
- class DirectoryInputer
3
+ class DirectoryInputer < Inputer
4
4
  def parse_file file_name, parser
5
5
  ret = []
6
6
  begin
@@ -8,7 +8,7 @@ module DiffResource
8
8
  ret = parser.parse file.read
9
9
  end
10
10
  rescue => e
11
- p e.message
11
+ puts e.message
12
12
  end
13
13
 
14
14
  return ret
@@ -23,7 +23,7 @@ module DiffResource
23
23
  resources += parse_files File.absolute_path(file, path), extension, parser
24
24
  end
25
25
  elsif FileTest.file? path
26
- resources += parse_file path, parser if %r{^.*\/#{extension}$} =~ path
26
+ resources += parse_file path, parser if match? extension, path
27
27
  end
28
28
 
29
29
  return resources
@@ -1,6 +1,6 @@
1
-
1
+ require 'pathname'
2
2
  module DiffResource
3
- class GitInputer
3
+ class GitInputer < Inputer
4
4
  attr_accessor :reference
5
5
 
6
6
  def parse_file file_name, parser
@@ -13,14 +13,16 @@ module DiffResource
13
13
 
14
14
  def parse_files path, extension, parser
15
15
  resources = []
16
+ base = Pathname.getwd
16
17
 
17
18
  if directory? path
18
- contents = `git ls-tree --name-only #{reference}:#{path}`
19
+ contents = `git ls-tree --name-only #{reference}:#{path}` # ls-tree command bad work on non root dir
19
20
  contents.split("\n").each do |file|
20
- resources += parse_files (path + "/" + file), extension, parser
21
+ relative_file_path = Pathname(File.expand_path(file, path)).relative_path_from(base).to_s
22
+ resources += parse_files relative_file_path, extension, parser
21
23
  end
22
24
  elsif file? path
23
- resources += parse_file path, parser if %r{^.*\/#{extension}$} =~ path
25
+ resources += parse_file path, parser if match? extension, path
24
26
  end
25
27
 
26
28
  return resources
@@ -0,0 +1,8 @@
1
+
2
+ module DiffResource
3
+ class Inputer
4
+ def match? extension, path
5
+ return %r{^.*\/#{extension}$} =~ path
6
+ end
7
+ end
8
+ end
@@ -9,7 +9,7 @@ module DiffResource
9
9
  end
10
10
  end
11
11
  rescue => e
12
- p e.message
12
+ puts e.message
13
13
  end
14
14
  end
15
15
  end
@@ -0,0 +1,9 @@
1
+ require 'json'
2
+
3
+ module DiffResource
4
+ class JsonParser < Parser
5
+ def parse_string str
6
+ return JSON.parse str
7
+ end
8
+ end
9
+ end
@@ -3,7 +3,64 @@ module DiffResource
3
3
  class Parser
4
4
  @@resource = Struct.new "Resource", :key, :value
5
5
 
6
+ def initialize options = {}
7
+ @root = options["root"] || ""
8
+ @key = options["key"] || ""
9
+ @value = options["value"] || ""
10
+ end
11
+
12
+ def nested_hash_access hash, path
13
+ ret = hash
14
+ path.split(".").each do |symbol|
15
+ ret = ret[symbol]
16
+ end
17
+
18
+ return ret
19
+ end
20
+
6
21
  def parse str
22
+ ret = []
23
+ begin
24
+ obj = parse_string str
25
+ root = nested_hash_access obj, @root
26
+
27
+ ret = if @key == "*"
28
+ parse_hash root
29
+ else
30
+ parse_array root
31
+ end
32
+ rescue => e
33
+ puts e.message
34
+ end
35
+
36
+ return ret
37
+ end
38
+
39
+ def parse_array root
40
+ ret = []
41
+ root.each do |item|
42
+ next unless parsre_target? item
43
+ key = nested_hash_access item, @key
44
+ value = nested_hash_access item, @value
45
+ ret << @@resource.new(key, value)
46
+ end
47
+ return ret
48
+ end
49
+
50
+ def parse_hash root
51
+ ret = []
52
+ root.each do |key, value|
53
+ next unless parsre_target? key
54
+ ret << @@resource.new(key, value)
55
+ end
56
+ return ret
57
+ end
58
+
59
+ def parse_string str
60
+ end
61
+
62
+ def parsre_target? item
63
+ return true
7
64
  end
8
65
  end
9
66
  end
@@ -1,27 +1,12 @@
1
- require 'rexml/document'
2
1
 
3
2
  module DiffResource
4
- class ResxParser < Parser
5
- def parse str
6
- ret = []
7
- begin
8
- resx = REXML::Document.new str
9
-
10
- REXML::XPath.match(resx, "/root/data").map do |data|
11
- type = data.attribute("type")
12
- next unless type.nil?
13
-
14
- key = data.attribute("name").value
15
- value_element = data.elements["value"]
16
- value = value_element ? value_element.text : nil
17
-
18
- ret << @@resource.new(key, value)
19
- end
20
- rescue => e
21
- p e.message
22
- end
3
+ class ResxParser < XmlParser
4
+ def initialize
5
+ super({ "root" => "data", "key" => "name", "value" => "value" })
6
+ end
23
7
 
24
- return ret
8
+ def parsre_target? item
9
+ return nested_hash_access(item, "type").nil?
25
10
  end
26
11
  end
27
12
  end
@@ -0,0 +1,17 @@
1
+ require 'xmlsimple'
2
+
3
+ module DiffResource
4
+ class XmlParser < Parser
5
+ def parse str
6
+ ret = super str
7
+ ret.each do |item|
8
+ item.value = item.value[0]
9
+ end
10
+ return ret
11
+ end
12
+
13
+ def parse_string str
14
+ return XmlSimple.xml_in str
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ require 'yaml'
2
+
3
+ module DiffResource
4
+ class YamlParser < Parser
5
+ def parse_string str
6
+ return YAML.load str
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ require 'yaml'
2
+
3
+ module DiffResource
4
+ class Settings
5
+ def initialize str
6
+ @options = YAML.load(str)
7
+ @options = {} unless @options.class == Hash # @options is Hash object
8
+ @options["types"] = {} unless @options["types"].class == Hash # @options["types"] is Hash Object
9
+ end
10
+
11
+ def types
12
+ return self["types"]
13
+ end
14
+
15
+ def comparison
16
+ return self["comparison"]
17
+ end
18
+
19
+ def output
20
+ return self["output"]
21
+ end
22
+
23
+ def [] key
24
+ return @options[key]
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module DiffResource
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diff_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katsuya SHIMABUKURO
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-17 00:00:00.000000000 Z
11
+ date: 2016-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,8 +66,22 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description: Output resource file diffs.You can set resource directory, resource type,
70
- output file path, etc...
69
+ - !ruby/object:Gem::Dependency
70
+ name: xml-simple
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Output resource file diffs.You can output original format resource file
84
+ diff
71
85
  email:
72
86
  - katsu.generation.888@gmail.com
73
87
  executables:
@@ -87,9 +101,14 @@ files:
87
101
  - lib/diff_resource/factory/parser_factory.rb
88
102
  - lib/diff_resource/inputer/directory_inputer.rb
89
103
  - lib/diff_resource/inputer/git_inputer.rb
104
+ - lib/diff_resource/inputer/inputer.rb
90
105
  - lib/diff_resource/outputer.rb
106
+ - lib/diff_resource/parser/json_parser.rb
91
107
  - lib/diff_resource/parser/parser.rb
92
108
  - lib/diff_resource/parser/resx_parser.rb
109
+ - lib/diff_resource/parser/xml_parser.rb
110
+ - lib/diff_resource/parser/yaml_parser.rb
111
+ - lib/diff_resource/settings.rb
93
112
  - lib/diff_resource/version.rb
94
113
  homepage: https://github.com/katsugeneration/diff-resource
95
114
  licenses:
@@ -101,9 +120,9 @@ require_paths:
101
120
  - lib
102
121
  required_ruby_version: !ruby/object:Gem::Requirement
103
122
  requirements:
104
- - - ">="
123
+ - - "~>"
105
124
  - !ruby/object:Gem::Version
106
- version: '0'
125
+ version: '2.0'
107
126
  required_rubygems_version: !ruby/object:Gem::Requirement
108
127
  requirements:
109
128
  - - ">="