sanderjd-bitch 0.0.2 → 0.1.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.
- data/Rakefile +38 -0
- data/demo.rb +32 -7
- data/lib/bitch.rb +36 -17
- data/lib/bits.rb +2 -0
- metadata +6 -6
- data/bitch.gemspec +0 -16
data/Rakefile
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
begin
|
2
|
+
require 'rubygems'
|
3
|
+
rescue Exception
|
4
|
+
puts 'RubyGems is not install. See http://www.rubygems.org/read/chapter/3 for instructions.'
|
5
|
+
end
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'spec/rake/spectask'
|
9
|
+
|
10
|
+
Spec::Rake::SpecTask.new do |t|
|
11
|
+
t.spec_opts = ['-c']
|
12
|
+
t.libs << 'lib'
|
13
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
14
|
+
t.rcov = true
|
15
|
+
end
|
16
|
+
rescue Exception
|
17
|
+
puts 'RSpec not available. Install it with: sudo gem install rspec'
|
18
|
+
end
|
19
|
+
|
20
|
+
begin
|
21
|
+
require 'jeweler'
|
22
|
+
Jeweler::Tasks.new do |s|
|
23
|
+
s.name = "bitch"
|
24
|
+
s.summary = "Bitch - A simple binary message building helper"
|
25
|
+
s.description = "A very simple library for building binary data in a declarative manner"
|
26
|
+
s.email = 'sanderjd@gmail.com'
|
27
|
+
s.homepage = 'http://github.com/sanderjd/bitch'
|
28
|
+
s.authors = ['James Sanders']
|
29
|
+
s.has_rdoc = true
|
30
|
+
s.files = ["README",
|
31
|
+
"Rakefile",
|
32
|
+
"demo.rb",
|
33
|
+
"lib/bitch.rb",
|
34
|
+
"lib/bits.rb"]
|
35
|
+
end
|
36
|
+
rescue LoadError
|
37
|
+
puts 'Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com'
|
38
|
+
end
|
data/demo.rb
CHANGED
@@ -1,21 +1,46 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/lib/bitch'
|
2
2
|
|
3
|
-
|
3
|
+
# Make a template
|
4
|
+
Bitch.template :demo do |m|
|
4
5
|
m.bits :beginning, :length => 10, :value => 0b1010101010
|
5
6
|
m.bits :middle, :length => 5
|
6
7
|
m.bits :end, :length => 10, :value => 1
|
7
8
|
end
|
8
9
|
|
10
|
+
# Create an object with that template
|
11
|
+
message = Bitch.create(:demo)
|
12
|
+
|
9
13
|
# 1010101010000000000000001
|
10
|
-
puts message.
|
14
|
+
puts message.bit_string
|
11
15
|
|
12
|
-
|
16
|
+
# Create an object with that template and give it parameters
|
17
|
+
message = Bitch.create(:demo, :middle => 0b11111)
|
13
18
|
|
14
19
|
# 1010101010111110000000001
|
15
|
-
puts message.
|
20
|
+
puts message.bit_string
|
16
21
|
# 1557c01
|
17
|
-
puts message.
|
22
|
+
puts message.hex_string
|
18
23
|
# 125276001
|
19
|
-
puts message.
|
24
|
+
puts message.oct_string
|
20
25
|
# 22379521
|
21
|
-
puts message.
|
26
|
+
puts message.integer
|
27
|
+
|
28
|
+
# Compose another message using this object as one of its fields
|
29
|
+
new_message = Bitch.compose do |m|
|
30
|
+
m.bits :before, :length => 1, :value => 1
|
31
|
+
m.add :demo__message, message
|
32
|
+
m.bits :after, :length => 1, :value => 0
|
33
|
+
end
|
34
|
+
|
35
|
+
# 110101010101111100000000010
|
36
|
+
puts new_message.bit_string
|
37
|
+
|
38
|
+
# Compose another message without creating the original message
|
39
|
+
newer_message = Bitch.compose do |m|
|
40
|
+
m.bits :before, :length => 1, :value => 1
|
41
|
+
m.bring :demo, :middle => 0
|
42
|
+
m.bits :after, :length => 1, :value => 0
|
43
|
+
end
|
44
|
+
|
45
|
+
# 110101010100000000000000010
|
46
|
+
puts newer_message.bit_string
|
data/lib/bitch.rb
CHANGED
@@ -1,54 +1,73 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/bits'
|
2
2
|
|
3
3
|
class Bitch
|
4
|
-
def self.fields(name, &block)
|
5
|
-
formats[name] = self.new
|
6
|
-
yield formats[name]
|
7
|
-
end
|
8
4
|
|
5
|
+
# Class methods
|
6
|
+
|
7
|
+
def self.template(name, &block)
|
8
|
+
templates[name] = self.new
|
9
|
+
yield templates[name]
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.create(name, params = {})
|
14
|
+
params.each_pair { |k,v| templates[name][k] = v }
|
15
|
+
templates[name]
|
16
|
+
end
|
17
|
+
|
9
18
|
def self.compose(&block)
|
10
19
|
composition = self.new
|
11
20
|
yield composition
|
12
21
|
composition
|
13
22
|
end
|
14
23
|
|
24
|
+
# Object methods
|
25
|
+
|
26
|
+
def integer; get_bits.integer end
|
27
|
+
def bit_string; get_bits.bit_string end
|
28
|
+
def hex_string; get_bits.hex_string end
|
29
|
+
def oct_string; get_bits.oct_string end
|
30
|
+
|
31
|
+
def add(name, object)
|
32
|
+
fields << { name => object.get_bits }
|
33
|
+
end
|
34
|
+
|
15
35
|
def bring(name, params = {})
|
16
|
-
|
17
|
-
|
18
|
-
field_array << { name => format.get_bits }
|
36
|
+
object = Bitch.create(name, params)
|
37
|
+
fields << { name => object.get_bits }
|
19
38
|
end
|
20
39
|
|
21
|
-
def bits(name, params)
|
40
|
+
def bits(name, params = {})
|
22
41
|
value = params.key?(:value) ? params[:value] : 0
|
23
42
|
length = params.key?(:length) ? params[:length] : 0
|
24
|
-
|
43
|
+
fields << { name => Bits.new(value, length) }
|
25
44
|
end
|
26
45
|
|
27
46
|
def get_bits
|
28
|
-
|
47
|
+
fields.inject(nil) do |composed, field|
|
29
48
|
bits = field.values.first
|
30
|
-
|
49
|
+
composed ? composed + bits : bits
|
31
50
|
end
|
32
51
|
end
|
33
52
|
|
34
53
|
def [](name)
|
35
|
-
|
54
|
+
fields.select { |field| field.key?(name) }.first.values.first
|
36
55
|
end
|
37
56
|
|
38
57
|
def []=(name, value)
|
39
|
-
element_array =
|
58
|
+
element_array = fields.select { |field| field.key?(name) }
|
40
59
|
element = element_array.first.values.first unless element_array.empty?
|
41
60
|
element.set(value) unless element.nil?
|
42
61
|
end
|
43
62
|
|
44
63
|
private
|
45
64
|
|
46
|
-
def
|
47
|
-
@
|
65
|
+
def fields
|
66
|
+
@fields ||= Array.new
|
48
67
|
end
|
49
68
|
|
50
|
-
def self.
|
51
|
-
@@
|
69
|
+
def self.templates
|
70
|
+
@@templates ||= Hash.new
|
52
71
|
end
|
53
72
|
end
|
54
73
|
|
data/lib/bits.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sanderjd-bitch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Sanders
|
@@ -9,11 +9,11 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-01-
|
12
|
+
date: 2009-01-18 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description:
|
16
|
+
description: A very simple library for building binary data in a declarative manner
|
17
17
|
email: sanderjd@gmail.com
|
18
18
|
executables: []
|
19
19
|
|
@@ -23,10 +23,10 @@ extra_rdoc_files: []
|
|
23
23
|
|
24
24
|
files:
|
25
25
|
- README
|
26
|
-
-
|
26
|
+
- Rakefile
|
27
27
|
- demo.rb
|
28
|
-
- lib/bits.rb
|
29
28
|
- lib/bitch.rb
|
29
|
+
- lib/bits.rb
|
30
30
|
has_rdoc: true
|
31
31
|
homepage: http://github.com/sanderjd/bitch
|
32
32
|
post_install_message:
|
@@ -52,6 +52,6 @@ rubyforge_project:
|
|
52
52
|
rubygems_version: 1.2.0
|
53
53
|
signing_key:
|
54
54
|
specification_version: 2
|
55
|
-
summary: Bitch
|
55
|
+
summary: Bitch - A simple binary message building helper
|
56
56
|
test_files: []
|
57
57
|
|
data/bitch.gemspec
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
Gem::Specification.new do |s|
|
2
|
-
s.name = "bitch"
|
3
|
-
s.version = "0.0.2"
|
4
|
-
s.date = "2009-01-02"
|
5
|
-
s.authors = ["James Sanders"]
|
6
|
-
s.email = "sanderjd@gmail.com"
|
7
|
-
s.summary = "Bitch provides simple composition of bit fields"
|
8
|
-
s.homepage = "http://github.com/sanderjd/bitch"
|
9
|
-
s.description = "Spurred by unneeded complexity in projects such as BinData, Bitch provides dead-simple composition and naming of bit fields"
|
10
|
-
s.has_rdoc = true
|
11
|
-
s.files = ["README",
|
12
|
-
"bitch.gemspec",
|
13
|
-
"demo.rb",
|
14
|
-
"lib/bits.rb",
|
15
|
-
"lib/bitch.rb"]
|
16
|
-
end
|