statefulton 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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format=documentation
data/.rvmrc ADDED
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
7
+ environment_id="ruby-1.9.2-p290@statefulton"
8
+
9
+ #
10
+ # Uncomment following line if you want options to be set only for given project.
11
+ #
12
+ # PROJECT_JRUBY_OPTS=( --1.9 )
13
+ #
14
+ # The variable PROJECT_JRUBY_OPTS requires the following to be run in shell:
15
+ #
16
+ # chmod +x ${rvm_path}/hooks/after_use_jruby_opts
17
+ #
18
+
19
+ #
20
+ # First we attempt to load the desired environment directly from the environment
21
+ # file. This is very fast and efficient compared to running through the entire
22
+ # CLI and selector. If you want feedback on which environment was used then
23
+ # insert the word 'use' after --create as this triggers verbose mode.
24
+ #
25
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
26
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
27
+ then
28
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
29
+
30
+ if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
31
+ then
32
+ . "${rvm_path:-$HOME/.rvm}/hooks/after_use"
33
+ fi
34
+ else
35
+ # If the environment file has not yet been created, use the RVM CLI to select.
36
+ if ! rvm --create use "$environment_id"
37
+ then
38
+ echo "Failed to create RVM environment '${environment_id}'."
39
+ return 1
40
+ fi
41
+ fi
42
+
43
+ #
44
+ # If you use an RVM gemset file to install a list of gems (*.gems), you can have
45
+ # it be automatically loaded. Uncomment the following and adjust the filename if
46
+ # necessary.
47
+ #
48
+ # filename=".gems"
49
+ # if [[ -s "$filename" ]]
50
+ # then
51
+ # rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
52
+ # fi
53
+
54
+ # If you use bundler, this might be useful to you:
55
+ # if [[ -s Gemfile ]] && ! command -v bundle >/dev/null
56
+ # then
57
+ # printf "The rubygem 'bundler' is not installed. Installing it now.\n"
58
+ # gem install bundler
59
+ # fi
60
+ # if [[ -s Gemfile ]] && command -v bundle
61
+ # then
62
+ # bundle install
63
+ # fi
64
+
65
+ if [[ $- == *i* ]] # check for interactive shells
66
+ then
67
+ echo "Using: $(tput setaf 2)$GEM_HOME$(tput sgr0)" # show the user the ruby and gemset they are using in green
68
+ else
69
+ echo "Using: $GEM_HOME" # don't use colors in interactive shells
70
+ fi
71
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in statefulton.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2011 Dave Lyon
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # Statefulton
2
+
3
+ A simple interface for the state of objects under test. Useful as an interface along with Cucumber Transforms.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'statefulton'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install statefulton
18
+
19
+ ## Usage
20
+
21
+ Defined DSL methods:
22
+
23
+ * *builder* - Stores a block to use as a default builder method. Block is called when a 'make' method is triggered.
24
+ * *make* - Creates a state method that returns a newly created instance of the object. Raises if called again.
25
+ * *expects* - Creates a state method that returns an existing instance of the object. Raises if no instance exists.
26
+
27
+ Accessing the state of something:
28
+
29
+ * StateOf(:name, "context")
30
+
31
+ Creating a statefulton:
32
+
33
+ * Statefulton(:name) { # a block of calls to the DSL methods }
34
+
35
+ To define a new statefulton:
36
+
37
+ Statefulton(:user) do
38
+ builder { User.new }
39
+
40
+ make "an"
41
+
42
+ expects "that" # Calling "that" will return the singular instance
43
+ end
44
+
45
+ StateOf(:user, "that") #raise error: instance not created
46
+ StateOf(:user, "an") #build the object
47
+ StateOf(:user, "an") #raise error: instance already created
48
+ StateOf(:user, "that") #get the object
49
+
50
+ Cucumber Usage:
51
+
52
+ Given a user
53
+ When I activate that user
54
+
55
+ Transform /^(a|that) user$/ do |state|
56
+ StateOf(:user, state)
57
+ end
58
+
59
+ When /^I activate (that user)$/ do |user|
60
+ user.activate!
61
+ end
62
+
63
+ ## Contributing
64
+
65
+ 1. Fork it
66
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
67
+ 3. Commit your changes (with tests!) (`git commit -am 'Added some feature'`)
68
+ 4. Push to the branch (`git push origin my-new-feature`)
69
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
@@ -0,0 +1,31 @@
1
+ require 'singleton'
2
+
3
+ class Statefulton::Builder
4
+ include Singleton
5
+
6
+ def register(name, &block)
7
+ state = Statefulton::Statefulton.new &block
8
+ add_state name, state
9
+ end
10
+
11
+ def get_state name, method
12
+ states[name].public_method(method).call
13
+ end
14
+
15
+ def reset_all!
16
+ states.values.map(&:reset!).none?
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :states
22
+
23
+ def initialize
24
+ @states = {}
25
+ end
26
+
27
+ def add_state name, state
28
+ @states[name] = state
29
+ state
30
+ end
31
+ end
@@ -0,0 +1,37 @@
1
+ class Statefulton::Statefulton
2
+ attr_reader :instance
3
+
4
+ def initialize &block
5
+ instance_eval &block
6
+ end
7
+
8
+ def builder &block
9
+ @builder = block
10
+ end
11
+
12
+ def make string, &block
13
+ define_singleton_method string do
14
+ build_instance &block
15
+ end
16
+ end
17
+
18
+ def expects string
19
+ define_singleton_method string do
20
+ instance or fail "No instance exists!"
21
+ end
22
+ end
23
+
24
+ def reset!
25
+ @instance = nil
26
+ end
27
+
28
+ private
29
+ def build_instance &block
30
+ fail "Instance already created!" unless @instance.nil?
31
+ @instance = if block_given?
32
+ block.call
33
+ else
34
+ @builder.call
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Statefulton
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,22 @@
1
+ require "statefulton/version"
2
+
3
+ module Statefulton
4
+ autoload :Builder, 'statefulton/builder'
5
+ autoload :Statefulton, 'statefulton/statefulton'
6
+ State = Builder.instance
7
+ Reset = Class.new do
8
+ define_singleton_method :all do
9
+ Builder.instance.reset_all!
10
+ end
11
+ end
12
+ end
13
+
14
+ def Statefulton(name, &block)
15
+ name = name.to_sym
16
+ Statefulton::State.register name, &block
17
+ end
18
+
19
+ def StateOf(name, method)
20
+ name = name.to_sym
21
+ Statefulton::State.get_state name, method
22
+ end
@@ -0,0 +1 @@
1
+ require 'statefulton'
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Statefulton::Builder do
4
+ subject { Statefulton::Builder.instance }
5
+ after { subject.send(:initialize) }
6
+ describe "#register" do
7
+ it "returns a new statefulton" do
8
+ subject.register('a'){}.should be_a Statefulton::Statefulton
9
+ end
10
+ end
11
+
12
+ describe "#get_state" do
13
+ before do
14
+ subject.register('hash'){
15
+ builder { Hash.new }
16
+ make "one"
17
+ }.should be_a Statefulton::Statefulton
18
+ end
19
+ it "returns an object from a statefulton" do
20
+ subject.get_state("hash", "one").should be_a Hash
21
+ end
22
+ end
23
+
24
+ describe "#reset_all!" do
25
+ before do
26
+ subject.register(:one){}
27
+ subject.register(:two){}
28
+ end
29
+ it "resets all known states" do
30
+ subject.reset_all!.should be_true
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,140 @@
1
+ require 'spec_helper'
2
+
3
+ describe Statefulton::Statefulton do
4
+ let(:statefulton) { Statefulton::Statefulton.new &block }
5
+ subject { statefulton }
6
+
7
+ describe "Domain Specific Language" do
8
+ describe "#builder" do
9
+ let(:block) { Proc.new { builder { Object.new } } }
10
+ it "sets a builder with a block" do
11
+ subject.instance_variable_get("@builder").should be_a Proc
12
+ end
13
+ end
14
+
15
+ describe "#make" do
16
+ let(:block) do
17
+ Proc.new { make "one instance" }
18
+ end
19
+
20
+ it "defines a singleton method on this instance" do
21
+ subject.should respond_to "one instance"
22
+ end
23
+
24
+ context "with a block" do
25
+ let(:block) do
26
+ Proc.new do
27
+ make "instance with stuff" do
28
+ [1,2]
29
+ end
30
+ end
31
+ end
32
+
33
+ subject { statefulton.send("instance with stuff") }
34
+
35
+ it "calls the block when activated" do
36
+ subject.should == [1,2]
37
+ end
38
+
39
+ it "saves the state of the object" do
40
+ subject.should == [1,2]
41
+ statefulton.instance.should == [1,2]
42
+ end
43
+
44
+ it "raises if a creation attempt occurs" do
45
+ expect do
46
+ subject.send("instance with stuff")
47
+ end.to raise_error
48
+ end
49
+ end
50
+ end
51
+
52
+ describe "#expects" do
53
+ let(:block) do
54
+ Proc.new do
55
+ builder { Object.new }
56
+ expects "an instance"
57
+ end
58
+ end
59
+
60
+ it "defines a singleton method on this instance" do
61
+ subject.should respond_to "an instance"
62
+ end
63
+
64
+ it "raises if no instance exists" do
65
+ expect do
66
+ subject.send("an instance")
67
+ end.to raise_error
68
+ end
69
+ end
70
+
71
+ describe "#reset!" do
72
+ let(:block) do
73
+ Proc.new do
74
+ builder { Hash.new }
75
+ make "one"
76
+ end
77
+ end
78
+ before { subject.send "one" }
79
+ it "sets the instance to nil" do
80
+ subject.reset!
81
+ subject.instance.should be_nil
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "Internal API" do
87
+ let(:block) do
88
+ Proc.new do
89
+ builder { Hash.new }
90
+ make "one instance"
91
+ expects "that instance"
92
+ end
93
+ end
94
+
95
+ describe "#build_instance" do
96
+ context "first call" do
97
+ it "builds the singular instance" do
98
+ subject.send "one instance"
99
+ subject.send(:instance).should be_a Hash
100
+ end
101
+ end
102
+
103
+ context "with a block" do
104
+ subject { Statefulton::Statefulton.new{} }
105
+ it "calls the block instead of the builder" do
106
+ subject.instance_eval do
107
+ build_instance {:ok}.should == :ok
108
+ end
109
+ end
110
+ end
111
+
112
+ context "subsquent call" do
113
+ it "builds the singular instance" do
114
+ subject.send "one instance"
115
+ expect do
116
+ subject.send "one instance"
117
+ end.to raise_error "Instance already created!"
118
+ end
119
+ end
120
+ end
121
+
122
+ describe "#get_instace" do
123
+ context "with an instance" do
124
+ before { subject.send "one instance" }
125
+ it "returns the singular instance" do
126
+ subject.send("that instance").should be_a Hash
127
+ end
128
+ end
129
+
130
+ context "with no instance" do
131
+ it "raises an error" do
132
+ expect do
133
+ subject.send("that instance")
134
+ end.to raise_error "No instance exists!"
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Statefulton" do
4
+ describe "Pretty API methods" do
5
+ describe "Statefulton()" do
6
+ it "returns a new statefulton" do
7
+ Statefulton("a"){}.should be_a Statefulton::Statefulton
8
+ end
9
+ end
10
+
11
+ describe "StateOf()" do
12
+ before do
13
+ Statefulton :foo do
14
+ builder { Hash.new }
15
+ make "an"
16
+ expects "the one"
17
+ end
18
+ end
19
+ it "returns a statefultons instance" do
20
+ StateOf(:foo, "an").should be_a Hash
21
+ StateOf(:foo, "the one").should be_a Hash
22
+ end
23
+ end
24
+
25
+ describe "::Reset.alll" do
26
+ it "calls reset_all! on the builder" do
27
+ Statefulton::Reset.all.should == true
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/statefulton/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Dave Lyon", "Matt Polito"]
6
+ gem.email = ["gems@davelyon.net"]
7
+ gem.description = %q{A simple utility to manage state when testing}
8
+ gem.summary = %q{A fancy way to manage state in complex environments. Helpful when in Cucumber with lots of expected state.}
9
+ gem.homepage = "https://github.com/davelyon/statefulton"
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = "statefulton"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Statefulton::VERSION
17
+
18
+ gem.add_development_dependency "rspec", "~> 2.7"
19
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: statefulton
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dave Lyon
9
+ - Matt Polito
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-12-28 00:00:00.000000000 -06:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rspec
18
+ requirement: &2165793320 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: '2.7'
24
+ type: :development
25
+ prerelease: false
26
+ version_requirements: *2165793320
27
+ description: A simple utility to manage state when testing
28
+ email:
29
+ - gems@davelyon.net
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - .gitignore
35
+ - .rspec
36
+ - .rvmrc
37
+ - Gemfile
38
+ - LICENSE
39
+ - README.md
40
+ - Rakefile
41
+ - lib/statefulton.rb
42
+ - lib/statefulton/builder.rb
43
+ - lib/statefulton/statefulton.rb
44
+ - lib/statefulton/version.rb
45
+ - spec/spec_helper.rb
46
+ - spec/statefulton/builder_spec.rb
47
+ - spec/statefulton/statefulton_spec.rb
48
+ - spec/statefulton_spec.rb
49
+ - statefulton.gemspec
50
+ has_rdoc: true
51
+ homepage: https://github.com/davelyon/statefulton
52
+ licenses: []
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 1.6.2
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: A fancy way to manage state in complex environments. Helpful when in Cucumber
75
+ with lots of expected state.
76
+ test_files:
77
+ - spec/spec_helper.rb
78
+ - spec/statefulton/builder_spec.rb
79
+ - spec/statefulton/statefulton_spec.rb
80
+ - spec/statefulton_spec.rb