tempo-cli 0.2.1 → 0.2.2

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: ce2d1ab18d47aece23c6034eb43e2c668fcb207c
4
- data.tar.gz: 7a6d372bb3e12ef63730bed5cac7a30be19a73f8
3
+ metadata.gz: 7e0e749497d74a2c5e925fd047c19040e672ec24
4
+ data.tar.gz: a4923005458055bcf4439e939a8f278d65459296
5
5
  SHA512:
6
- metadata.gz: 2706c79ae90158751b2059067e887d9ee65e672fcaeacf777b58a698a340dc8c1ecfeba11f730e7d1b56732c5056800c3644afaaa3ef5eeaf06d566cbfd26420
7
- data.tar.gz: 3acd0dc7d1ee0d3f7a84439b2eb995d9f31ca81e325e012f493439ba2c4c0f58c489eedd61a508ff96575a478b8805aeae3a2deb83586bf44aedb348f7d782aa
6
+ metadata.gz: 2524f53d37306e60ced9e55015ac57c1e962540113170b190abb7937a7a2eb16dd0ef7d5825d9ac574895649df0b0f49d3fe146e64a75c9800c51dc42a30aaa3
7
+ data.tar.gz: 66e4108bba0f37681e7a1f4e701f5e3a7de62705770351f9e5954e998351a73f85328e4e20bdf06ba392905b45c60f4b638051a9fe5aa0c417629f1509016b78
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tempo-cli (0.1.6)
5
- chronic (~> 0.10.2)
6
- gli (~> 2.10.0)
4
+ tempo-cli (0.2.1)
5
+ chronic (~> 0.10)
6
+ gli (~> 2.10)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
@@ -27,16 +27,16 @@ GEM
27
27
  ffi (1.9.0)
28
28
  gherkin (2.12.0)
29
29
  multi_json (~> 1.3)
30
- gli (2.10.0)
31
- json (1.8.0)
30
+ gli (2.11.0)
31
+ json (1.8.1)
32
32
  method_source (0.8.1)
33
33
  multi_json (1.7.7)
34
34
  pry (0.9.12.2)
35
35
  coderay (~> 1.0.5)
36
36
  method_source (~> 0.8)
37
37
  slop (~> 3.4)
38
- rake (10.1.0)
39
- rdoc (4.0.1)
38
+ rake (10.3.2)
39
+ rdoc (4.1.1)
40
40
  json (~> 1.4)
41
41
  rspec-expectations (2.13.0)
42
42
  diff-lcs (>= 1.1.3, < 2.0)
@@ -48,9 +48,9 @@ PLATFORMS
48
48
  ruby
49
49
 
50
50
  DEPENDENCIES
51
- aruba
52
- pry (~> 0.9.12.2)
53
- rake
54
- rdoc
51
+ aruba (~> 0.5)
52
+ pry (~> 0.9)
53
+ rake (~> 10.3)
54
+ rdoc (~> 4.1)
55
55
  tempo-cli!
56
- turn (~> 0.9.6)
56
+ turn (~> 0.9)
data/bin/tempo CHANGED
@@ -487,7 +487,7 @@ on_error do |exception|
487
487
  # return false to skip default error handling
488
488
 
489
489
  # remove before distribution:
490
- #puts exception.backtrace
490
+ # puts exception.backtrace
491
491
 
492
492
  true
493
493
  end
@@ -52,17 +52,43 @@ module Tempo
52
52
  end
53
53
 
54
54
  def method_missing(meth, *args, &block)
55
+ if respond_to? meth
56
+ if meth.to_s =~ /^find_by_(.+)$/
57
+ self.class.send(:define_method, meth) do |*args|
58
+ run_find_by_method($1, *args)
59
+ end
60
+ self.send(meth, *args)
55
61
 
56
- if meth.to_s =~ /^find_by_(.+)$/
57
- run_find_by_method($1, *args, &block)
62
+ elsif meth.to_s =~ /^sort_by_(.+)$/
63
+ self.class.send(:define_method, meth) do |*args, &block|
64
+ run_sort_by_method($1, *args, &block)
65
+ end
66
+ self.send(meth, *args, &block)
58
67
 
59
- elsif meth.to_s =~ /^sort_by_(.+)$/
60
- run_sort_by_method($1, *args, &block)
68
+ else
69
+ super
70
+ end
61
71
  else
62
72
  super
63
73
  end
64
74
  end
65
75
 
76
+ def respond_to?(method_id, include_private = false)
77
+ if method_id.to_s =~ /^find_by_(.+)$/ || method_id.to_s =~ /^sort_by_(.+)$/
78
+ instances_have_attributes? $1.split('_and_')
79
+ else
80
+ super
81
+ end
82
+ end
83
+
84
+ def instances_have_attributes?(attrs)
85
+ finder_attrs = attrs.map { |key| "@#{key}".to_sym }
86
+ model_attrs = index.map { |i| i.instance_variables }.flatten.uniq
87
+
88
+ # Make sure all attributes are present in index objects
89
+ (model_attrs & finder_attrs).size == finder_attrs.size
90
+ end
91
+
66
92
  def run_sort_by_method(attribute, args=@index.clone, &block)
