ns-options 1.0.1 → 1.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/README.md CHANGED
@@ -393,6 +393,60 @@ t = Thing.new(:one => 1, :two => 2, :three => 3)
393
393
  t.to_hash # => {:one => 1, :two => 2, :three => 3}
394
394
  ```
395
395
 
396
+ ## NsOptions::Struct
397
+
398
+ Much like a traditional ruby `Struct`, `NsOptions::Struct` is a class that creates other classes. However, `NsOptions::Struct` creates _proxy_ classes. There are a number of ways to do this:
399
+
400
+ ```ruby
401
+ NsOptions::Struct.new #=> #<#<Class:0x1076166d0>:#<NsOptions::
402
+ Thing = NsOptions::Struct.new #=> #<Thing:#<NsOptions::
403
+ Thing = Class.new(NsOptions::Struct.new) #=> #<Thing:#<NsOptions::
404
+ class Thing < NsOptions::Struct.new; end #=> #<Thing:#<NsOptions::
405
+ ```
406
+
407
+ `NsOptions::Struct` objects, being proxies, can be created with a hash of values and support dynamic writers (much like an `OpenStruct`).
408
+
409
+ ```ruby
410
+ Thing = NsOptions::Struct.new
411
+
412
+ thing = Thing.new(:something => 1)
413
+ thing.something #=> 1
414
+ thing.otherthing #=> NoMethodError
415
+ thing.otherthing = 2
416
+ thing.otherthing #=> 2
417
+ ```
418
+
419
+ You can pre-define the structure, including default values and type-casting info.
420
+
421
+ ```ruby
422
+ Thing = NsOptions::Struct.new do
423
+ option :something, Integer, :default => 1
424
+ option :otherthing, String
425
+ end
426
+
427
+ thing = Thing.new(:yet_another => 12.5)
428
+ thing.something #=> 1
429
+ thing.otherthing #=> nil
430
+ thing.otherthing = 2
431
+ thing.otherthing #=> '2'
432
+ thing.yet_another #=> 12.5
433
+ ```
434
+
435
+ And since struct classes are proxies, you don't have to create instances of them if you don't need to.
436
+
437
+ ```ruby
438
+ thing = NsOptions::Struct.new(:yet_another => 12.5) do
439
+ option :something, Integer, :default => 1
440
+ option :otherthing, String
441
+ end
442
+
443
+ thing.something #=> 1
444
+ thing.otherthing #=> nil
445
+ thing.otherthing = 2
446
+ thing.otherthing #=> '2'
447
+ thing.yet_another #=> 12.5
448
+ ```
449
+
396
450
  ## Installation
397
451
 
398
452
  Add this line to your application's Gemfile:
@@ -0,0 +1,13 @@
1
+ require 'ns-options/proxy'
2
+
3
+ module NsOptions::Struct
4
+
5
+ def self.new(opts=nil, &block)
6
+ Class.new.tap do |klass|
7
+ klass.class_eval { include NsOptions::Proxy }
8
+ klass.define(&block)
9
+ klass.apply(opts)
10
+ end
11
+ end
12
+
13
+ end
@@ -1,3 +1,3 @@
1
1
  module NsOptions
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/ns-options.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'ns-options/root_methods'
2
2
  require 'ns-options/proxy'
3
+ require 'ns-options/struct'
3
4
 
4
5
  module NsOptions
5
6
 
@@ -0,0 +1,66 @@
1
+ require 'assert'
2
+ require 'ns-options/proxy'
3
+ require 'ns-options/struct'
4
+
5
+ module NsOptions::Struct
6
+
7
+ class BaseTests < Assert::Context
8
+ desc "NsOptions::Struct"
9
+ setup do
10
+ @struct = NsOptions::Struct.new
11
+ end
12
+ subject { @struct }
13
+
14
+ should "be a proxy class" do
15
+ assert_kind_of ::Class, subject
16
+ assert subject.ancestors.include?(::NsOptions::Proxy)
17
+ end
18
+
19
+ end
20
+
21
+ class StructGlobalTests < BaseTests
22
+ desc "assigned to a global"
23
+ setup do
24
+ Thing = NsOptions::Struct.new
25
+ end
26
+ subject { Thing }
27
+
28
+ should "be a proxy class" do
29
+ assert_kind_of ::Class, subject
30
+ assert subject.ancestors.include?(::NsOptions::Proxy)
31
+ end
32
+
33
+ end
34
+
35
+ class StructClassTests < BaseTests
36
+ desc "used as the superclass to another class"
37
+ setup do
38
+ Thing = Class.new(NsOptions::Struct.new)
39
+ end
40
+ subject { Thing }
41
+
42
+ should "be a proxy class" do
43
+ assert_kind_of ::Class, subject
44
+ assert subject.ancestors.include?(::NsOptions::Proxy)
45
+ end
46
+
47
+ end
48
+
49
+ class StructureTests < BaseTests
50
+ desc "created with a structure and values"
51
+ setup do
52
+ @struct = NsOptions::Struct.new(:a => 'aye') do
53
+ option :b, Symbol, :default => :bee
54
+ option :c
55
+ end
56
+ end
57
+
58
+ should "should define the structure and apply the values" do
59
+ assert_equal 'aye', subject.a
60
+ assert_equal :bee, subject.b
61
+ assert_nil subject.c
62
+ end
63
+
64
+ end
65
+
66
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ns-options
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 0
9
8
  - 1
10
- version: 1.0.1
9
+ - 0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Collin Redding
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-12-05 00:00:00 Z
19
+ date: 2012-12-10 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: assert
@@ -61,6 +61,7 @@ files:
61
61
  - lib/ns-options/proxy.rb
62
62
  - lib/ns-options/proxy_method.rb
63
63
  - lib/ns-options/root_methods.rb
64
+ - lib/ns-options/struct.rb
64
65
  - lib/ns-options/version.rb
65
66
  - log/.gitkeep
66
67
  - ns-options.gemspec
@@ -85,6 +86,7 @@ files:
85
86
  - test/unit/proxy_method_tests.rb
86
87
  - test/unit/proxy_tests.rb
87
88
  - test/unit/root_methods_tests.rb
89
+ - test/unit/struct_tests.rb
88
90
  homepage: https://github.com/redding/ns-options
89
91
  licenses: []
90
92
 
@@ -140,3 +142,4 @@ test_files:
140
142
  - test/unit/proxy_method_tests.rb
141
143
  - test/unit/proxy_tests.rb
142
144
  - test/unit/root_methods_tests.rb
145
+ - test/unit/struct_tests.rb