cheeba 1.0.4

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.
Files changed (95) hide show
  1. data/.git/COMMIT_EDITMSG +1 -0
  2. data/.git/HEAD +1 -0
  3. data/.git/config +9 -0
  4. data/.git/description +1 -0
  5. data/.git/hooks/applypatch-msg.sample +15 -0
  6. data/.git/hooks/commit-msg.sample +24 -0
  7. data/.git/hooks/post-commit.sample +8 -0
  8. data/.git/hooks/post-receive.sample +15 -0
  9. data/.git/hooks/post-update.sample +8 -0
  10. data/.git/hooks/pre-applypatch.sample +14 -0
  11. data/.git/hooks/pre-commit.sample +18 -0
  12. data/.git/hooks/pre-rebase.sample +169 -0
  13. data/.git/hooks/prepare-commit-msg.sample +36 -0
  14. data/.git/hooks/update.sample +107 -0
  15. data/.git/index +0 -0
  16. data/.git/info/exclude +7 -0
  17. data/.git/logs/HEAD +7 -0
  18. data/.git/logs/refs/heads/master +6 -0
  19. data/.git/logs/refs/remotes/origin/master +6 -0
  20. data/.git/objects/02/38dae53aee5cb4ea157a3f036b93868ede9593 +0 -0
  21. data/.git/objects/02/9cafaafb83e528381f0f2f02c6f23799bd1942 +0 -0
  22. data/.git/objects/07/c654f9ff6c65626369b061c595be42ccdd6cd7 +0 -0
  23. data/.git/objects/07/dbbace3b24b2d635d2fb637581931d573fc75c +0 -0
  24. data/.git/objects/08/ce1195151ff5a51573a871947ecd913fb5aa0f +1 -0
  25. data/.git/objects/0c/ad63d44505490e1a30ad075099a25020d7a7c5 +0 -0
  26. data/.git/objects/12/215629eba6a8f0fcd849923e98a471984521e1 +2 -0
  27. data/.git/objects/18/60fee2fadb59a6cbcb7f7dd0a6f6dc3b56ac79 +0 -0
  28. data/.git/objects/1e/1800628b80bef5a8043e4adacd6ebc6bab9aa1 +0 -0
  29. data/.git/objects/27/97bc2b3d72dc6d77b7bd07f1cca96f7e06b4ed +0 -0
  30. data/.git/objects/28/41d3f97c8aa8c942a613e1c69ed4280d78cf0a +0 -0
  31. data/.git/objects/29/f0c4074f9ecc894edd7ed507a1a92499838a6d +0 -0
  32. data/.git/objects/2a/8948661c63f2bef24f330638d239c88d5d0c2e +0 -0
  33. data/.git/objects/3f/7142cf3878c65e71b54d3572d82837d20f2aa7 +4 -0
  34. data/.git/objects/40/8c36a3103bc77e90db86dc06b1598e3baa4c2d +0 -0
  35. data/.git/objects/42/eb5558727a2144e7c5e997d3e6aea5486eaf37 +0 -0
  36. data/.git/objects/4c/6098fe05db7126c8a3c97f463910e5cc398630 +0 -0
  37. data/.git/objects/51/6902dffff8d29fa2f89979b9cd81ab275e1c67 +0 -0
  38. data/.git/objects/5b/502f8e20a0556c22727b504108a2dc36d7cbed +2 -0
  39. data/.git/objects/67/c3fb20cfae5320d83c9ebf2b85c1a3ef9b706b +0 -0
  40. data/.git/objects/72/7df703ac52c4ff97aa452feee27b9990430a11 +5 -0
  41. data/.git/objects/74/bc14252b2148d11877025d7f445d2fa686e7e9 +0 -0
  42. data/.git/objects/78/9ac5e1ca6a70ec3b8a11344e6f4a03e440f309 +0 -0
  43. data/.git/objects/7a/46bd1887d1a793094da678ded3b53b0208b826 +0 -0
  44. data/.git/objects/8d/77306c0d13e98da74ddf48002674fced7e1618 +2 -0
  45. data/.git/objects/94/36859cb89dd0bbddab77ed0810860e979b1c05 +0 -0
  46. data/.git/objects/ab/454c9537f329aecaedae0586c6d61146a7f819 +0 -0
  47. data/.git/objects/b9/3b5dde3104bb495dc0d2970bbe617dafb2f084 +0 -0
  48. data/.git/objects/be/197d3b2c14a52300cc4553bf2004ef3c45a45b +0 -0
  49. data/.git/objects/be/8e3e0ab878ffcb0456ae4cf66861888d933bf5 +0 -0
  50. data/.git/objects/c5/4c515f4bff81e08b01176b1a5743fd773a9740 +0 -0
  51. data/.git/objects/d4/a471f188d32adfa9dc2ff22c53b95319a162ed +0 -0
  52. data/.git/objects/d7/83399b37ca769b5b5bc2b33727fc47acfa5e4c +0 -0
  53. data/.git/objects/d7/a544fc5715014ef027875545ef0145e9f694fe +0 -0
  54. data/.git/objects/de/eef72f84f60beab439c58d84acc42d3e5a1279 +0 -0
  55. data/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  56. data/.git/objects/e9/9c40e89cb90f8067f99d7051c3bebf2b145ec7 +0 -0
  57. data/.git/objects/f3/89737a46e7cad94deb222e238e8f926767637e +0 -0
  58. data/.git/objects/fa/4f98b2fe387e262f9c28011e53f1b8fb920401 +0 -0
  59. data/.git/objects/fb/72047097c38625f3598fb348b3fbe75afd6d2d +1 -0
  60. data/.git/objects/ff/7aefe3472c61b77f58669ec4b8208412156930 +0 -0
  61. data/.git/refs/heads/master +1 -0
  62. data/.git/refs/remotes/origin/master +1 -0
  63. data/History.txt +6 -0
  64. data/Manifest.txt +94 -0
  65. data/README.txt +35 -0
  66. data/Rakefile +13 -0
  67. data/bin/cheeba +68 -0
  68. data/cheeba.gemspec +37 -0
  69. data/lib/cheeba/defaults.rb +78 -0
  70. data/lib/cheeba/errors.rb +10 -0
  71. data/lib/cheeba/indicators.rb +25 -0
  72. data/lib/cheeba/reader/builder.rb +265 -0
  73. data/lib/cheeba/reader/format.rb +130 -0
  74. data/lib/cheeba/reader/node.rb +61 -0
  75. data/lib/cheeba/reader/parser.rb +64 -0
  76. data/lib/cheeba/reader.rb +33 -0
  77. data/lib/cheeba/version.rb +3 -0
  78. data/lib/cheeba/writer/builder.rb +95 -0
  79. data/lib/cheeba/writer.rb +49 -0
  80. data/lib/cheeba.rb +50 -0
  81. data/test/files/arrays.cash +15 -0
  82. data/test/files/blank.cash +0 -0
  83. data/test/files/comments.cash +17 -0
  84. data/test/files/hashes.cash +26 -0
  85. data/test/files/malformed.cash +3 -0
  86. data/test/files/mixed.cash +12 -0
  87. data/test/files/split.cash +9 -0
  88. data/test/test_cheeba.rb +185 -0
  89. data/test/test_reader.rb +210 -0
  90. data/test/test_reader_builder.rb +345 -0
  91. data/test/test_reader_format.rb +406 -0
  92. data/test/test_reader_parser.rb +190 -0
  93. data/test/test_writer.rb +133 -0
  94. data/test/test_writer_builder.rb +150 -0
  95. metadata +167 -0
