diffable_yaml 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9ede5b1945e4249a0b29dd466e7263ea5feb7b59
4
+ data.tar.gz: 93551e520ff49a88346cbd946e90a0e835ff5baf
5
+ SHA512:
6
+ metadata.gz: 89562fddf48689216c8345ba7fe9de12561d4192093cc4a48c128092e5f64b7d2a2ad326e3759cd0659b76cb397e8949a0380ed4538874a35d6b8ed2499cde80
7
+ data.tar.gz: dc21e0b117ba61aecb1b5b8fc8df406e0944a78d5d368d8b733f29e498321e4d1ef2c1219e6e0f228393b9360f7fb7e229d1487fcd0aa8bf4387d15a08cd85c1
data/.gitignore ADDED
@@ -0,0 +1,34 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /lib/bundler/man/
26
+
27
+ # for a library or gem, you might want to ignore these files since the code is
28
+ # intended to run in multiple environments; otherwise, check them in:
29
+ Gemfile.lock
30
+ .ruby-version
31
+ .ruby-gemset
32
+
33
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
34
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in diffable_yaml.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ Copyright (c) 2015, nrser
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ * Neither the name of DiffableYAML nor the names of its
15
+ contributors may be used to endorse or promote products derived from
16
+ this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # DiffableYAML
2
+ dump YAML in Ruby with hash keys ordered to make text diffs easier
data/Rakefile ADDED
@@ -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,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'diffable_yaml/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'diffable_yaml'
8
+ spec.version = DiffableYAML::VERSION
9
+ spec.authors = ["nrser"]
10
+ spec.email = 'neil@ztkae.com'
11
+ spec.summary = "dump YAML in Ruby with hash keys ordered to make text diffs easier"
12
+ spec.description = <<-EOS
13
+ this is a little chunck of code i use to dump Ruby objects to YAML with Hash
14
+ keys in a some-what consistent order.
15
+
16
+ i do this because i often find myself using YAML files as data storage and
17
+ this makes it a lot easier to compare versions with text-based diff toolspec.
18
+
19
+ this lib is horribly alpha and has no tests what-so-ever. i'm sure it's
20
+ as full or bugs and bad ideas as 100 lines of code can be. i just put it
21
+ here so it's easier for me to use across projectspec. but you're welcome
22
+ to take it for a spin too if you really want.
23
+
24
+ this relies on Psych internals, so it has a dependency on pysch ~> 2.0.
25
+ it might work fine with other versions; that's just all i've tested it
26
+ against at the moment.
27
+ EOS
28
+ spec.homepage = 'https://github.com/nrser/DiffableYAML'
29
+ spec.license = 'BSD'
30
+
31
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
32
+ spec.bindir = "exe"
33
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
34
+ spec.require_paths = ["lib"]
35
+
36
+ spec.add_dependency 'psych', '~> 2.0'
37
+
38
+ spec.add_development_dependency "bundler", "~> 1.5"
39
+ spec.add_development_dependency "rake"
40
+ end
@@ -0,0 +1,3 @@
1
+ module DiffableYAML
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,105 @@
1
+ require 'psych'
2
+
3
+ require 'diffable_yaml/version'
4
+
5
+ module DiffableYAML
6
+ # this dumps YAML with hashes / dicts in a consistent order so that
7
+ # text diffs make more sense
8
+ class DiffableYAMLTree < Psych::Visitors::YAMLTree
9
+ def self.create options = {}, emitter = nil
10
+ preorder = options.delete(:preorder) || []
11
+ instance = Psych::Visitors::YAMLTree.create options, emitter
12
+ instance.instance_variable_set '@preorder', preorder
13
+ instance
14
+ end
15
+
16
+ def visit_Hash o
17
+ tag = o.class == ::Hash ? nil : "!ruby/hash:#{o.class}"
18
+ implicit = !tag
19
+
20
+ register(o, @emitter.start_mapping( nil,
21
+ tag,
22
+ implicit,
23
+ Psych::Nodes::Mapping::BLOCK))
24
+
25
+ @preorder.each do |key|
26
+ if o.key? key
27
+ accept key
28
+ accept o[key]
29
+ end
30
+ end
31
+ o.keys.map {|k|
32
+ [k, k.to_s]
33
+ }.sort {|(k_a, s_a), (k_b, s_b)|
34
+ s_a <=> s_b
35
+ }.each do |k, s|
36
+ unless @preorder.include? k
37
+ accept k
38
+ accept o[k]
39
+ end
40
+ end
41
+
42
+ @emitter.end_mapping
43
+ end
44
+
45
+ def visit_String o
46
+ plain = false
47
+ quote = false
48
+ style = Psych::Nodes::Scalar::ANY
49
+
50
+ if binary?(o)
51
+ str = [o].pack('m').chomp
52
+ tag = '!binary' # FIXME: change to below when syck is removed
53
+ #tag = 'tag:yaml.org,2002:binary'
54
+ style = Psych::Nodes::Scalar::LITERAL
55
+ else
56
+ str = o
57
+ tag = nil
58
+ quote = !(String === @ss.tokenize(o))
59
+ plain = !quote
60
+ if str.index("\n")
61
+ style = Psych::Nodes::Scalar::LITERAL
62
+ end
63
+ end
64
+
65
+ ivars = find_ivars o
66
+
67
+ if ivars.empty?
68
+ unless o.class == ::String
69
+ tag = "!ruby/string:#{o.class}"
70
+ end
71
+ @emitter.scalar str, nil, tag, plain, quote, style
72
+ else
73
+ maptag = '!ruby/string'
74
+ maptag << ":#{o.class}" unless o.class == ::String
75
+
76
+ register o, @emitter.start_mapping( nil,
77
+ maptag,
78
+ false,
79
+ Pysch::Nodes::Mapping::BLOCK)
80
+ @emitter.scalar 'str',
81
+ nil,
82
+ nil,
83
+ true,
84
+ false,
85
+ Psych::Nodes::Scalar::ANY
86
+ @emitter.scalar str, nil, tag, plain, quote, style
87
+
88
+ dump_ivars o
89
+
90
+ @emitter.end_mapping
91
+ end
92
+ end
93
+ end
94
+
95
+ def self.dump(o, io = nil, options = {})
96
+ if Hash === io
97
+ options = io
98
+ io = nil
99
+ end
100
+
101
+ visitor = DiffableYAMLTree.create options
102
+ visitor << o
103
+ visitor.tree.yaml io, options
104
+ end
105
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: diffable_yaml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - nrser
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-10-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: psych
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
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
+ description: "this is a little chunck of code i use to dump Ruby objects to YAML with
56
+ Hash\nkeys in a some-what consistent order.\n\ni do this because i often find myself
57
+ using YAML files as data storage and \nthis makes it a lot easier to compare versions
58
+ with text-based diff toolspec.\n\nthis lib is horribly alpha and has no tests what-so-ever.
59
+ i'm sure it's\nas full or bugs and bad ideas as 100 lines of code can be. i just
60
+ put it\nhere so it's easier for me to use across projectspec. but you're welcome\nto
61
+ take it for a spin too if you really want.\n\nthis relies on Psych internals, so
62
+ it has a dependency on pysch ~> 2.0.\nit might work fine with other versions; that's
63
+ just all i've tested it\nagainst at the moment.\n"
64
+ email: neil@ztkae.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - ".gitignore"
70
+ - Gemfile
71
+ - LICENSE
72
+ - README.md
73
+ - Rakefile
74
+ - diffable_yaml.gemspec
75
+ - lib/diffable_yaml.rb
76
+ - lib/diffable_yaml/version.rb
77
+ homepage: https://github.com/nrser/DiffableYAML
78
+ licenses:
79
+ - BSD
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.2.2
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: dump YAML in Ruby with hash keys ordered to make text diffs easier
101
+ test_files: []