sanderjd-bitch 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/Rakefile +38 -0
  2. data/demo.rb +32 -7
  3. data/lib/bitch.rb +36 -17
  4. data/lib/bits.rb +2 -0
  5. metadata +6 -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
- message = Bitch.compose do |m|
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.get_bits.bit_string
14
+ puts message.bit_string
11
15
 
12
- message[:middle] = 31
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.get_bits.bit_string
20
+ puts message.bit_string
16
21
  # 1557c01
17
- puts message.get_bits.hex_string
22
+ puts message.hex_string
18
23
  # 125276001
19
- puts message.get_bits.oct_string
24
+ puts message.oct_string
20
25
  # 22379521
21
- puts message.get_bits.integer
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
- format = Bitch.formats[name]
17
- params.each_pair { |field, value| format[field] = value }
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
- field_array << { name => Bits.new(value, length) }
43
+ fields << { name => Bits.new(value, length) }
25
44
  end
26
45
 
27
46
  def get_bits
28
- field_array.inject(nil) do |fields, field|
47
+ fields.inject(nil) do |composed, field|
29
48
  bits = field.values.first
30
- fields ? fields + bits : bits
49
+ composed ? composed + bits : bits
31
50
  end
32
51
  end
33
52
 
34
53
  def [](name)
35
- field_array.select { |field| field.key?(name) }.first.values.first
54
+ fields.select { |field| field.key?(name) }.first.values.first
36
55
  end
37
56
 
38
57
  def []=(name, value)
39
- element_array = field_array.select { |field| field.key?(name) }
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 field_array
47
- @field_array ||= Array.new
65
+ def fields
66
+ @fields ||= Array.new
48
67
  end
49
68
 
50
- def self.formats
51
- @@formats ||= Hash.new
69
+ def self.templates
70
+ @@templates ||= Hash.new
52
71
  end
53
72
  end
54
73
 
data/lib/bits.rb CHANGED
@@ -50,6 +50,8 @@ class Bits
50
50
  "%0#{length}b" % Integer(bits)
51
51
  when Bits
52
52
  bits.bits
53
+ when Bitch
54
+ bits.get_bits.bits
53
55
  else
54
56
  raise TypeError, "Unsupported data type #{bits.class}"
55
57
  end
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.2
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-02 00:00:00 -08:00
12
+ date: 2009-01-18 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: Spurred by unneeded complexity in projects such as BinData, Bitch provides dead-simple composition and naming of bit fields
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
- - bitch.gemspec
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 provides simple composition of bit fields
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