data/Manifest.txt ADDED
@@ -0,0 +1,94 @@
1
+ .git/COMMIT_EDITMSG
2
+ .git/HEAD
3
+ .git/config
4
+ .git/description
5
+ .git/hooks/applypatch-msg.sample
6
+ .git/hooks/commit-msg.sample
7
+ .git/hooks/post-commit.sample
8
+ .git/hooks/post-receive.sample
9
+ .git/hooks/post-update.sample
10
+ .git/hooks/pre-applypatch.sample
11
+ .git/hooks/pre-commit.sample
12
+ .git/hooks/pre-rebase.sample
13
+ .git/hooks/prepare-commit-msg.sample
14
+ .git/hooks/update.sample
15
+ .git/index
16
+ .git/info/exclude
17
+ .git/logs/HEAD
18
+ .git/logs/refs/heads/master
19
+ .git/logs/refs/remotes/origin/master
20
+ .git/objects/02/38dae53aee5cb4ea157a3f036b93868ede9593
21
+ .git/objects/02/9cafaafb83e528381f0f2f02c6f23799bd1942
22
+ .git/objects/07/c654f9ff6c65626369b061c595be42ccdd6cd7
23
+ .git/objects/07/dbbace3b24b2d635d2fb637581931d573fc75c
24
+ .git/objects/08/ce1195151ff5a51573a871947ecd913fb5aa0f
25
+ .git/objects/0c/ad63d44505490e1a30ad075099a25020d7a7c5
26
+ .git/objects/12/215629eba6a8f0fcd849923e98a471984521e1
27
+ .git/objects/18/60fee2fadb59a6cbcb7f7dd0a6f6dc3b56ac79
28
+ .git/objects/1e/1800628b80bef5a8043e4adacd6ebc6bab9aa1
29
+ .git/objects/27/97bc2b3d72dc6d77b7bd07f1cca96f7e06b4ed
30
+ .git/objects/28/41d3f97c8aa8c942a613e1c69ed4280d78cf0a
31
+ .git/objects/29/f0c4074f9ecc894edd7ed507a1a92499838a6d
32
+ .git/objects/2a/8948661c63f2bef24f330638d239c88d5d0c2e
33
+ .git/objects/3f/7142cf3878c65e71b54d3572d82837d20f2aa7
34
+ .git/objects/40/8c36a3103bc77e90db86dc06b1598e3baa4c2d
35
+ .git/objects/42/eb5558727a2144e7c5e997d3e6aea5486eaf37
36
+ .git/objects/4c/6098fe05db7126c8a3c97f463910e5cc398630
37
+ .git/objects/51/6902dffff8d29fa2f89979b9cd81ab275e1c67
38
+ .git/objects/5b/502f8e20a0556c22727b504108a2dc36d7cbed
39
+ .git/objects/67/c3fb20cfae5320d83c9ebf2b85c1a3ef9b706b
40
+ .git/objects/72/7df703ac52c4ff97aa452feee27b9990430a11
41
+ .git/objects/74/bc14252b2148d11877025d7f445d2fa686e7e9
42
+ .git/objects/78/9ac5e1ca6a70ec3b8a11344e6f4a03e440f309
43
+ .git/objects/7a/46bd1887d1a793094da678ded3b53b0208b826
44
+ .git/objects/8d/77306c0d13e98da74ddf48002674fced7e1618
45
+ .git/objects/94/36859cb89dd0bbddab77ed0810860e979b1c05
46
+ .git/objects/ab/454c9537f329aecaedae0586c6d61146a7f819
47
+ .git/objects/b9/3b5dde3104bb495dc0d2970bbe617dafb2f084
48
+ .git/objects/be/197d3b2c14a52300cc4553bf2004ef3c45a45b
49
+ .git/objects/be/8e3e0ab878ffcb0456ae4cf66861888d933bf5
50
+ .git/objects/c5/4c515f4bff81e08b01176b1a5743fd773a9740
51
+ .git/objects/d4/a471f188d32adfa9dc2ff22c53b95319a162ed
52
+ .git/objects/d7/83399b37ca769b5b5bc2b33727fc47acfa5e4c
53
+ .git/objects/d7/a544fc5715014ef027875545ef0145e9f694fe
54
+ .git/objects/de/eef72f84f60beab439c58d84acc42d3e5a1279
55
+ .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
56
+ .git/objects/e9/9c40e89cb90f8067f99d7051c3bebf2b145ec7
57
+ .git/objects/f3/89737a46e7cad94deb222e238e8f926767637e
58
+ .git/objects/fa/4f98b2fe387e262f9c28011e53f1b8fb920401
59
+ .git/objects/fb/72047097c38625f3598fb348b3fbe75afd6d2d
60
+ .git/objects/ff/7aefe3472c61b77f58669ec4b8208412156930
61
+ .git/refs/heads/master
62
+ .git/refs/remotes/origin/master
63
+ History.txt
64
+ Manifest.txt
65
+ README.txt
66
+ Rakefile
67
+ bin/cheeba
68
+ cheeba.gemspec
69
+ lib/cheeba.rb
70
+ lib/cheeba/defaults.rb
71
+ lib/cheeba/errors.rb
72
+ lib/cheeba/indicators.rb
73
+ lib/cheeba/reader.rb
74
+ lib/cheeba/reader/builder.rb
75
+ lib/cheeba/reader/format.rb
76
+ lib/cheeba/reader/node.rb
77
+ lib/cheeba/reader/parser.rb
78
+ lib/cheeba/version.rb
79
+ lib/cheeba/writer.rb
80
+ lib/cheeba/writer/builder.rb
81
+ test/files/arrays.cash
82
+ test/files/blank.cash
83
+ test/files/comments.cash
84
+ test/files/hashes.cash
85
+ test/files/malformed.cash
86
+ test/files/mixed.cash
87
+ test/files/split.cash
88
+ test/test_cheeba.rb
89
+ test/test_reader.rb
90
+ test/test_reader_builder.rb
91
+ test/test_reader_format.rb
92
+ test/test_reader_parser.rb
93
+ test/test_writer.rb
94
+ test/test_writer_builder.rb
data/README.txt ADDED
@@ -0,0 +1,35 @@
1
+ = Cheeba
2
+
3
+ * http://github.com/awesome/cheeba/tree/master
4
+ * http://wiki.github.com/awesome/cheeba
5
+ * http://awesomelicense.com
6
+ * http://seattlerb.org
7
+ * http://awesome.lighthouseapp.com/projects/23787-cheeba/
8
+
9
+ == DESCRIPTION:
10
+
11
+ Simple data serialization serialization for only the Ruby Programming Language.
12
+
13
+ == FEATURES/PROBLEMS:
14
+
15
+ * FIX (list of features or problems)
16
+
17
+ == SYNOPSIS:
18
+
19
+ * FIX (code sample of usage)
20
+
21
+ == REQUIREMENTS:
22
+
23
+ * FIX (list of requirements)
24
+
25
+ == INSTALL:
26
+
27
+ sudo gem install cheeba
28
+
29
+ == LICENSE:
30
+
31
+ (The Awesome License)
32
+
33
+ Copyright (c) 2008 So Awesome Man
34
+
35
+ Awesome License (Open Source) goes here!
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ $:.unshift File.join(File.dirname(__FILE__), 'lib')
6
+ require 'cheeba'
7
+
8
+ require './lib/cheeba.rb'
9
+ Hoe.new('cheeba', Cheeba::VERSION) do |p|
10
+ p.developer('So Awesome Man', 'callme@1800AWESO.ME')
11
+ end
12
+
13
+ # vim: syntax=Ruby
data/bin/cheeba ADDED
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'optparse'
4
+ require 'pp'
5
+
6
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
7
+ require 'cheeba'
8
+
9
+ module CheebaOpt
10
+ DESC = Cheeba::Defaults.descriptions
11
+ def self.command
12
+ hsh = {}
13
+ hsh[:opt] = {}
14
+ ops = nil
15
+ OptionParser.new do |opts|
16
+ opts.banner = "Cheeba #{Cheeba::VERSION}"
17
+ opts.on("-r", "--read FILENAME", String, String, ".cash file to Ruby Hash or Array") do |x|
18
+ hsh[:cmd] = 1
19
+ hsh[:arg] = [x]
20
+ end
21
+
22
+ opts.on("-w", "--write FILENAME,FILENAME", Array, "Hash or Array => .cash file") do |x|
23
+ hsh[:cmd] = 2
24
+ hsh[:arg] = x
25
+ end
26
+
27
+ opts.on("-d", "--dotfile [HOME]", String, "Create .cheeba dotfile") do |x|
28
+ x.nil? ? (y = Cheeba.dotfile) : (y = Cheeba.dotfile(x))
29
+ z = "#{File.dirname(y).chomp("/")}/.cheeba"
30
+ puts "existed: #{z}, moved to: #{y}" if File.basename(y) != ".cheeba"
31
+ puts "created: #{z}"
32
+ return
33
+ end
34
+
35
+ opts.on("-v", "--version", "Display verison number") do
36
+ STDOUT.write("Cheeba #{Cheeba::VERSION}\n\r")
37
+ return
38
+ end
39
+
40
+ opts.on("-h", "--help", "Show this message") do
41
+ puts opts
42
+ return
43
+ end
44
+
45
+ Cheeba::Defaults.constants.sort.each do |x|
46
+ next if x == "DOTFILE"
47
+ opts.on("--[no-]#{x.downcase}", DESC[x.downcase]) do |y|
48
+ hsh[:opt]["#{x.downcase}".to_sym] = y
49
+ puts "use options with --read or --write" && return if hsh[:cmd].nil?
50
+ end
51
+ end
52
+ ops = opts
53
+ end.parse!
54
+ puts ops unless hsh.has_key?(:cmd)
55
+ return unless hsh.has_key?(:cmd)
56
+ self.run(hsh[:cmd], hsh[:arg], hsh[:opt])
57
+ end
58
+
59
+ def self.run(cmd, arg, opt)
60
+ x = Cheeba.read(arg[0], opt)
61
+ case cmd
62
+ when 1: pp x
63
+ when 2: Cheeba.write(arg[0], arg[1], opt)
64
+ end
65
+ end
66
+ end
67
+
68
+ CheebaOpt.command
data/cheeba.gemspec ADDED
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{cheeba}
5
+ s.version = "1.0.4"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["So Awesome Man"]
9
+ s.date = %q{2009-04-20}
10
+ s.default_executable = %q{cheeba}
11
+ s.description = %q{Simple data serialization serialization for only the Ruby Programming Language.}
12
+ s.email = ["callme@1800AWESO.ME"]
13
+ s.executables = ["cheeba"]
14
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
15
+ s.files = ["History.txt", "Manifest.txt", "README.txt", "Rakefile", "bin/cheeba", "cheeba.gemspec", "lib/cheeba.rb", "lib/cheeba/defaults.rb", "lib/cheeba/errors.rb", "lib/cheeba/indicators.rb", "lib/cheeba/reader.rb", "lib/cheeba/reader/builder.rb", "lib/cheeba/reader/format.rb", "lib/cheeba/reader/node.rb", "lib/cheeba/reader/parser.rb", "lib/cheeba/version.rb", "lib/cheeba/writer.rb", "lib/cheeba/writer/builder.rb", "test/files/arrays.cash", "test/files/blank.cash", "test/files/comments.cash", "test/files/hashes.cash", "test/files/malformed.cash", "test/files/mixed.cash", "test/files/split.cash", "test/test_cheeba.rb", "test/test_reader.rb", "test/test_reader_builder.rb", "test/test_reader_format.rb", "test/test_reader_parser.rb", "test/test_writer.rb", "test/test_writer_builder.rb"]
16
+ s.has_rdoc = true
17
+ s.homepage = %q{http://github.com/awesome/cheeba}
18
+ s.rdoc_options = ["--main", "README.txt"]
19
+ s.require_paths = ["lib"]
20
+ s.rubyforge_project = %q{cheeba}
21
+ s.rubygems_version = %q{1.3.1}
22
+ s.summary = %q{Simple data serialization serialization for only the Ruby Programming Language.}
23
+ s.test_files = ["test/test_cheeba.rb", "test/test_reader.rb", "test/test_reader_builder.rb", "test/test_reader_format.rb", "test/test_reader_parser.rb", "test/test_writer.rb", "test/test_writer_builder.rb"]
24
+
25
+ if s.respond_to? :specification_version then
26
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
27
+ s.specification_version = 2
28
+
29
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
30
+ s.add_development_dependency(%q<hoe>, [">= 1.8.2"])
31
+ else
32
+ s.add_dependency(%q<hoe>, [">= 1.8.2"])
33
+ end
34
+ else
35
+ s.add_dependency(%q<hoe>, [">= 1.8.2"])
36
+ end
37
+ end
@@ -0,0 +1,78 @@
1
+ module Cheeba
2
+ module Defaults
3
+ INT = true
4
+ INT_KEYS = false
5
+ INT_VALS = false
6
+ SYMBOLIZE = false
7
+ SYMBOLIZE_KEYS = false
8
+ SYMBOLIZE_VALS = false
9
+ SYM_STR = false
10
+ SYM_STR_KEYS = false
11
+ SYM_STR_VALS = false
12
+ AUTO_SYM = true
13
+ AUTO_SYM_KEYS = false
14
+ AUTO_SYM_VALS = false
15
+ AUTO_TRUE = true
16
+ AUTO_TRUE_KEYS = false
17
+ AUTO_TRUE_VALS = false
18
+ STRIP = true
19
+ STRIP_KEYS = false
20
+ STRIP_VALS = false
21
+ LIST = false
22
+ DOT = true
23
+ DOTFILE = "#{ENV['HOME']}/.cheeba"
24
+ YAML = false
25
+ DOCS = false
26
+
27
+ def self.descriptions
28
+ { "auto_sym" => "conv keys & vals: \":both\" => :both",
29
+ "auto_sym_keys" => "conv keys: \":key\" => :key",
30
+ "auto_sym_vals" => "conv vals: \":val\" => :val",
31
+ "auto_true" => "conv keys & vals: \"true\" => true",
32
+ "auto_true_keys" => "conv keys: \"true\" => true",
33
+ "auto_true_vals" => "conv vals: \"true\" => true",
34
+ "docs" => "doc separator first level hash nodes",
35
+ "dot" => "use dotfile if it exists",
36
+ "int" => "conv keys & vals: \"1\" => 1",
37
+ "int_keys" => "conv keys: \"1\" => 1",
38
+ "int_vals" => "conv vals: \"1\" => 1",
39
+ "list" => "return hash of addresses & comments",
40
+ "strip" => "strip keys & vals: \" both \" => \"both\"",
41
+ "strip_keys" => "strip keys: \" key \" => \"key\"",
42
+ "strip_vals" => "strip vals: \" val \" => \"val\"",
43
+ "sym_str" => "conv str (no int) k & v: \"b\" => :b",
44
+ "sym_str_keys" => "conv string keys(no int): \"key\" => :key",
45
+ "sym_str_vals" => "conv string vals(no int): \"val\" => :val",
46
+ "symbolize" => "force conv keys & vals: \"both\" => :both",
47
+ "symbolize_keys" => "force conv keys: \"key\" => :key",
48
+ "symbolize_vals" => "force conv vals: \"val\" => :val",
49
+ "yaml" => "write files with YAML type array syntax"}
50
+ end
51
+
52
+ def self.options
53
+ { :int => INT,
54
+ :int_keys => INT_KEYS,
55
+ :int_vals => INT_VALS,
56
+ :symbolize => SYMBOLIZE,
57
+ :symbolize_keys => SYMBOLIZE_KEYS,
58
+ :symbolize_vals => SYMBOLIZE_VALS,
59
+ :sym_str => SYM_STR,
60
+ :sym_str_keys => SYM_STR_KEYS,
61
+ :sym_str_vals => SYM_STR_VALS,
62
+ :auto_sym => AUTO_SYM,
63
+ :auto_sym_keys => AUTO_SYM_KEYS,
64
+ :auto_sym_vals => AUTO_SYM_VALS,
65
+ :auto_true => AUTO_TRUE,
66
+ :auto_true_keys => AUTO_TRUE_KEYS,
67
+ :auto_true_vals => AUTO_TRUE_VALS,
68
+ :strip => STRIP,
69
+ :strip_keys => STRIP_KEYS,
70
+ :strip_vals => STRIP_VALS,
71
+ :list => LIST,
72
+ :dot => DOT,
73
+ :dotfile => DOTFILE,
74
+ :yaml => YAML,
75
+ :docs => DOCS}
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,10 @@
1
+ module Cheeba
2
+ module Errors
3
+ class EmptyFilenameError < StandardError; end
4
+ class EmptyInputError < StandardError; end
5
+ class InvalidInputError < StandardError; end
6
+ class InvalidFilenameError < StandardError; end
7
+ end
8
+ end
9
+
10
+
@@ -0,0 +1,25 @@
1
+ module Cheeba
2
+ module Indicators
3
+ DOC_START = '---'
4
+ DOC_TERM = '...'
5
+ HASH = ':'
6
+ SYMBOL = ':'
7
+ ARRAY = '-'
8
+ COMMENT = '#'
9
+ LINE_END = "\n"
10
+ SPACE = "\s"
11
+ INDENT = 2
12
+
13
+ def self.options
14
+ { :doc_start => DOC_START,
15
+ :doc_term => DOC_TERM,
16
+ :hash => HASH,
17
+ :symbol => SYMBOL,
18
+ :array => ARRAY,
19
+ :comment => COMMENT,
20
+ :line_end => LINE_END,
21
+ :space => SPACE,
22
+ :indent => INDENT }
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,265 @@
1
+ module Cheeba
2
+ module Reader
3
+ module Builder
4
+ #
5
+ # Abbreviations:
6
+ # adr = address
7
+ # phs = parsed hash
8
+ # hsh = hash
9
+ # lst = list
10
+ # met = meta
11
+ # cur = current
12
+ # spc = spaces
13
+ # idt = indent
14
+ # idx = index
15
+ #
16
+ # dcs = doc_start
17
+ # dct = doc_term
18
+ # hpr = hsh_pair
19
+ # hky = hsh_key
20
+ # arr = array
21
+ # com = comment
22
+ # mal = malformed
23
+ # msg = message
24
+ # bla = blank
25
+ #
26
+ class RootNodeError < StandardError; end
27
+
28
+ ##
29
+ # adds parsed_hash of line to hash
30
+ #
31
+ def self.build(hsh, phs)
32
+ add = false
33
+ upd = nil
34
+ msg = phs[:msg]
35
+ self.doc_new(hsh) if hsh.empty? && msg != "doc"
36
+ val = phs[:val]
37
+ lst = hsh[:lst]
38
+
39
+ unless [:com, :mal, :bla].include?(msg)
40
+ cur = self.cur(hsh)
41
+ key = phs[:key]
42
+ spc = phs[:spc]
43
+ idt = phs[:opt][:indent]
44
+ adr = hsh[:adr]
45
+ idx = self.index(spc, idt)
46
+ upd = self.update(adr, idx)
47
+ las = self.adr_obj(hsh, hsh[:adr])
48
+ add = true
49
+ end
50
+
51
+ case msg
52
+ when :dcs: self.doc_start(hsh)
53
+ when :dct: self.doc_term(hsh)
54
+ when :hpr: self.hsh_pair(las, key, val)
55
+ when :hky: self.hsh_key(las, adr, key)
56
+ when :bla: self.blank(lst)
57
+ when :arr
58
+ raise RootNodeError if cur.is_a?(Hash) && !cur.empty? && spc == 0
59
+ if las.is_a?(Hash) && las.empty?
60
+ self.adr_obj_to_array(hsh, hsh[:adr])
61
+ las = self.adr_obj(hsh, hsh[:adr])
62
+ end
63
+ self.arr_parse(las, adr, val, upd)
64
+ when :com: self.comment(lst, val)
65
+ when :mal: self.malformed(lst, val)
66
+ end
67
+
68
+ self.add_to_list(lst, adr) if add
69
+ end
70
+
71
+ ##
72
+ # sub-parses array message, and logic from update-method
73
+ #
74
+ def self.arr_parse(las, adr, val, upd)
75
+ case upd
76
+ when "eq": self.array_val(las, val)
77
+ when "lt": self.array_val(las, val)
78
+ when "gt": self.array_new(las, adr, val)
79
+ else; raise "error"
80
+ end
81
+ end
82
+
83
+ ##
84
+ # current hash, returns array of "doc"
85
+ #
86
+ def self.cur(hsh)
87
+ hsh[hsh.length - 2]
88
+ end
89
+
90
+ ##
91
+ # address array to string usable in eval on root node
92
+ #
93
+ def self.to_adr(adr)
94
+ m = adr.map {|x|
95
+ case
96
+ when x.is_a?(Symbol): "[:#{x}]"
97
+ when x.is_a?(String): "['#{x}']"
98
+ when x.is_a?(Fixnum): "[#{x}]"
99
+ end
100
+ }
101
+ m.to_s
102
+ end
103
+
104
+ ##
105
+ # returns the actual object at an address in tree
106
+ #
107
+ def self.adr_obj(hsh, adr)
108
+ m = self.to_adr(adr)
109
+ eval("hsh#{m.to_s}")
110
+ end
111
+
112
+ ##
113
+ # converts an object in tree to empty array
114
+ #
115
+ def self.adr_obj_to_array(hsh, adr)
116
+ m = self.to_adr(adr)
117
+ eval("hsh#{m.to_s} = []")
118
+ end
119
+
120
+ ##
121
+ # calculates index based on spaces divided by indent unit
122
+ #
123
+ def self.index(spc, idt)
124
+ ((spc % idt) != 0) ? 0 : spc / idt
125
+ end
126
+
127
+ # if indentation less than before, jump up tree, remove extra indices
128
+ #
129
+ def self.update(adr, idx)
130
+ ret = nil
131
+ len = (adr.length - 1)
132
+ if idx < len
133
+ # remove indices after current index
134
+ adr.replace(adr[0..idx])
135
+ ret = "lt"
136
+ elsif idx == len
137
+ ret = "eq"
138
+ elsif idx > len
139
+ ret = "gt"
140
+ end
141
+ ret
142
+ end
143
+
144
+ ##
145
+ # create keypair for new doc
146
+ #
147
+ def self.doc_new(hsh)
148
+ hsh[:lst] ||= {}
149
+ hsh[:adr] ||= []
150
+ len = hsh.length - 1
151
+ hsh[len] = {}
152
+ hsh[:adr].clear
153
+ hsh[:adr] << len
154
+ end
155
+
156
+ ##
157
+ # new array in tree, provides logic for last modified object
158
+ #
159
+ def self.array_new(las, adr, val)
160
+ case
161
+ when las.is_a?(Array) && las.empty?
162
+ x = [val]
163
+ las = x
164
+ adr << las.rindex(x)
165
+ when las.is_a?(Array) && las.last.is_a?(String) && las.last.empty?
166
+ x = [val]
167
+ las[-1] = [val]
168
+ adr << las.rindex(x)
169
+ when las.is_a?(Array)
170
+ x = [val]
171
+ las << x
172
+ adr << las.rindex(x)
173
+ end
174
+ end
175
+
176
+ ##
177
+ # start document
178
+ #
179
+ def self.doc_start(hsh)
180
+ self.doc_new(hsh)
181
+ self.add_to_list(hsh[:lst], "#DOC_START")
182
+ end
183
+
184
+ ##
185
+ # document terminate
186
+ #
187
+ def self.doc_term(hsh)
188
+ self.add_to_list(hsh[:lst], "#DOC_TERM")
189
+ end
190
+
191
+ ##
192
+ # add val to array in tree
193
+ #
194
+ def self.array_val(las, val)
195
+ case
196
+ # when x is a hash, it's already addressed
197
+ when las.is_a?(Array)
198
+ las << val
199
+ else
200
+ raise las.inspect
201
+ end
202
+ end
203
+
204
+ ##
205
+ # add hashkey to tree
206
+ #
207
+ def self.hsh_key(las, adr, key)
208
+ case
209
+ when las.is_a?(Hash)
210
+ las[key] = {}
211
+ when las.is_a?(Array)
212
+ x = {key => {}}
213
+ las << x
214
+ adr << las.rindex(x)
215
+ end
216
+ adr << key
217
+ end
218
+
219
+ ##
220
+ # add hashpair to tree
221
+ #
222
+ def self.hsh_pair(las, key, val)
223
+ case
224
+ when las.is_a?(Array)
225
+ x = {key => val}
226
+ las << x
227
+ when las.is_a?(Hash)
228
+ las[key] = val
229
+ end
230
+ end
231
+
232
+ ##
233
+ # list stores hsh addresses of lines, comments, etc.
234
+ #
235
+ def self.add_to_list(lst, adr)
236
+ case adr.class.to_s
237
+ when "String": x = adr
238
+ when "Array": x = adr.join(",")
239
+ end
240
+ lst[lst.length + 1] = x
241
+ end
242
+
243
+ ##
244
+ # add blank to list
245
+ #
246
+ def self.blank(lst)
247
+ self.add_to_list(lst, "#BLANK")
248
+ end
249
+
250
+ ##
251
+ # add comment to list
252
+ #
253
+ def self.comment(lst, val)
254
+ lst[lst.length + 1] = "#COMMENT: #{val}"
255
+ end
256
+
257
+ ##
258
+ # add malformed to list
259
+ #
260
+ def self.malformed(lst, val)
261
+ lst[lst.length + 1] = "#MALFORMED: #{val}"
262
+ end
263
+ end
264
+ end
265
+ end