diff_resource 0.1.3 → 0.2.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.
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
  - - ">="