cockroach 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.rvmrc +1 -0
  2. data/Gemfile +28 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +124 -0
  5. data/Rakefile +37 -0
  6. data/VERSION +1 -0
  7. data/cockroach.gemspec +96 -0
  8. data/lib/cockroach.rb +43 -0
  9. data/lib/cockroach/base/load_nodes.rb +38 -0
  10. data/lib/cockroach/base/node.rb +192 -0
  11. data/lib/cockroach/base/node_structure.rb +11 -0
  12. data/lib/cockroach/config.rb +54 -0
  13. data/lib/cockroach/config/loader.rb +35 -0
  14. data/lib/cockroach/fixtures/factory_girl.rb +4 -0
  15. data/lib/cockroach/fixtures/factory_girl/loader.rb +43 -0
  16. data/lib/cockroach/fixtures/factory_girl/node.rb +51 -0
  17. data/lib/cockroach/fixtures/factory_girl/profiler.rb +34 -0
  18. data/lib/cockroach/railtie.rb +7 -0
  19. data/lib/cockroach/source.rb +40 -0
  20. data/lib/cockroach/source/model.rb +33 -0
  21. data/lib/cockroach/source/node.rb +27 -0
  22. data/lib/cockroach/version.rb +3 -0
  23. data/lib/generators/cockroach/install_generator.rb +20 -0
  24. data/lib/generators/cockroach/templates/cockroach.rb +8 -0
  25. data/lib/generators/cockroach/templates/faker.yml +16 -0
  26. data/lib/tasks/faker.rake +35 -0
  27. data/test/config/config_test.rb +129 -0
  28. data/test/config/loader_test.rb +42 -0
  29. data/test/fixturers/factory_girl/aliasing_test.rb +151 -0
  30. data/test/fixturers/factory_girl/loading_test.rb +45 -0
  31. data/test/fixturers/factory_girl/node_test.rb +386 -0
  32. data/test/fixturers/factory_girl/profiler_test.rb +124 -0
  33. data/test/fixturers/source_test.rb +153 -0
  34. data/test/generators/install_generator_test.rb +14 -0
  35. data/test/support/active_record.rb +11 -0
  36. data/test/support/data/correct_with_option.yml +13 -0
  37. data/test/support/data/correct_without_option.yml +10 -0
  38. data/test/support/data/dummy_structure/config/faker.yml +13 -0
  39. data/test/support/data/dummy_structure/config/user_only.yml +1 -0
  40. data/test/support/data/dummy_structure/config/witness.yml +6 -0
  41. data/test/support/data/dummy_structure/test/factories/user_factory.rb +16 -0
  42. data/test/support/database_cleaner.rb +13 -0
  43. data/test/support/factory_girl_mocked.rb +32 -0
  44. data/test/support/models/user.rb +23 -0
  45. data/test/test_helper.rb +26 -0
  46. metadata +151 -0
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use --create 1.9.3@artirix_faker
data/Gemfile ADDED
@@ -0,0 +1,28 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "activerecord", :require => false
4
+ gem "activesupport", :require => false
5
+ gem "faker"
6
+
7
+ group :development do
8
+ gem "yard", "~> 0.6.0"
9
+ gem "jeweler", "~> 1.6.4"
10
+ end
11
+
12
+ group :test do
13
+ gem "rails"
14
+ gem "test-unit"
15
+ gem 'shoulda-context'
16
+ gem "mocha"
17
+
18
+ gem "factory_girl"
19
+
20
+ gem "simplecov", "~> 0.6.4", :platform => :ruby_19
21
+ gem "rcov", "~> 1.0.0", :platform => :ruby_18
22
+
23
+ gem "debugger", "~> 1.1.3", :platform => :ruby_19
24
+ gem 'ruby-debug', :platform => :ruby_18
25
+
26
+ gem "database_cleaner", :group => :test
27
+ gem "sqlite3", :group => :test
28
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 TODO: Write your name
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.
@@ -0,0 +1,124 @@
1
+ # Cockroach
2
+
3
+ Cockroach allows you to simplify faking the database, during development. Idea is simple:
4
+ There are ready fixtures in your database. **YOU SHOULD REUSE THEM!**
5
+
6
+ Well, one may say that you you should follow TDD/BDD, hence there is no need in this gem.
7
+ But wait, what about designers? Shall they follow this approach as well? You want to spend your time
8
+ explaining them the process? Sure, go ahead!
9
+
10
+ # Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'cockroach'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it as:
21
+
22
+ $ gem install cockroach
23
+
24
+ # After instalation
25
+
26
+ After the gem was installed, all the required files may now be generated with Rails generator:
27
+
28
+ $ bundle exec rails g cockroach:install
29
+
30
+ That will create config/faker.yml
31
+
32
+ # Rake tasks
33
+
34
+ There are several rake tasks available:
35
+
36
+ rake cockroach:validate
37
+
38
+ The task above will validate your config file after you edited it.
39
+
40
+ rake cockroach:generate
41
+
42
+ After, you validated your file, you may now proceed to generation.
43
+
44
+ rake cockroach:reload
45
+
46
+ In case you would like to to have a new and nice database, just run the task above.
47
+ That will drop and create existing DB, apply all migrations, seed the database and generate fake data afterwards.
48
+
49
+ # Usage
50
+
51
+ Cockroach will try to find your fixtures first. Once it is done:
52
+ There are several ways how to specify the required amount of the records:
53
+
54
+ ### First way is *simple*:
55
+
56
+ Just specify the amount of the records that are require or provide the range:
57
+ An example:
58
+
59
+ #a strict amount
60
+ users_amount: 1000 # what will generate 1000 records for user factory
61
+
62
+ #or a fuzzy way
63
+ feeds_ratio: 1000 # what will generate a random amount of users, in the range between 500 and 2000.
64
+
65
+ **amount** - will just generate the strict amount of record. In the example above,
66
+ there will be 1000 users in the database.
67
+
68
+ **ratio** - will pick a random amount of Feed records, within a range a range.
69
+ By default, the limitations are obeying the following principle:
70
+ `(specified_number/2, specified_number*2)`
71
+ NB! It will **ALWAYS** be flored Integer.
72
+
73
+ This method is helpful, once you are dealing with data structure you can consider as simple.
74
+ So you need to create a specific amount of records, without any subsequential creation.
75
+
76
+ ### Next way is *simple subsequential*:
77
+
78
+ You can specify the amount of records one level under the record type:
79
+ An examples:
80
+
81
+ # a strict amount
82
+ business:
83
+ amount: 1000
84
+
85
+ # or fuzzy way:
86
+ users:
87
+ ratio: 1000
88
+
89
+ # or more fuzzy way:
90
+ users:
91
+ ratio:
92
+ lower_limit: 300
93
+ upper_limit: 10000
94
+
95
+ **amount** and **ratio** have same meaning as in the previous example.
96
+ In the last example, the amount will be a random number, within `(lower_limit..upper_limit)`
97
+
98
+ ### Next way is *complicated subsequential*:
99
+
100
+ It is often required to generate a associated models, like in case when
101
+ City'es may have many associated Place'es.
102
+ A brief examples:
103
+
104
+ # simple case
105
+ cities:
106
+ amount: 1000
107
+ places_ratio: 300
108
+
109
+ # or a bit more complecated
110
+ cities:
111
+ amount: 1000
112
+ places:
113
+ ratio:
114
+ lower_limit: 100
115
+ upper_limit: 1000
116
+ address_amount: 1
117
+
118
+ ### Contributing
119
+
120
+ 1. Fork it
121
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
122
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
123
+ 4. Push to the branch (`git push origin my-new-feature`)
124
+ 5. Create new Pull Request
@@ -0,0 +1,37 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "cockroach"
16
+ gem.homepage = "https://github.com/artirix/cockroach"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{This gem allows one to fake all the date for the Artirix project}
19
+ gem.description = %Q{In order to simplify the life of the Artirix developers, this gem was build.
20
+ It allows to generate the data, and fill teh database with fake records.}
21
+ gem.email = "max.zab@artirix.com"
22
+ gem.authors = ["E-Max"]
23
+ # dependencies defined in Gemfile
24
+ end
25
+ Jeweler::RubygemsDotOrgTasks.new
26
+
27
+ require 'rake/testtask'
28
+ Rake::TestTask.new(:test) do |test|
29
+ test.libs << 'lib' << 'test'
30
+ test.pattern = 'test/**/*_test.rb'
31
+ test.verbose = true
32
+ end
33
+
34
+ task :default => :test
35
+
36
+ require 'yard'
37
+ YARD::Rake::YardocTask.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,96 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "cockroach"
8
+ s.version = "0.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["E-Max"]
12
+ s.date = "2012-10-12"
13
+ s.description = "In order to simplify the life of the Artirix developers, this gem was build.\n It allows to generate the data, and fill teh database with fake records."
14
+ s.email = "max.zab@artirix.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".rvmrc",
21
+ "Gemfile",
22
+ "LICENSE.txt",
23
+ "README.md",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "cockroach.gemspec",
27
+ "lib/cockroach.rb",
28
+ "lib/cockroach/base/load_nodes.rb",
29
+ "lib/cockroach/base/node.rb",
30
+ "lib/cockroach/base/node_structure.rb",
31
+ "lib/cockroach/config.rb",
32
+ "lib/cockroach/config/loader.rb",
33
+ "lib/cockroach/fixtures/factory_girl.rb",
34
+ "lib/cockroach/fixtures/factory_girl/loader.rb",
35
+ "lib/cockroach/fixtures/factory_girl/node.rb",
36
+ "lib/cockroach/fixtures/factory_girl/profiler.rb",
37
+ "lib/cockroach/railtie.rb",
38
+ "lib/cockroach/source.rb",
39
+ "lib/cockroach/source/model.rb",
40
+ "lib/cockroach/source/node.rb",
41
+ "lib/cockroach/version.rb",
42
+ "lib/generators/cockroach/install_generator.rb",
43
+ "lib/generators/cockroach/templates/cockroach.rb",
44
+ "lib/generators/cockroach/templates/faker.yml",
45
+ "lib/tasks/faker.rake",
46
+ "test/config/config_test.rb",
47
+ "test/config/loader_test.rb",
48
+ "test/fixturers/factory_girl/aliasing_test.rb",
49
+ "test/fixturers/factory_girl/loading_test.rb",
50
+ "test/fixturers/factory_girl/node_test.rb",
51
+ "test/fixturers/factory_girl/profiler_test.rb",
52
+ "test/fixturers/source_test.rb",
53
+ "test/generators/install_generator_test.rb",
54
+ "test/support/active_record.rb",
55
+ "test/support/data/correct_with_option.yml",
56
+ "test/support/data/correct_without_option.yml",
57
+ "test/support/data/dummy_structure/config/faker.yml",
58
+ "test/support/data/dummy_structure/config/user_only.yml",
59
+ "test/support/data/dummy_structure/config/witness.yml",
60
+ "test/support/data/dummy_structure/test/factories/user_factory.rb",
61
+ "test/support/database_cleaner.rb",
62
+ "test/support/factory_girl_mocked.rb",
63
+ "test/support/models/user.rb",
64
+ "test/test_helper.rb"
65
+ ]
66
+ s.homepage = "https://github.com/artirix/cockroach"
67
+ s.licenses = ["MIT"]
68
+ s.require_paths = ["lib"]
69
+ s.rubygems_version = "1.8.10"
70
+ s.summary = "This gem allows one to fake all the date for the Artirix project"
71
+
72
+ if s.respond_to? :specification_version then
73
+ s.specification_version = 3
74
+
75
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
76
+ s.add_runtime_dependency(%q<activerecord>, [">= 0"])
77
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
78
+ s.add_runtime_dependency(%q<faker>, [">= 0"])
79
+ s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
80
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
81
+ else
82
+ s.add_dependency(%q<activerecord>, [">= 0"])
83
+ s.add_dependency(%q<activesupport>, [">= 0"])
84
+ s.add_dependency(%q<faker>, [">= 0"])
85
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
86
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
87
+ end
88
+ else
89
+ s.add_dependency(%q<activerecord>, [">= 0"])
90
+ s.add_dependency(%q<activesupport>, [">= 0"])
91
+ s.add_dependency(%q<faker>, [">= 0"])
92
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
93
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
94
+ end
95
+ end
96
+
@@ -0,0 +1,43 @@
1
+ require "active_support/dependencies/autoload"
2
+ require "active_support/core_ext/module"
3
+ require "cockroach/railtie" if defined?(Rails)
4
+
5
+ module Cockroach
6
+ extend ActiveSupport::Autoload
7
+
8
+ autoload :VERSION
9
+ autoload :Config
10
+
11
+ autoload :Source
12
+
13
+ module Base
14
+ autoload :Node, 'cockroach/base/node'
15
+ autoload :LoadNodes, 'cockroach/base/load_nodes'
16
+ end
17
+
18
+ autoload_under 'fixtures' do
19
+ autoload :FactoryGirl
20
+ end
21
+
22
+ class InvalideStructureError < Exception; end
23
+ class MissingFixtureError < Exception; end
24
+
25
+ mattr_reader :config
26
+
27
+ class << self
28
+ delegate :profiler, :to => :config
29
+
30
+ def setup &block
31
+ block.yield(Cockroach::Config)
32
+ @@config = Cockroach::Config.new (Cockroach::Config.config_path || "config/faker.yml")
33
+ load_fixturer
34
+ end
35
+
36
+ private
37
+
38
+ #
39
+ def load_fixturer
40
+ self.const_get(@@config.fixturer)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,38 @@
1
+ require 'active_support/concern'
2
+
3
+ module Cockroach
4
+ module Base
5
+ module LoadNodes
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ attr_reader :nodes
10
+
11
+ def load! *agrs
12
+ raise "Abstract method"
13
+ end
14
+
15
+ def nodes
16
+ @nodes ||= {}
17
+ end
18
+
19
+ protected
20
+
21
+ # Parse structure file and create a branch of sub nodes.
22
+ def load_nodes
23
+ @structure.each do |name, structure|
24
+ node = Cockroach::FactoryGirl::Node.new(name, structure, {:parrent => self})
25
+ nodes[node.node_name] = node
26
+ end
27
+ end
28
+
29
+ # Load all the sub nodes
30
+ def load_nodes! fixturer_opts = nil
31
+ nodes.each_value do |node|
32
+ node.load! fixturer_opts
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,192 @@
1
+ require "cockroach/base/node_structure"
2
+
3
+ module Cockroach
4
+ module Base
5
+ # Node deals only with a specific records class. It makes sure that
6
+ # fixtures are created specific amount of time and will make sure that
7
+ # the associations are correctly assigned.
8
+ class Node
9
+ include Cockroach::Base::LoadNodes
10
+ include Cockroach::Base::NodeStructure
11
+
12
+ APPROACHES = %w(amount ratio).freeze
13
+
14
+ class << self
15
+ # Method validating structure for Node operations.
16
+ # It will only accepts a structure if it is a Hash object,
17
+ # with one key only.
18
+ # In any other case a _false_ value will be returned
19
+ def valid_structure? structure
20
+ structure.is_a?(Hash) && structure.keys.size == 1 ||
21
+ structure.is_a?(Array) && structure.size == 2
22
+ end
23
+
24
+ # Deduct the information from Node instance name:
25
+ # will try to get:
26
+ # name: compulsary
27
+ # approach: optional
28
+ # Returns array containing name and approach
29
+ #
30
+ # Example:
31
+ #
32
+ # # no apprach
33
+ # ["users", nil]
34
+ #
35
+ # # ratio apprach
36
+ # ["users", "ratio"]
37
+ def extract_info symbol_or_string
38
+ symbol_or_string = symbol_or_string.to_s
39
+ approach = (symbol_or_string.match(/_(#{APPROACHES.join('|')})$/)[1] rescue nil)
40
+ symbol_or_string.gsub!(/(_#{APPROACHES.join('|_')})$/,'') unless approach.blank?
41
+ [symbol_or_string.to_s.singularize, approach]
42
+ end
43
+ end
44
+
45
+ attr_reader :name, :approach, :ids, :source
46
+
47
+ delegate :find, :sample, :to => :source
48
+
49
+ def initialize *opts
50
+ node_name, @structure, @options = extract_params_from_attrs *opts
51
+ @name, @approach = self.class.extract_info(node_name.dup)
52
+ @ids = []
53
+ @source = define_source if @structure.is_a?(Hash)
54
+
55
+ if @approach.blank?
56
+ extract_options
57
+ complicated_approch
58
+ load_nodes
59
+ else
60
+ simple_approach
61
+ end
62
+
63
+ raise InvalideStructureError.new("Approch was not specified") if @approach.blank?
64
+ raise MissingFixtureError.new("Approch was not specified") if @approach.blank?
65
+
66
+ after_initialize
67
+ end
68
+
69
+ # Just in case Fixturer requires anything to be done after the node initialization
70
+ def after_initialize
71
+ end
72
+
73
+ # Keeps the number, that represents the amount of the records that will
74
+ # created for this node.
75
+ # This will be the final number of the records that are going to be created.
76
+ # In case there was a ratio specified, that method will randomly get a
77
+ # number within the provided range and keep it.
78
+ def amount
79
+ @amount || get_random_amount
80
+ end
81
+
82
+ # Returns an aliased node name. The one that will be used for keeping it
83
+ # in sup and sub structures
84
+ def node_name
85
+ @alias_as || @name
86
+ end
87
+
88
+ protected
89
+
90
+ # There are four possible options here
91
+ # - structure
92
+ # - node_name, structure
93
+ # - structure, options
94
+ # - node_name, structure, options
95
+ def extract_params_from_attrs *attrs
96
+ structure = if attrs.size == 1
97
+ attrs.first
98
+ elsif attrs.size == 3
99
+ options = attrs.pop
100
+ attrs
101
+ else
102
+ options = attrs.pop if attrs.first.is_a?(Hash)
103
+ attrs
104
+ end
105
+
106
+ raise InvalideStructureError.new("Node has faced invalid structure") unless self.class.valid_structure?(structure)
107
+ structure.flatten << (options || {})
108
+ end
109
+
110
+ # Complicated approach is used, once the amount directives were specified
111
+ # within node subconfig.
112
+ def complicated_approch
113
+ approach = @options.select { |k,v| APPROACHES.include? k }
114
+ raise InvalideStructureError.new("Amount is not specified or specified multiple times") unless approach.keys.size == 1
115
+ case (@approach = approach.keys[0])
116
+ when "amount"
117
+ @amount = @options[@approach].to_i
118
+ when "ratio"
119
+ @options[@approach].is_a?(String) || @options[@approach].kind_of?(Numeric) ?
120
+ set_simple_limits(@options[@approach].to_i) :
121
+ extract_limits(@options[@approach])
122
+ end
123
+ end
124
+
125
+ # Simple approach is used when the amount of the records is specified as the
126
+ # Yaml node content, and the way this number should be treated as a node
127
+ # suffix
128
+ def simple_approach
129
+ case @approach
130
+ when "amount"
131
+ @amount = @structure.to_i
132
+ when "ratio"
133
+ set_simple_limits @structure.to_i
134
+ end
135
+ end
136
+
137
+ # Clear the node subconfig. Will extract all the options or directives from
138
+ # provided Hash, and assigne the to the corresponding variables.
139
+ def extract_options
140
+ @options.merge! @structure.extract!(*APPROACHES).delete_if {|k,v| v.nil?}
141
+ @alias_as = @structure.delete("as")
142
+ @structure.each_pair {| key, value | (@aliases ||= {})[$1] = value if key =~ /^(.*)_as$/ }
143
+ @structure.delete_if {| key, value | key =~ /_as$/ }
144
+ end
145
+
146
+ # Defines a simple limits for random amount. It is as simple as
147
+ # lowest possible value a half of middle_line
148
+ # highest value is twice the middle_line
149
+ def set_simple_limits middle_line
150
+ @upper_limit, @lower_limit = [middle_line / 2, middle_line * 2]
151
+ end
152
+
153
+ def extract_limits hash
154
+ @upper_limit, @lower_limit = [hash['lower_limit'].to_i, hash['upper_limit'].to_i]
155
+ end
156
+
157
+ # Returns manimum and minumum options within an array, for the amount of
158
+ # the records, that will be used to generate the amount of the records
159
+ # that will created for this node.
160
+ #
161
+ # Example:
162
+ #
163
+ # [5, 12]
164
+ def get_limits
165
+ [@upper_limit, @lower_limit]
166
+ end
167
+
168
+ # Generates the number, that represents the amount of the records that will
169
+ # created for this node.
170
+ def get_random_amount
171
+ min, max = get_limits
172
+
173
+ if max - min > 0
174
+ min + Random.rand(max - min)
175
+ else
176
+ min
177
+ end
178
+ end
179
+
180
+ # Returns orm class deducted from fixturer
181
+ def orm_class
182
+ raise "Implement"
183
+ end
184
+
185
+ def define_source
186
+ source_refs = @structure.delete('source')
187
+ return unless source_refs
188
+ Cockroach::Source.get_source source_refs
189
+ end
190
+ end
191
+ end
192
+ end