ztk 0.3.1 → 1.0.0.rc.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +7 -5
- data/.yardopts +2 -0
- data/README.md +3 -3
- data/Rakefile +39 -0
- data/lib/ztk/background.rb +14 -6
- data/lib/ztk/base.rb +20 -5
- data/lib/ztk/benchmark.rb +33 -1
- data/lib/ztk/command.rb +24 -14
- data/lib/ztk/config.rb +0 -1
- data/lib/ztk/dsl/base.rb +76 -0
- data/lib/ztk/dsl/core/actions/find.rb +49 -0
- data/lib/ztk/dsl/core/actions/timestamps.rb +47 -0
- data/lib/ztk/dsl/core/actions.rb +34 -0
- data/lib/ztk/dsl/core/attributes.rb +53 -0
- data/lib/ztk/dsl/core/dataset.rb +66 -0
- data/lib/ztk/dsl/core/io.rb +41 -0
- data/lib/ztk/dsl/core/relations/belongs_to.rb +135 -0
- data/lib/ztk/dsl/core/relations/has_many.rb +105 -0
- data/lib/ztk/dsl/core/relations.rb +45 -0
- data/lib/ztk/dsl/core.rb +77 -0
- data/lib/ztk/dsl.rb +34 -0
- data/lib/ztk/logger.rb +14 -1
- data/lib/ztk/parallel.rb +2 -2
- data/lib/ztk/report.rb +43 -1
- data/lib/ztk/rescue_retry.rb +39 -1
- data/lib/ztk/spinner.rb +27 -8
- data/lib/ztk/ssh.rb +29 -28
- data/lib/ztk/tcp_socket_check.rb +1 -2
- data/lib/ztk/template.rb +0 -1
- data/lib/ztk/ui.rb +47 -0
- data/lib/ztk/version.rb +4 -1
- data/lib/ztk.rb +20 -14
- data/spec/ztk/background_spec.rb +60 -0
- data/spec/ztk/dsl_spec.rb +635 -0
- data/ztk.gemspec +4 -2
- metadata +38 -9
data/.travis.yml
CHANGED
@@ -4,10 +4,12 @@ rvm:
|
|
4
4
|
- 1.9.2
|
5
5
|
- 1.9.3
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
before_install:
|
8
|
+
- sudo apt-get -qq update
|
9
|
+
|
10
|
+
bundler_args: --binstubs
|
11
|
+
|
12
|
+
script: "rake spec"
|
10
13
|
|
11
14
|
notifications:
|
12
|
-
irc:
|
13
|
-
- "irc.freenode.org#jovelabs"
|
15
|
+
irc: "irc.freenode.net#jovelabs"
|
data/.yardopts
ADDED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# ZTK
|
4
4
|
|
5
|
-
Zachary's Tool Kit is a general purpose utility gem, featuring a collection of classes meant to simplify development of complex systems in Ruby.
|
5
|
+
Zachary's (DevOp) Tool Kit is a general purpose utility gem, featuring a collection of classes meant to simplify development of complex systems in Ruby.
|
6
6
|
|
7
7
|
# RESOURCES
|
8
8
|
|
@@ -16,7 +16,7 @@ Issues:
|
|
16
16
|
|
17
17
|
Documentation:
|
18
18
|
|
19
|
-
* http://
|
19
|
+
* http://jovelabs.github.com/ztk/
|
20
20
|
|
21
21
|
Wiki:
|
22
22
|
|
@@ -24,7 +24,7 @@ Wiki:
|
|
24
24
|
|
25
25
|
# LICENSE
|
26
26
|
|
27
|
-
ZTK - Zachary's Tool Kit
|
27
|
+
ZTK - Zachary's (DevOp) Tool Kit
|
28
28
|
|
29
29
|
* Author: Zachary Patten <zachary@jovelabs.net>
|
30
30
|
* Copyright: Copyright (c) Jove Labs
|
data/Rakefile
CHANGED
@@ -41,3 +41,42 @@ task :coverage do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
################################################################################
|
44
|
+
|
45
|
+
require 'yard'
|
46
|
+
require 'yard/rake/yardoc_task'
|
47
|
+
|
48
|
+
GEM_NAME = File.basename(Dir.pwd)
|
49
|
+
DOC_PATH = File.expand_path(File.join("..", "/", "#{GEM_NAME}.doc"))
|
50
|
+
|
51
|
+
namespace :doc do
|
52
|
+
YARD::Rake::YardocTask.new(:pages) do |t|
|
53
|
+
|
54
|
+
# t.files = ['lib/**/*.rb']
|
55
|
+
t.options = ['--verbose', '-o', DOC_PATH]
|
56
|
+
end
|
57
|
+
|
58
|
+
namespace :pages do
|
59
|
+
|
60
|
+
desc 'Generate and publish YARD Documentation to GitHub pages'
|
61
|
+
task :publish => ['doc:pages'] do
|
62
|
+
describe = %x(git describe).chomp
|
63
|
+
stats = %x(bundle exec yard stats).chomp
|
64
|
+
|
65
|
+
commit_message = Array.new
|
66
|
+
commit_message << "Generated YARD Documentation for #{GEM_NAME.upcase} #{describe}\n\n"
|
67
|
+
commit_message << stats
|
68
|
+
|
69
|
+
Dir.chdir(DOC_PATH) do
|
70
|
+
puts(%x{git add -Av})
|
71
|
+
puts(%x{git commit -m"#{commit_message.join}"})
|
72
|
+
puts(%x{git push origin gh-pages})
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
desc 'Alias to doc:yard'
|
80
|
+
task 'doc' => 'doc:yard'
|
81
|
+
|
82
|
+
################################################################################
|
data/lib/ztk/background.rb
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
# limitatIOns under the License.
|
18
18
|
#
|
19
19
|
################################################################################
|
20
|
-
|
21
20
|
require "base64"
|
22
21
|
|
23
22
|
module ZTK
|
@@ -63,10 +62,7 @@ module ZTK
|
|
63
62
|
# Result Set
|
64
63
|
attr_accessor :pid, :result
|
65
64
|
|
66
|
-
# @param [Hash]
|
67
|
-
# @option config [Integer] :max_forks Maximum number of forks to use.
|
68
|
-
# @option config [Proc] :before_fork (nil) Proc to call before forking.
|
69
|
-
# @option config [Proc] :after_fork (nil) Proc to call after forking.
|
65
|
+
# @param [Hash] configuration Configuration options hash.
|
70
66
|
def initialize(configuration={})
|
71
67
|
super({
|
72
68
|
}.merge(configuration))
|
@@ -80,7 +76,7 @@ module ZTK
|
|
80
76
|
#
|
81
77
|
# @yield Block should execute tasks to be performed in background.
|
82
78
|
# @yieldreturn [Object] Block can return any object to be marshalled back to
|
83
|
-
# the parent processes
|
79
|
+
# the parent processes.
|
84
80
|
# @return [Integer] Returns the pid of the child process forked.
|
85
81
|
def process(&block)
|
86
82
|
!block_given? and log_and_raise(BackgroundError, "You must supply a block to the process method!")
|
@@ -121,6 +117,10 @@ module ZTK
|
|
121
117
|
# If a process successfully finished, it's return value from the *process*
|
122
118
|
# block is stored into the result set.
|
123
119
|
#
|
120
|
+
# It's advisable to use something like the *at_exit* hook to ensure you don't
|
121
|
+
# leave orphaned processes. For example, in the *at_exit* hook you could
|
122
|
+
# call *wait* to block until the child process finishes up.
|
123
|
+
#
|
124
124
|
# @return [Array<pid, status, data>] An array containing the pid,
|
125
125
|
# status and data returned from the process block. If wait2() fails nil
|
126
126
|
# is returned.
|
@@ -140,6 +140,14 @@ module ZTK
|
|
140
140
|
nil
|
141
141
|
end
|
142
142
|
|
143
|
+
def alive?
|
144
|
+
(Process.getpgid(@pid).is_a?(Integer) rescue false)
|
145
|
+
end
|
146
|
+
|
147
|
+
def dead?
|
148
|
+
!alive?
|
149
|
+
end
|
150
|
+
|
143
151
|
end
|
144
152
|
|
145
153
|
end
|
data/lib/ztk/base.rb
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
# limitations under the License.
|
18
18
|
#
|
19
19
|
################################################################################
|
20
|
-
|
21
20
|
require "ostruct"
|
22
21
|
|
23
22
|
module ZTK
|
@@ -37,7 +36,7 @@ module ZTK
|
|
37
36
|
|
38
37
|
class << self
|
39
38
|
|
40
|
-
# @param [Hash]
|
39
|
+
# @param [Hash] configuration Configuration options hash.
|
41
40
|
# @option config [IO] :stdout Instance of IO to be used for STDOUT.
|
42
41
|
# @option config [IO] :stderr Instance of IO to be used for STDERR.
|
43
42
|
# @option config [IO] :stdin Instance of IO to be used for STDIN.
|
@@ -81,6 +80,14 @@ module ZTK
|
|
81
80
|
config
|
82
81
|
end
|
83
82
|
|
83
|
+
# Logs an exception and then raises it.
|
84
|
+
#
|
85
|
+
# @param [Logger] logger An instance of a class based off the Ruby
|
86
|
+
# *Logger* class.
|
87
|
+
# @param [Exception] exception The exception class to raise.
|
88
|
+
# @param [String] message The message to display with the exception.
|
89
|
+
# @param [Integer] shift (1) How many places to shift the caller stack in
|
90
|
+
# the log statement.
|
84
91
|
def log_and_raise(logger, exception, message, shift=1)
|
85
92
|
if logger.is_a?(ZTK::Logger)
|
86
93
|
logger.shift(:fatal, shift) { "EXCEPTION: #{exception.inspect} - #{message.inspect}" }
|
@@ -117,8 +124,16 @@ module ZTK
|
|
117
124
|
end
|
118
125
|
end
|
119
126
|
|
120
|
-
|
121
|
-
|
127
|
+
# Logs an exception and then raises it.
|
128
|
+
#
|
129
|
+
# @see Base.log_and_raise
|
130
|
+
#
|
131
|
+
# @param [Exception] exception The exception class to raise.
|
132
|
+
# @param [String] message The message to display with the exception.
|
133
|
+
# @param [Integer] shift (2) How many places to shift the caller stack in
|
134
|
+
# the log statement.
|
135
|
+
def log_and_raise(exception, message, shift=2)
|
136
|
+
Base.log_and_raise(config.logger, exception, message, shift)
|
122
137
|
end
|
123
138
|
|
124
139
|
# Direct logging method.
|
@@ -130,7 +145,7 @@ module ZTK
|
|
130
145
|
# The value returned in the block is passed down to the logger specified in
|
131
146
|
# the classes configuration.
|
132
147
|
#
|
133
|
-
# @param [Symbol]
|
148
|
+
# @param [Symbol] log_level This should be any one of [:debug, :info, :warn, :error, :fatal].
|
134
149
|
# @yield No value is passed to the block.
|
135
150
|
# @yieldreturn [String] The message to log.
|
136
151
|
def direct_log(log_level, &blocK)
|
data/lib/ztk/benchmark.rb
CHANGED
@@ -26,13 +26,45 @@ module ZTK
|
|
26
26
|
# @author Zachary Patten <zachary@jovelabs.net>
|
27
27
|
class BenchmarkError < Error; end
|
28
28
|
|
29
|
-
# Benchmark Class
|
29
|
+
# ZTK Benchmark Class
|
30
|
+
#
|
31
|
+
# This class contains a benchmarking tool which doubles to supply indications
|
32
|
+
# of activity to the console user during long running tasks.
|
33
|
+
#
|
34
|
+
# It can be run strictly for benchmarking (the default) or if supplied with
|
35
|
+
# the appropriate options it will display output to the user while
|
36
|
+
# benchmarking the supplied block.
|
30
37
|
#
|
31
38
|
# @author Zachary Patten <zachary@jovelabs.net>
|
32
39
|
class Benchmark
|
33
40
|
|
34
41
|
class << self
|
35
42
|
|
43
|
+
# Benchmark the supplied block.
|
44
|
+
#
|
45
|
+
# If *message* and *mark* options are used, then the *message* text will
|
46
|
+
# be displayed to the user. The the supplied *block* is yielded inside
|
47
|
+
# a *ZTK::Spinner.spin* call. This will provide the spinning cursor while
|
48
|
+
# the block executes. It is advisable to not have output sent to the
|
49
|
+
# console during this period.
|
50
|
+
#
|
51
|
+
# Once the block finishes executing, the *mark* text is displayed with
|
52
|
+
# the benchmark supplied to it as a sprintf option. One could use "%0.4f"
|
53
|
+
# in a *String* for example to get the benchmark time embedded in it
|
54
|
+
#
|
55
|
+
# @see Kernel#sprintf
|
56
|
+
#
|
57
|
+
# @param [Hash] options Configuration options hash.
|
58
|
+
# @option options [String] :message The *String* to be displayed to the
|
59
|
+
# user before the block is yielded.
|
60
|
+
# @option options [String] :mark The *String* to be displayed to the user
|
61
|
+
# after the block is yielded. This *String* should have an *sprintf*
|
62
|
+
# floating point macro in it if the benchmark is desired to be embedded
|
63
|
+
# in the given *String*.
|
64
|
+
#
|
65
|
+
# @yield Block should execute the tasks to be benchmarked.
|
66
|
+
# @yieldreturn [Object] The return value of the block is ignored.
|
67
|
+
# @return [Float] The benchmark time.
|
36
68
|
def bench(options={}, &block)
|
37
69
|
options = Base.build_config(options)
|
38
70
|
options.logger.debug { "options=#{options.send(:table).inspect}" }
|
data/lib/ztk/command.rb
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
# limitations under the License.
|
18
18
|
#
|
19
19
|
################################################################################
|
20
|
-
|
21
20
|
require "ostruct"
|
22
21
|
require "timeout"
|
23
22
|
|
@@ -50,11 +49,6 @@ module ZTK
|
|
50
49
|
config.logger.debug { "config=#{config.send(:table).inspect}" }
|
51
50
|
end
|
52
51
|
|
53
|
-
def inspect
|
54
|
-
@hostname ||= %x(hostname -f).chomp
|
55
|
-
"#{ENV['USER']}@#{@hostname}"
|
56
|
-
end
|
57
|
-
|
58
52
|
# Executes a local command.
|
59
53
|
#
|
60
54
|
# @param [String] command The command to execute.
|
@@ -69,20 +63,17 @@ module ZTK
|
|
69
63
|
# cmd = ZTK::Command.new
|
70
64
|
# puts cmd.exec("hostname -f").inspect
|
71
65
|
def exec(command, options={})
|
72
|
-
|
73
|
-
def log_header(tag)
|
74
|
-
count = 8
|
75
|
-
sep = ("=" * count)
|
76
|
-
header = [sep, "[ #{tag} ]", sep, "[ #{self.inspect} ]", sep, "[ #{tag} ]", sep].join
|
77
|
-
"#{header}\n"
|
78
|
-
end
|
79
|
-
|
80
66
|
options = OpenStruct.new({ :exit_code => 0, :silence => false }.merge(options))
|
81
67
|
|
82
68
|
config.logger.debug { "config=#{config.send(:table).inspect}" }
|
83
69
|
config.logger.debug { "options=#{options.send(:table).inspect}" }
|
84
70
|
config.logger.info { "command(#{command.inspect})" }
|
85
71
|
|
72
|
+
if config.replace_current_process
|
73
|
+
config.logger.fatal { "REPLACING CURRENT PROCESS - GOODBYE!" }
|
74
|
+
Kernel.exec(command)
|
75
|
+
end
|
76
|
+
|
86
77
|
output = ""
|
87
78
|
exit_code = -1
|
88
79
|
stdout_header = false
|
@@ -169,14 +160,33 @@ module ZTK
|
|
169
160
|
OpenStruct.new(:output => output, :exit_code => exit_code)
|
170
161
|
end
|
171
162
|
|
163
|
+
# Not Supported
|
164
|
+
# @raise [CommandError] Not Supported
|
172
165
|
def upload(*args)
|
173
166
|
log_and_raise(CommandError, "Not Supported")
|
174
167
|
end
|
175
168
|
|
169
|
+
# Not Supported
|
170
|
+
# @raise [CommandError] Not Supported
|
176
171
|
def download(*args)
|
177
172
|
log_and_raise(CommandError, "Not Supported")
|
178
173
|
end
|
179
174
|
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
def tag
|
179
|
+
@hostname ||= %x(hostname -f).chomp
|
180
|
+
"#{ENV['USER']}@#{@hostname}"
|
181
|
+
end
|
182
|
+
|
183
|
+
def log_header(what)
|
184
|
+
count = 8
|
185
|
+
sep = ("=" * count)
|
186
|
+
header = [sep, "[ #{what} ]", sep, "[ #{tag} ]", sep, "[ #{what} ]", sep].join
|
187
|
+
"#{header}\n"
|
188
|
+
end
|
189
|
+
|
180
190
|
end
|
181
191
|
|
182
192
|
end
|
data/lib/ztk/config.rb
CHANGED
data/lib/ztk/dsl/base.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
################################################################################
|
2
|
+
#
|
3
|
+
# Author: Zachary Patten <zachary@jovelabs.net>
|
4
|
+
# Copyright: Copyright (c) Jove Labs
|
5
|
+
# License: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
################################################################################
|
20
|
+
|
21
|
+
# @author Zachary Patten <zachary@jovelabs.net>
|
22
|
+
module ZTK::DSL
|
23
|
+
|
24
|
+
class Base
|
25
|
+
include(ZTK::DSL::Core)
|
26
|
+
|
27
|
+
def self.inherited(base)
|
28
|
+
puts("inherited(#{base})")
|
29
|
+
base.send(:extend, ZTK::DSL::Base::ClassMethods)
|
30
|
+
base.instance_eval do
|
31
|
+
attribute :id
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.included(base)
|
36
|
+
puts("included(#{base})")
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.extended(base)
|
40
|
+
puts("extended(#{base})")
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize(&block)
|
44
|
+
self.id = self.class.id
|
45
|
+
self.class.dataset << self
|
46
|
+
block_given? and ((block.arity < 1) ? instance_eval(&block) : block.call(self))
|
47
|
+
|
48
|
+
primary_key_count = self.class.dataset.count do |d|
|
49
|
+
puts("d.id == #{d.id.inspect} / self.id == #{self.id.inspect}")
|
50
|
+
d.id == self.id
|
51
|
+
end
|
52
|
+
puts("primary_key_count == #{primary_key_count}")
|
53
|
+
raise StandardError, "Primary key '#{self.id}' already exists!" if (primary_key_count > 1)
|
54
|
+
end
|
55
|
+
|
56
|
+
def inspect
|
57
|
+
details = Array.new
|
58
|
+
details << "attributes=#{attributes.inspect}" if attributes.count > 0
|
59
|
+
details << "has_many_references=#{@has_many_references.count}" if @has_many_references
|
60
|
+
details << "belongs_to_references=#{@belongs_to_references.count}" if @belongs_to_references
|
61
|
+
"#<#{self.class.to_s} id=#{self.id.inspect} #{details.join(', ')}>"
|
62
|
+
end
|
63
|
+
|
64
|
+
module ClassMethods
|
65
|
+
|
66
|
+
def inspect
|
67
|
+
details = Array.new
|
68
|
+
details << "count=#{self.all.count}" if self.all.count > 0
|
69
|
+
"#<#{self.class.to_s}:#{self.id} #{details.join(', ')}>"
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
################################################################################
|
2
|
+
#
|
3
|
+
# Author: Zachary Patten <zachary@jovelabs.net>
|
4
|
+
# Copyright: Copyright (c) Jove Labs
|
5
|
+
# License: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
################################################################################
|
20
|
+
|
21
|
+
module ZTK::DSL::Core::Actions
|
22
|
+
module Find
|
23
|
+
|
24
|
+
def self.included(base)
|
25
|
+
base.class_eval do
|
26
|
+
base.send(:extend, ZTK::DSL::Core::Actions::Find::ClassMethods)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module ClassMethods
|
31
|
+
|
32
|
+
def all
|
33
|
+
dataset
|
34
|
+
end
|
35
|
+
|
36
|
+
def find(*args)
|
37
|
+
logger.debug { "*args(#{args.inspect})" }
|
38
|
+
ids = [args].flatten
|
39
|
+
all.select{ |data| ids.include?(data.id) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def count
|
43
|
+
all.count
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
################################################################################
|
2
|
+
#
|
3
|
+
# Author: Zachary Patten <zachary@jovelabs.net>
|
4
|
+
# Copyright: Copyright (c) Jove Labs
|
5
|
+
# License: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
################################################################################
|
20
|
+
|
21
|
+
module ZTK::DSL::Core::Actions
|
22
|
+
module Timestamps
|
23
|
+
|
24
|
+
def self.included(base)
|
25
|
+
base.class_eval do
|
26
|
+
base.send(:extend, ZTK::DSL::Core::Actions::Timestamps::ClassMethods)
|
27
|
+
end
|
28
|
+
base.instance_eval do
|
29
|
+
attribute :created_at
|
30
|
+
attribute :updated_at
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
module ClassMethods
|
35
|
+
|
36
|
+
def updated_at_timestamp
|
37
|
+
self.updated_at = Time.now
|
38
|
+
end
|
39
|
+
|
40
|
+
def created_at_timestamp
|
41
|
+
self.created_at ||= Time.now
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
################################################################################
|
2
|
+
#
|
3
|
+
# Author: Zachary Patten <zachary@jovelabs.net>
|
4
|
+
# Copyright: Copyright (c) Jove Labs
|
5
|
+
# License: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
################################################################################
|
20
|
+
|
21
|
+
module ZTK::DSL::Core
|
22
|
+
module Actions
|
23
|
+
autoload :Find, "ztk/dsl/core/actions/find"
|
24
|
+
autoload :Timestamps, "ztk/dsl/core/actions/timestamps"
|
25
|
+
|
26
|
+
def self.included(base)
|
27
|
+
base.class_eval do
|
28
|
+
base.send(:include, ZTK::DSL::Core::Actions::Find)
|
29
|
+
base.send(:include, ZTK::DSL::Core::Actions::Timestamps)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
################################################################################
|
2
|
+
#
|
3
|
+
# Author: Zachary Patten <zachary@jovelabs.net>
|
4
|
+
# Copyright: Copyright (c) Jove Labs
|
5
|
+
# License: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
################################################################################
|
20
|
+
|
21
|
+
module ZTK::DSL::Core
|
22
|
+
module Attributes
|
23
|
+
|
24
|
+
def self.included(base)
|
25
|
+
base.class_eval do
|
26
|
+
base.send(:extend, ZTK::DSL::Core::Attributes::ClassMethods)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def attributes
|
31
|
+
@attributes ||= {}
|
32
|
+
end
|
33
|
+
|
34
|
+
module ClassMethods
|
35
|
+
|
36
|
+
def attribute(key, options={})
|
37
|
+
send(:define_method, key) do |*args|
|
38
|
+
if args.count == 0
|
39
|
+
attributes[key]
|
40
|
+
else
|
41
|
+
send("#{key}=", *args)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
send(:define_method, "#{key}=") do |value|
|
46
|
+
attributes[key] = value
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
################################################################################
|
2
|
+
#
|
3
|
+
# Author: Zachary Patten <zachary@jovelabs.net>
|
4
|
+
# Copyright: Copyright (c) Jove Labs
|
5
|
+
# License: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
################################################################################
|
20
|
+
|
21
|
+
module ZTK::DSL::Core
|
22
|
+
module Dataset
|
23
|
+
|
24
|
+
def self.included(base)
|
25
|
+
base.class_eval do
|
26
|
+
base.send(:extend, ZTK::DSL::Core::Dataset::ClassMethods)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module ClassMethods
|
31
|
+
|
32
|
+
def dataset
|
33
|
+
klass = self.to_s.underscore.to_sym
|
34
|
+
@@dataset ||= {}
|
35
|
+
if @@dataset.key?(klass)
|
36
|
+
@@dataset[klass]
|
37
|
+
else
|
38
|
+
@@dataset[klass] ||= []
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def purge
|
43
|
+
@@dataset = nil
|
44
|
+
end
|
45
|
+
|
46
|
+
def id
|
47
|
+
@@id ||= 0
|
48
|
+
(@@id += 1)
|
49
|
+
end
|
50
|
+
|
51
|
+
# def foreign_keys(target)
|
52
|
+
# puts("==> foreign_keys(#{target.inspect})")
|
53
|
+
|
54
|
+
# target = singularize(underscore(target).to_sym)
|
55
|
+
# source = singularize(underscore(self).to_sym)
|
56
|
+
|
57
|
+
# splat = [source, target].sort
|
58
|
+
|
59
|
+
# key = [ splat[0], "references", splat[1] ].join(":")
|
60
|
+
# puts("key=#{key}")
|
61
|
+
# end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|