huffman 0.0.1

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.
@@ -0,0 +1,22 @@
1
+ require "spec_helper.rb"
2
+
3
+ module Huffman
4
+ describe "HuffmanCoder" do
5
+ it "decode an encoded string and get back the original string" do
6
+ txt = "La vie est un long fleuve tranquille avec des impasses, des courants de mer"
7
+ encoded_text, dictionnary = Huffman.encode_text(txt)
8
+ new_txt = Huffman.decode_text(encoded_text,dictionnary)
9
+ new_txt.should == txt
10
+ end
11
+
12
+ it "decode an encoded file and get back the original file" do
13
+
14
+ file_name = "spec/data/miserables.txt"
15
+ original_content = File.read(file_name)
16
+ Huffman.encode_file(file_name)
17
+ Huffman.decode_file(file_name+".huffman-encoded",file_name+".huffman-dictionnary")
18
+ original_content_after_decoding = File.read(file_name+".huffman-encoded-back-to-original")
19
+ original_content.should == original_content_after_decoding
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper.rb"
2
+
3
+ describe "LetterFrequency" do
4
+
5
+ it "get the sorted frequencies of the characters of a text" do
6
+
7
+ # Create an hash (associative array) with random letters frequencies
8
+ #
9
+ # a => 1
10
+ # b => 8
11
+ # c => 9
12
+
13
+ frequencies = {}
14
+ ('a'..'z').each{|c| frequencies[c] = rand(1..100) }
15
+ # Create a string from the frequencies hash
16
+ txt = frequencies.map{|letter,freq| letter*freq}.join.split('').shuffle.join
17
+ # Test
18
+ # On tries les frequences pour pouvoir comparer les hashs
19
+ Huffman::LetterFrequency.get_frequencies(txt).sort_by{|h| [h[1], h[0]]}.should == frequencies.sort_by{|h| [h[1], h[0]]}
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper.rb"
2
+
3
+ module Huffman
4
+
5
+ describe Node do
6
+
7
+ context "with a particular binary tree" do
8
+ # We consider the tree example in the Readme
9
+ # 1
10
+ # / \
11
+ # 2 3
12
+ # / \ \
13
+ # 4 5 6
14
+ # / \ /
15
+ # 7 8 9
16
+
17
+ # Left part
18
+ n7 = Node.new(7)
19
+ n8 = Node.new(8)
20
+ n5 = Node.new(5,nil,n7,n8)
21
+ n4 = Node.new(4)
22
+ n2 = Node.new(2,nil,n4,n5)
23
+ # Right part
24
+ n9 = Node.new(9,nil)
25
+ n6 = Node.new(6,nil,n9)
26
+ n3 = Node.new(3,nil,nil,n6)
27
+ # Tree
28
+ tree = Node.new(1,nil,n2,n3)
29
+
30
+ it "can be visited by the preorder algorithm" do
31
+ tree.visit_and_map(:preorder){|node| node.value}.should == [1, 2, 4, 5, 7, 8, 3, 6, 9]
32
+ end
33
+ it "can be visited by the inorder algorithm" do
34
+ tree.visit_and_map(:inorder){|node| node.value}.should == [4, 2, 7, 5, 8, 1, 3, 9, 6]
35
+ end
36
+ it "can be visited by the postorder algorithm" do
37
+ tree.visit_and_map(:postorder){|node| node.value}.should == [4, 7, 8, 5, 2, 9, 6, 3, 1]
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,41 @@
1
+ require "spec_helper.rb"
2
+
3
+ module Huffman
4
+ describe Tree do
5
+ context "with an expected binary tree" do
6
+ txt = "ABBCCCDDDEEEEE"
7
+ # Fréquences : A1 B2 C3 D3 E5
8
+ frequencies = LetterFrequency.get_frequencies(txt)
9
+ tree = Tree.new(frequencies)
10
+ # 14
11
+ # / \
12
+ # 6 8
13
+ # / \ / \
14
+ # 3 3 3 5
15
+ # / \
16
+ # 1 2
17
+ node3 = Node.new(3,nil,Node.new(1),Node.new(2))
18
+ node6 = Node.new(6,nil,Node.new(3),node3)
19
+ node8 = Node.new(8,nil,Node.new(3),Node.new(5))
20
+ expected_tree = Node.new(14,nil,node6,node8)
21
+
22
+ xit "build a tree from frequencies" do
23
+ tree.visit_and_map(:postorder){|node| node.value}.should == expected_tree.visit_and_map(:postorder){|node| node.value}
24
+
25
+ # Important, en fait il est difficile et plus compliquer de comparer deux arbres binaires
26
+ # dans le contexte d'un codage de Huffman
27
+ # Car deux arbres peuvent êtres structurellement différents mais pareil pour le codage de Huffman
28
+ # Cela dépend donc dans quel ordre a été triés les noeuds de même valeur
29
+ # Celà influence sur la structure de l'arbre
30
+ end
31
+
32
+ it "build and get the right dictionnary" do
33
+ dict = tree.dictionnary
34
+
35
+ #expected_dict = {"00"=>"C", "01"=>"D", "100"=>"A", "101"=>"B", "11"=>"E"}
36
+ expected_dict = {"00"=>"C", "010"=>"A", "011"=>"B", "10"=>"D", "11"=>"E"}
37
+ dict.should == expected_dict
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,21 @@
1
+ require "huffman.rb"
2
+ #require 'simplecov'
3
+ #SimpleCov.start
4
+
5
+ # This file was generated by the `rspec --init` command. Conventionally, all
6
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
7
+ # Require this file using `require "spec_helper"` to ensure that it is only
8
+ # loaded once.
9
+ #
10
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
11
+ RSpec.configure do |config|
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.run_all_when_everything_filtered = true
14
+ config.filter_run :focus
15
+
16
+ # Run specs in random order to surface order dependencies. If you find an
17
+ # order dependency and want to debug it, you can fix the order by providing
18
+ # the seed, which is printed after each run.
19
+ # --seed 1234
20
+ config.order = 'random'
21
+ end
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: huffman
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Martin Lagrange
8
+ - Bastien Jorge
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-01-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.3'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '1.3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: activesupport
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: ruby-graphviz
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: PriorityQueue
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ description: This gem allow you to encode and decode a text using the Huffman encoding
99
+ compression algorithm. It can also generate and visualize the huffman tree as a
100
+ png file.
101
+ email:
102
+ - lagrangemartin@gmail.com
103
+ - bastien.jorge@gmail.com
104
+ executables: []
105
+ extensions: []
106
+ extra_rdoc_files: []
107
+ files:
108
+ - .DS_Store
109
+ - .gitattributes
110
+ - .gitignore
111
+ - .rspec
112
+ - .ruby-version
113
+ - .travis.yml
114
+ - Gemfile
115
+ - LICENSE.txt
116
+ - README.md
117
+ - Rakefile
118
+ - huffman.gemspec
119
+ - lib/.DS_Store
120
+ - lib/huffman.rb
121
+ - lib/huffman/binary_stream.rb
122
+ - lib/huffman/letter_frequency.rb
123
+ - lib/huffman/log.rb
124
+ - lib/huffman/node.rb
125
+ - lib/huffman/tree.rb
126
+ - lib/huffman/version.rb
127
+ - spec/.DS_Store
128
+ - spec/data/.DS_Store
129
+ - spec/data/miserables.txt
130
+ - spec/data/miserables.txt.huffman-dictionnary
131
+ - spec/data/miserables.txt.huffman-encoded
132
+ - spec/data/miserables.txt.huffman-encoded-back-to-original
133
+ - spec/lib/huffman_spec.rb
134
+ - spec/lib/letter_frequency_spec.rb
135
+ - spec/lib/node_spec.rb
136
+ - spec/lib/tree_spec.rb
137
+ - spec/spec_helper.rb
138
+ homepage: http://github.com/lagrangemartin/huffman
139
+ licenses:
140
+ - MIT
141
+ metadata: {}
142
+ post_install_message:
143
+ rdoc_options: []
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubyforge_project:
158
+ rubygems_version: 2.0.3
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: Encode and decode a text using the Huffman encoding compression algorithm.
162
+ test_files:
163
+ - spec/.DS_Store
164
+ - spec/data/.DS_Store
165
+ - spec/data/miserables.txt
166
+ - spec/data/miserables.txt.huffman-dictionnary
167
+ - spec/data/miserables.txt.huffman-encoded
168
+ - spec/data/miserables.txt.huffman-encoded-back-to-original
169
+ - spec/lib/huffman_spec.rb
170
+ - spec/lib/letter_frequency_spec.rb
171
+ - spec/lib/node_spec.rb
172
+ - spec/lib/tree_spec.rb
173
+ - spec/spec_helper.rb