datum 4.0.4 → 4.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bb2d6d84f89ffc9d2380e4db9d82da26f7a3a9bf
4
- data.tar.gz: b7cc6d41b42ba6ebdb0508a050ec5a78f359e60e
3
+ metadata.gz: 189dfaef662ee5db7f92dea90151f0f808987ac9
4
+ data.tar.gz: 8ffcc8a0765caac9d1a98e21862e5dd920dc159c
5
5
  SHA512:
6
- metadata.gz: 7dace5163e5d7fa38f1ebb6f675090c8a5b313846769c4fc6e917731582569bb8254a71efc0b5fb02ba14fa853caa803b28450f4d24e2baf5e9da574daec536a
7
- data.tar.gz: 8388f9a6ec216e3e2e1fd521fb05ba8dfb847a1d6b1799e716614faa90672cc915ca3d9495cb6d14cba096e8c38a0efc9f18f0971ce8a9a28b2447d6bb0cc036
6
+ metadata.gz: 22383aee690483716546ebfc14aa72f4b63181b65f5eacdba1bced66882131a1beb707ca5a7a7e3ca03c25225e2b28384493e783233488ae8d554bdbea84219a
7
+ data.tar.gz: 1e148954393e12195835fd7625f60d28ae9df0d2d08890ea63177f8ed238433e1ab4df80515aaadccd620852087ab0f0ada7fa1f84b2fdb7137663f5e4c63e96
data/MIT-LICENSE ADDED
@@ -0,0 +1,44 @@
1
+ Copyright 2015 Tyemill
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ #### From https://github.com/iconara/immutable_struct/blob/master/LICENSE
23
+ #### Provided due to use of immutable_struct/blob/master/lib/immutable_struct.rb
24
+
25
+ Copyright (c) 2010 Theo Hultberg
26
+
27
+ Permission is hereby granted, free of charge, to any person obtaining
28
+ a copy of this software and associated documentation files (the
29
+ "Software"), to deal in the Software without restriction, including
30
+ without limitation the rights to use, copy, modify, merge, publish,
31
+ distribute, sublicense, and/or sell copies of the Software, and to
32
+ permit persons to whom the Software is furnished to do so, subject to
33
+ the following conditions:
34
+
35
+ The above copyright notice and this permission notice shall be
36
+ included in all copies or substantial portions of the Software.
37
+
38
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
39
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
40
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
41
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
42
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
43
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
44
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,11 @@
1
+ ##### Datum is currently being updated. Hold on.
2
+
3
+
4
+
5
+ ## License
6
+
7
+ MIT License. Copyright 2012-2015 Tyemill. http://tyemill.com
8
+
9
+ You are not granted rights or licenses to the trademarks of Tyemill, including without limitation the Datum name or logo.
10
+
11
+ Datum struct uses ImprovedStruct and ImmutableStruct which are derivitive works based on ImmutableStruct by Theo Hultberg. This great class can be found here: [Immutable Struct](https://github.com/iconara/immutable_struct)
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Datum'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+ Bundler::GemHelper.install_tasks
21
+
22
+ require 'rake/testtask'
23
+
24
+ Rake::TestTask.new(:test) do |t|
25
+ t.libs << 'lib'
26
+ t.libs << 'test'
27
+ t.pattern = 'test/**/*_test.rb'
28
+ t.verbose = false
29
+ end
30
+
31
+
32
+ task default: :test
@@ -0,0 +1,73 @@
1
+ require "datum/helpers"
2
+
3
+ module Datum
4
+ # A Container object holds attributes for a single data test.
5
+ class Container
6
+
7
+ # Creates a Hash key formatted for use with a Container.
8
+ #
9
+ # @param [TestCase] tst_instance The TestCase instance for the data_test
10
+ # @param [String] data_method_name The name of the data_test method
11
+ # @return [String] Container compatible Hash key
12
+ def self.key tst_instance, data_method_name
13
+ Helpers.build_key(tst_instance, data_method_name)
14
+ end
15
+
16
+ # @!attribute [r] data_method_name
17
+ # @return [String] The name of the data test method
18
+ attr_reader :data_method_name
19
+
20
+ # @!attribute [r] test_instance
21
+ # @return [TestCase] The ActiveSupport::TestCase instance of the data test
22
+ attr_reader :test_instance
23
+
24
+ # @!visibility private
25
+ # @param [String] data_method_name The name of test method to be called
26
+ # @param [TestCase] tst_instance The instance containing the data_method_name
27
+ def initialize(data_method_name, tst_instance)
28
+ @data_method_name = data_method_name; @test_instance = tst_instance
29
+ @loaded_data = {}; @invoked_data = {}
30
+ ::Datum.send(:add_container, self,
31
+ Container.key(@test_instance, @data_method_name))
32
+ end
33
+
34
+ # @!attribute [r] count
35
+ # @return [int] The total number of tests / data elements / datums
36
+ def count; @loaded_data.count + @invoked_data.count; end;
37
+
38
+ # @!attribute [r] data
39
+ # A Hash of data elements, datum structs for the test case
40
+ #
41
+ # @return [Hash] A Hash of data elements, datum structs for the test case
42
+ def data; @loaded_data.merge(@invoked_data); end
43
+
44
+ alias_method :length, :count
45
+ alias_method :size, :count
46
+ alias_method :test_count, :count
47
+
48
+ private
49
+
50
+ def add_datum datum
51
+ test_name = Helpers.build_test_name(data_method_name, test_count + 1)
52
+ @loaded_data[Datum.key(test_instance, test_name)] = datum
53
+ add_data_test test_name
54
+ [count, test_name]
55
+ end
56
+
57
+ def invoke_datum key, tst_case
58
+ @invoked_data[key] = datum = @loaded_data.delete(key)
59
+ tst_case.instance_variable_set :@datum, datum
60
+ tst_case.send datum.container.data_method_name
61
+ end
62
+
63
+ def add_data_test test_name
64
+ test_instance.send(:define_method, test_name) do
65
+ datum_key = Datum.key(nm = self.class.to_s, __method__)
66
+ container_key = Container.key(nm,
67
+ Helpers.data_method_from_test_name(__method__))
68
+ ::Datum.containers[container_key].send(:invoke_datum, datum_key, self)
69
+ end
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,60 @@
1
+ require "datum/container"
2
+ require "datum/helpers"
3
+ require "plan9/structures"
4
+
5
+ module Datum
6
+ # Datum ImmutableStruct to be extended by data_test test cases
7
+ class Datum < Plan9::ImmutableStruct
8
+ # Creates a Hash key formatted for use with a Datum
9
+ #
10
+ # @param [TestCase] test_instance The TestCase instance for the test
11
+ # @param [String] test_name The name of the test
12
+ # @return [String] Datum compatible Hash key
13
+ def self.key test_instance, test_name
14
+ Helpers.build_key(test_instance, test_name)
15
+ end
16
+
17
+ # @!visibility private
18
+ def self.new(*attrs, &block)
19
+ attrs.push "datum_id"
20
+ super(*attrs, &block)
21
+ end
22
+
23
+ protected
24
+
25
+ def self.init_new(struct)
26
+ super(struct)
27
+ datumize_constructor!(struct)
28
+ struct
29
+ end
30
+
31
+ private
32
+ def self.datumize_constructor! struct
33
+
34
+ struct.class_eval do
35
+ alias_method :datum_initialize, :initialize
36
+
37
+ # @!attribute [r] test_method_name
38
+ # @return [String] The name of the test method
39
+ attr_reader :test_method_name
40
+
41
+ # @!attribute [r] container
42
+ # @return [Container] A reference to the Container of this Datum
43
+ attr_reader :container
44
+
45
+ # @!visibility private
46
+ def initialize(*atrs)
47
+ dtm_id = configure_attributes
48
+ is_hash_case?(*atrs) ? atrs.first[:datum_id] = dtm_id : atrs.push(dtm_id)
49
+ datum_initialize(*atrs)
50
+ end
51
+
52
+ private
53
+ def configure_attributes
54
+ @container = ::Datum.send(:current_container)
55
+ (dtm_id, @test_method_name = @container.send(:add_datum, self))[0]
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,61 @@
1
+ module Datum
2
+
3
+ # @!visibility private
4
+ # Various helper functions
5
+ class Helpers
6
+ class << self
7
+
8
+ # @param [String] test_name Test case name generated from data_test usage
9
+ # @return [int] The index of the data_test / datum_id
10
+ def index_from_test_name test_name
11
+ ((test_name.to_s.split('_')[-1]).to_i)
12
+ end
13
+
14
+ # @param [String] test_name Test case name generated from data_test usage
15
+ # @return [String] Name of the data_test method which generated the test
16
+ def data_method_from_test_name test_name
17
+ test_name.slice(/(?<=_).*(?=_)/)
18
+ end
19
+
20
+ # @param [String] data_method_name The name of the data_test method
21
+ # @param [int] counter The index / datum_id of the current test case
22
+ # @return [String] Test name for current test case, index, data_test method
23
+ def build_test_name data_method_name, counter
24
+ "test_#{data_method_name}_#{counter}"
25
+ end
26
+
27
+ # @param [TestCase] test_instance The ActiveSupport::TestCase instance
28
+ # @param [String] method The name of the method
29
+ # @return [String] A key for usage in Datum-compatible Hash instances
30
+ def build_key test_instance, method
31
+ "#{test_instance}_#{method}"
32
+ end
33
+
34
+ # @param [String] file_name The name of the file to read
35
+ # @param [Pathname] directory A Pathname representing the file's directory
36
+ # @param [String] ext Optional extention of the file (default: '.rb')
37
+ # @return [String] The file's contents
38
+ def read_file file_name, directory, ext = ".rb"
39
+ File.read directory.join("#{file_name}#{ext}")
40
+ end
41
+
42
+ # Reads a ruby file and eval's it's contents at the current code location
43
+ #
44
+ # @param [String] file_name The name of the file to import
45
+ # @param [Pathname] directory A Pathname representing the file's directory
46
+ # @param [Binding] current_binding Context at a particular code location
47
+ def import_file file_name, directory, current_binding
48
+ eval(read_file(file_name, directory), current_binding)
49
+ end
50
+
51
+ # @param [ActiveRecord::Base] resource An ActiveRecord Model instance
52
+ # @param [Hash] override_hash Hash of attributes / values to override from
53
+ # @return [Hash] Hash of attributes from provided resource
54
+ def clone_resource resource, override_hash = nil
55
+ override_hash.nil? ? resource.dup.attributes.with_indifferent_access :
56
+ resource.dup.attributes.merge(
57
+ override_hash.with_indifferent_access).with_indifferent_access
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,10 @@
1
+ module Datum
2
+ VERSION = "4.0.5"
3
+ end
4
+
5
+
6
+ ## 0.8.1 - 0.9.2
7
+ ## Original datum, proof-of-concept
8
+ ##
9
+ ## 4.0.0
10
+ ## Full rewrite, updated with latest concepts and code -- Still in Testing
data/lib/datum.rb ADDED
@@ -0,0 +1,37 @@
1
+
2
+ require "datum/helpers"
3
+ require "datum/datum"
4
+ require "datum/container"
5
+ require "support/test"
6
+ require "support/scenario"
7
+
8
+ # Datum is a flexible data-driven test solution for Rails
9
+ module Datum
10
+ @@all_containers, @@scenario_path, @@data_path, @@datum_path = nil
11
+
12
+ class << self
13
+
14
+ # @!attribute [r] path
15
+ # @return [Pathname] Fully qualified path for the root of datum directory
16
+ def path; @@datum_path ||= Rails.root.join('test', 'datum'); end
17
+
18
+ # @!attribute [r] data_path
19
+ # @return [Pathname] Fully qualified path for the datum/data directory
20
+ def data_path; @@data_path ||= ::Datum.path.join('data'); end
21
+
22
+ # @!attribute [r] scenario_path
23
+ # @return [Pathname] Fully qualified path for the datum/scenarios directory
24
+ def scenario_path; @@scenario_path ||= ::Datum.path.join('scenarios'); end
25
+
26
+ # @!attribute [r] containers
27
+ # @return [Hash] Hash of all loaded Containers
28
+ def containers; @@all_containers ||= {}; end
29
+
30
+ private
31
+ def add_container container, key
32
+ ::Datum.containers[key] = container
33
+ ::Datum.instance_variable_set(:"@current_container", container)
34
+ end
35
+ def current_container; @current_container; end;
36
+ end
37
+ end
@@ -0,0 +1,74 @@
1
+ # @!visibility private
2
+ module Plan9 # Module for simple code reuse between various projects.
3
+
4
+ class ImprovedStruct # A few improvements to a Ruby Struct
5
+ #
6
+ # Re-organized slightly, this code is reused from 'ImmutableStruct'
7
+ # by Theo Hultberg. See https://github.com/iconara/immutable_struct
8
+ # Copyright notice mentioned in the LICENSE file.
9
+ #
10
+ def self.new(*attrs, &block)
11
+ init_new(Struct.new(*attrs, &block))
12
+ end
13
+
14
+ protected
15
+ def self.init_new(struct)
16
+ optionalize_constructor!(struct)
17
+ extend_dup!(struct)
18
+ struct
19
+ end
20
+
21
+ private
22
+ def self.optionalize_constructor!(struct)
23
+ struct.class_eval do
24
+ alias_method :struct_initialize, :initialize
25
+
26
+ def initialize(*attrs)
27
+ if is_hash_case?(*attrs)
28
+ struct_initialize(*members.map { |m| attrs.first[m.to_sym] })
29
+ else
30
+ struct_initialize(*attrs)
31
+ end
32
+ end
33
+
34
+ protected
35
+ def is_hash_case?(*a)
36
+ # @return (bool) true if attrs are Hash, false otherwise
37
+ members.size > 1 && a && a.size == 1 && a.first.instance_of?(Hash)
38
+ end
39
+ end
40
+ end
41
+
42
+ def self.extend_dup!(struct)
43
+ struct.class_eval do
44
+ def dup(overrides={})
45
+ self.class.new(to_h.merge(overrides))
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ class ImmutableStruct < ImprovedStruct # A read-only Struct
52
+ # Re-organized slightly, this code is reused from 'ImmutableStruct'
53
+ # by Theo Hultberg. See https://github.com/iconara/immutable_struct
54
+ # Copyright notice mentioned in the LICENSE file.
55
+
56
+ protected
57
+
58
+ def self.init_new(struct)
59
+ make_immutable!(struct)
60
+ super(struct)
61
+ end
62
+
63
+ private
64
+
65
+ def self.make_immutable!(struct)
66
+ # removes the member= method, to prevent write
67
+ struct.send(:undef_method, "[]=".to_sym)
68
+ struct.members.each do |member|
69
+ struct.send(:undef_method, "#{member}=".to_sym)
70
+ end
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,16 @@
1
+
2
+ # For use in a scenario file, imports an existing scenario's code and objects
3
+ #
4
+ # @param [symbol, String] scenario_name The name of a scenario file
5
+ def __import scenario_name
6
+ ::Datum::Helpers.import_file scenario_name, ::Datum.scenario_path, binding
7
+ end
8
+
9
+ # For use in a scenario file, clones the attributes of an existing instance
10
+ #
11
+ # @param [ActiveRecord::Base] resource An ActiveRecord Model instance
12
+ # @param [Hash] override_hash Hash of attributes / values to override from
13
+ # @return [Hash] Hash of attributes from provided resource
14
+ def __clone resource, override_hash = nil
15
+ ::Datum::Helpers.clone_resource resource, override_hash
16
+ end
@@ -0,0 +1,28 @@
1
+ require "datum/helpers"
2
+ require "datum/container"
3
+ require "datum/datum"
4
+
5
+ # Extends ActiveSupport::Test with the process_scenario method and includes
6
+ # the Datum module
7
+ #
8
+ # @note Supports most extending test types (functional, integration, etc)
9
+ class ActiveSupport::TestCase
10
+ include Datum
11
+ # Imports a scenario file into the execution context of the current test
12
+ #
13
+ # @param [symbol, String] scenario_name The name of a scenario file
14
+ def process_scenario scenario_name
15
+ __import(scenario_name)
16
+ end
17
+ end
18
+
19
+ # Defines a test to work in conjuction with Datum struct extensions found in
20
+ # a file with the same name in the test/datum/data directory
21
+ #
22
+ # @param [String] name Name of the file in the datum/data directory
23
+ # @param [Block] block A block of Ruby code
24
+ def data_test name, &block
25
+ ::Datum::Container.new(name, self)
26
+ self.send(:define_method, name, &block)
27
+ self.class_eval(::Datum::Helpers.read_file(name, ::Datum.data_path))
28
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datum
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.4
4
+ version: 4.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyemill
@@ -9,42 +9,25 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2015-02-15 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rails
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 4.1.7
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 4.1.7
27
- - !ruby/object:Gem::Dependency
28
- name: pg
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
12
+ dependencies: []
41
13
  description: Flexible data-driven test solution for Rails
42
14
  email:
43
15
  - datum@tyemill.com
44
16
  executables: []
45
17
  extensions: []
46
18
  extra_rdoc_files: []
47
- files: []
19
+ files:
20
+ - MIT-LICENSE
21
+ - README.md
22
+ - Rakefile
23
+ - lib/datum.rb
24
+ - lib/datum/container.rb
25
+ - lib/datum/datum.rb
26
+ - lib/datum/helpers.rb
27
+ - lib/datum/version.rb
28
+ - lib/plan9/structures.rb
29
+ - lib/support/scenario.rb
30
+ - lib/support/test.rb
48
31
  homepage: https://github.com/tyemill/datum
49
32
  licenses:
50
33
  - MIT