67
93
  attr = "@#{attribute}".to_sym
68
94
  args.sort! { |a,b| a.instance_variable_get( attr ) <=> b.instance_variable_get( attr ) }
@@ -70,7 +96,7 @@ module Tempo
70
96
  block.call args
71
97
  end
72
98
 
73
- def run_find_by_method(attrs, *args, &block)
99
+ def run_find_by_method(attrs, *args)
74
100
  # Make an array of attribute names
75
101
  attrs = attrs.split('_and_')
76
102
 
@@ -22,8 +22,12 @@ module Tempo
22
22
  end
23
23
 
24
24
  def include?(title)
25
+
26
+ return false if index.empty?
27
+
25
28
  matches = find_by_title(title)
26
29
  return false if matches.empty?
30
+
27
31
  matches.each do |match|
28
32
  return true if match.title == title
29
33
  end
data/lib/tempo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tempo
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.2'
3
3
  end
@@ -1,5 +1,19 @@
1
1
  require "test_helper"
2
2
 
3
+ # Used to test define_method is called
4
+ # the first time a find_by_ and sort_by_
5
+ # is called. Don't use for any other tests
6
+ class Plant < Tempo::Model::Base
7
+ attr_accessor :stem, :leaf
8
+
9
+ def initialize( options={} )
10
+ super options
11
+ @stem = options.fetch(:stem, "woody")
12
+ @leaf = options.fetch(:leaf, "broad")
13
+ end
14
+ end
15
+
16
+
3
17
  describe Tempo do
4
18
 
5
19
  before do
@@ -8,6 +22,11 @@ describe Tempo do
8
22
  Dir.mkdir(@dir, 0700) unless File.exists?(@dir)
9
23
  end
10
24
 
25
+ def after_teardown
26
+ Tempo::Model::Animal.clear_all
27
+ super
28
+ end
29
+
11
30
  describe "Model::Base" do
12
31
 
13
32
  it "is inheritable from" do
@@ -127,10 +146,6 @@ describe Tempo do
127
146
  search = Tempo::Model::Animal.find_by_species("Versicolor")
128
147
  search.must_equal [ @gray_tree_frog ]
129
148
 
130
- # # test, does this work, and should it?
131
- # search = Tempo::Model::Animal.find_by_species("h. color")
132
- # search.must_equal [ @gray_tree_frog ]
133
-
134
149
  search = Tempo::Model::Animal.find_by_genious("hyla")
135
150
  search.length.must_equal 5
136
151
 
@@ -138,6 +153,26 @@ describe Tempo do
138
153
  search.must_equal [ @gray_tree_frog ]
139
154
  end
140
155
 
156
+ it "responds to find_by_ method" do
157
+ # Current behavior raises error if no instances exist.
158
+ # This behavior could be relaxed, or models could be made
159
+ # to explicity declare findable attributes
160
+ frog_factory
161
+ Tempo::Model::Animal.must_respond_to :find_by_species
162
+ end
163
+
164
+ it "doesn't respond to find_by_ method for non-existent attribute" do
165
+ Tempo::Model::Animal.wont_respond_to :find_by_blah
166
+ proc { Tempo::Model::Animal.find_by_blah 1 }.must_raise NoMethodError
167
+ end
168
+
169
+ it "defines find_by_ methods after first call" do
170
+ plant = Plant.new
171
+ Plant.methods.include?(:find_by_stem).must_equal false
172
+ Plant.find_by_stem("woody")
173
+ Plant.methods.include?(:find_by_stem).must_equal true
174
+ end
175
+
141
176
  it "has a sort_by_ method" do
142
177
  frog_factory
143
178
  list = Tempo::Model::Animal.sort_by_species [ @gray_tree_frog, @pine_barrens_tree_frog ]
@@ -160,6 +195,26 @@ describe Tempo do
160
195
  list.must_equal "h. andersonii, h. avivoca, h. chinensis, h. chrysoscelis, h. versicolor"
161
196
  end
162
197
 
198
+ it "responds to sort_by_ method" do
199
+ # Current behavior raises error if no instances exist.
200
+ # This behavior could be relaxed, or models could be made
201
+ # to explicity declare sortable attributes
202
+ frog_factory
203
+ Tempo::Model::Animal.must_respond_to :sort_by_species
204
+ end
205
+
206
+ it "doesn't respond to sort_by_ method for non-existent attribute" do
207
+ Tempo::Model::Animal.wont_respond_to :sort_by_blah
208
+ proc { Tempo::Model::Animal.sort_by_blah }.must_raise NoMethodError
209
+ end
210
+
211
+ it "defines sort_by methods after first call" do
212
+ plant = Plant.new
213
+ Plant.methods.include?(:sort_by_stem).must_equal false
214
+ Plant.sort_by_stem
215
+ Plant.methods.include?(:sort_by_stem).must_equal true
216
+ end
217
+
163
218
  it "has a method_missing method" do
164
219
  proc { Tempo::Model::Animal.foo }.must_raise NoMethodError
165
220
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tempo-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Gabel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-09 00:00:00.000000000 Z
11
+ date: 2014-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake