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.
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