defunkt-ambition 0.5.3

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.
Files changed (44) hide show
  1. data/LICENSE +18 -0
  2. data/Manifest +42 -0
  3. data/README +24 -0
  4. data/ambition.gemspec +120 -0
  5. data/app_generators/ambition_adapter/USAGE +1 -0
  6. data/app_generators/ambition_adapter/ambition_adapter_generator.rb +66 -0
  7. data/app_generators/ambition_adapter/templates/LICENSE +18 -0
  8. data/app_generators/ambition_adapter/templates/README +6 -0
  9. data/app_generators/ambition_adapter/templates/Rakefile +31 -0
  10. data/app_generators/ambition_adapter/templates/lib/adapter/base.rb.erb +12 -0
  11. data/app_generators/ambition_adapter/templates/lib/adapter/query.rb.erb +52 -0
  12. data/app_generators/ambition_adapter/templates/lib/adapter/select.rb.erb +100 -0
  13. data/app_generators/ambition_adapter/templates/lib/adapter/slice.rb.erb +19 -0
  14. data/app_generators/ambition_adapter/templates/lib/adapter/sort.rb.erb +43 -0
  15. data/app_generators/ambition_adapter/templates/lib/init.rb.erb +22 -0
  16. data/app_generators/ambition_adapter/templates/test/helper.rb.erb +9 -0
  17. data/app_generators/ambition_adapter/templates/test/select_test.rb.erb +157 -0
  18. data/app_generators/ambition_adapter/templates/test/slice_test.rb.erb +36 -0
  19. data/app_generators/ambition_adapter/templates/test/sort_test.rb.erb +53 -0
  20. data/bin/ambition_adapter +13 -0
  21. data/lib/ambition/api.rb +98 -0
  22. data/lib/ambition/context.rb +62 -0
  23. data/lib/ambition/core_ext.rb +7 -0
  24. data/lib/ambition/enumerable.rb +6 -0
  25. data/lib/ambition/processors/base.rb +134 -0
  26. data/lib/ambition/processors/ruby.rb +26 -0
  27. data/lib/ambition/processors/select.rb +105 -0
  28. data/lib/ambition/processors/slice.rb +15 -0
  29. data/lib/ambition/processors/sort.rb +51 -0
  30. data/lib/ambition/sexp_translator.rb +16 -0
  31. data/lib/ambition.rb +11 -0
  32. data/test/adapters/exemplar/association_test.rb +34 -0
  33. data/test/adapters/exemplar/count_test.rb +0 -0
  34. data/test/adapters/exemplar/detect_test.rb +9 -0
  35. data/test/adapters/exemplar/enumerable_test.rb +0 -0
  36. data/test/adapters/exemplar/helper.rb +3 -0
  37. data/test/adapters/exemplar/index_operator.rb +6 -0
  38. data/test/adapters/exemplar/reject_test.rb +0 -0
  39. data/test/adapters/exemplar/select_test.rb +151 -0
  40. data/test/adapters/exemplar/slice_test.rb +0 -0
  41. data/test/adapters/exemplar/sort_test.rb +0 -0
  42. data/test/debug +9 -0
  43. data/test/helper.rb +4 -0
  44. metadata +139 -0
@@ -0,0 +1,15 @@
1
+ module Ambition #:nodoc:
2
+ module Processors #:nodoc:
3
+ class Slice < Base
4
+ def initialize(context, start, length=nil)
5
+ @context = context
6
+ @start = start
7
+ @length = length
8
+ end
9
+
10
+ def to_s
11
+ translator.slice(@start, @length)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,51 @@
1
+ module Ambition #:nodoc:
2
+ module Processors #:nodoc:
3
+ class Sort < Base
4
+ def initialize(context, block)
5
+ @context = context
6
+ @block = block
7
+ end
8
+
9
+ def process_call(args)
10
+ if args.first.last == @receiver
11
+ translator.sort_by(*args[1..-1])
12
+
13
+ # sort_by { |m| -m.age }
14
+ # [[:call, [:dvar, :m], :age], :-@]
15
+ elsif args[0][1][-1] == @receiver && args.last == :-@
16
+ translator.reverse_sort_by(*args.first[2..-1])
17
+
18
+ # sort_by(&:name).to_s
19
+ # [[:call, [:dvar, :args], :shift], :__send__, [:argscat, [:array, [:self]], [:dvar, :args]]]
20
+ elsif args[1] == :__send__
21
+ translator.to_proc(value('to_s'))
22
+
23
+ # sort_by { |m| m.ideas.title }
24
+ # [[:call, [:dvar, :m], :ideas], :title]
25
+ elsif args[0][1][-1] == @receiver
26
+ first = args.first.last
27
+ last = args.last
28
+ translator.chained_sort_by(first, last)
29
+
30
+ # sort_by { |m| [ m.ideas.title, -m.invites.email ] }
31
+ # [[:call, [:call, [:dvar, :m], :invites], :email], :-@]
32
+ elsif args[0][1][1][-1] == @receiver && args.last == :-@
33
+ first = args.first[1].last
34
+ last = args.first.last
35
+ translator.chained_reverse_sort_by(first, last)
36
+
37
+ else
38
+ raise args.inspect
39
+ end
40
+ end
41
+
42
+ def process_vcall(args)
43
+ translator.send(args.shift, *args)
44
+ end
45
+
46
+ def process_masgn(exp)
47
+ ''
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+ require 'parse_tree'
3
+
4
+ module Ambition #:nodoc:
5
+ class SexpTranslator
6
+ @@block_cache = {}
7
+
8
+ def self.translate(block)
9
+ @@block_cache[block.to_s] ||= begin
10
+ klass = Class.new { define_method(:proc_to_method, block) }
11
+ body = ParseTree.translate(klass, :proc_to_method)[2][1..-1]
12
+ [:proc, *body]
13
+ end
14
+ end
15
+ end
16
+ end
data/lib/ambition.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'ambition/enumerable'
2
+ require 'ambition/api'
3
+ require 'ambition/context'
4
+ require 'ambition/core_ext'
5
+ require 'ambition/sexp_translator'
6
+
7
+ require 'ambition/processors/base'
8
+ require 'ambition/processors/select'
9
+ require 'ambition/processors/sort'
10
+ require 'ambition/processors/slice'
11
+ require 'ambition/processors/ruby'
@@ -0,0 +1,34 @@
1
+ # Analog of the join_test.rb in the ActiveRecord adapter.
2
+ # Not all adapters will need these behaviors. E.g. there are no joins in LDAP.
3
+ # ActiveLdap has associations, but doesn't try to fake joins.
4
+ # CouchDb doesn't so much have joins as it has the capacity for creative
5
+ # use of its views.
6
+
7
+ require File.dirname(__FILE__) + '/helper'
8
+
9
+ context "Object associations" do
10
+ xspecify "simple ==" do
11
+ result = User.select { |m| m.account.email == 'chris@ozmm.org' }
12
+ end
13
+
14
+ xspecify "simple mixed == on object and an association" do
15
+ result = User.select { |m| m.name == 'chris' && m.account.email == 'chris@ozmm.org' }
16
+ end
17
+
18
+ xspecify "multiple associations" do
19
+ result = User.select { |m| m.ideas.title == 'New Freezer' || m.invites.email == 'pj@hyett.com' }
20
+ end
21
+
22
+ xspecify "non-existant associations" do
23
+ result = User.select { |m| m.liquor.brand == 'Jack' }
24
+ should.raise { result.to_hash }
25
+ end
26
+
27
+ xspecify "simple order by association attribute" do
28
+ result = User.sort_by { |m| m.ideas.title }
29
+ end
30
+
31
+ xspecify "in a more complex order" do
32
+ result = User.sort_by { |m| [ m.ideas.title, -m.invites.email ] }
33
+ end
34
+ end
File without changes
@@ -0,0 +1,9 @@
1
+ context "Exemplar Adapter :: Detect" do
2
+ xspecify "simple ==" do
3
+ User.detect { |m| m.name == 'chris' }
4
+ end
5
+
6
+ xspecify "nothing found" do
7
+ User.detect { |m| m.name == 'chris' }.should.be.nil
8
+ end
9
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ require File.dirname(__FILE__) + '/../../helper'
2
+
3
+ # require 'ambition/adapters/exemplar'
@@ -0,0 +1,6 @@
1
+ xcontext "Exemplar Adapter :: [] operator" do
2
+ specify "finds a single row" do
3
+ User.expects(:find).with(1)
4
+ User[1]
5
+ end
6
+ end
File without changes
@@ -0,0 +1,151 @@
1
+ context "Exemplar Adapter :: Select" do
2
+ xspecify "simple ==" do
3
+ translator = User.select { |m| m.name == 'jon' }
4
+ translator.to_s.should == %Q(foo)
5
+ end
6
+
7
+ xspecify "simple !=" do
8
+ translator = User.select { |m| m.name != 'jon' }
9
+ translator.to_s.should == %Q(foo)
10
+ end
11
+
12
+ xspecify "simple == && ==" do
13
+ translator = User.select { |m| m.name == 'jon' && m.age == 21 }
14
+ translator.to_s.should == %Q(foo)
15
+ end
16
+
17
+ xspecify "simple == || ==" do
18
+ translator = User.select { |m| m.name == 'jon' || m.age == 21 }
19
+ translator.to_s.should == %Q(foo)
20
+ end
21
+
22
+ xspecify "mixed && and ||" do
23
+ translator = User.select { |m| m.name == 'jon' || m.age == 21 && m.password == 'pass' }
24
+ translator.to_s.should == %Q(foo)
25
+ end
26
+
27
+ xspecify "grouped && and ||" do
28
+ translator = User.select { |m| (m.name == 'jon' || m.name == 'rick') && m.age == 21 }
29
+ translator.to_s.should == %Q(foo)
30
+ end
31
+
32
+ xspecify "simple >/<" do
33
+ translator = User.select { |m| m.age > 21 }
34
+ translator.to_s.should == %Q(foo)
35
+
36
+ translator = User.select { |m| m.age >= 21 }
37
+ translator.to_s.should == %Q(foo)
38
+
39
+ translator = User.select { |m| m.age < 21 }
40
+ translator.to_s.should == %Q(foo)
41
+ end
42
+
43
+ xspecify "array.include? item" do
44
+ translator = User.select { |m| [1, 2, 3, 4].include? m.id }
45
+ translator.to_s.should == %Q(foo)
46
+ end
47
+
48
+ xspecify "variabled array.include? item" do
49
+ array = [1, 2, 3, 4]
50
+ translator = User.select { |m| array.include? m.id }
51
+ translator.to_s.should == %Q(foo)
52
+ end
53
+
54
+ xspecify "simple == with variables" do
55
+ me = 'chris'
56
+ translator = User.select { |m| m.name == me }
57
+ translator.to_s.should == %Q(foo)
58
+ end
59
+
60
+ xspecify "simple == with method arguments" do
61
+ def test_it(name)
62
+ translator = User.select { |m| m.name == name }
63
+ translator.to_s.should == %Q(foo)
64
+ end
65
+
66
+ test_it('chris')
67
+ end
68
+
69
+ xspecify "simple == with instance variables" do
70
+ @me = 'chris'
71
+ translator = User.select { |m| m.name == @me }
72
+ translator.to_s.should == %Q(foo)
73
+ end
74
+
75
+ xspecify "simple == with instance variable method call" do
76
+ require 'ostruct'
77
+ @person = OpenStruct.new(:name => 'chris')
78
+
79
+ translator = User.select { |m| m.name == @person.name }
80
+ translator.to_s.should == %Q(foo)
81
+ end
82
+
83
+ xspecify "simple == with global variables" do
84
+ $my_name = 'boston'
85
+ translator = User.select { |m| m.name == $my_name }
86
+ translator.to_s.should == %Q(foo)
87
+ end
88
+
89
+ xspecify "simple == with method call" do
90
+ def band
91
+ 'skinny puppy'
92
+ end
93
+
94
+ translator = User.select { |m| m.name == band }
95
+ translator.to_s.should == %Q(foo)
96
+ end
97
+
98
+ xspecify "simple =~ with string" do
99
+ translator = User.select { |m| m.name =~ 'chris' }
100
+ translator.to_s.should == %Q(foo)
101
+
102
+ translator = User.select { |m| m.name =~ 'chri%' }
103
+ translator.to_s.should == %Q(foo)
104
+ end
105
+
106
+ xspecify "simple !~ with string" do
107
+ translator = User.select { |m| m.name !~ 'chris' }
108
+ translator.to_s.should == %Q(foo)
109
+
110
+ translator = User.select { |m| !(m.name =~ 'chris') }
111
+ translator.to_s.should == %Q(foo)
112
+ end
113
+
114
+ xspecify "simple =~ with regexp" do
115
+ translator = User.select { |m| m.name =~ /chris/ }
116
+ translator.to_s.should == %Q(foo)
117
+ end
118
+
119
+ xspecify "simple =~ with regexp flags" do
120
+ translator = User.select { |m| m.name =~ /chris/i }
121
+ translator.to_s.should == %Q(foo)
122
+ end
123
+
124
+ xspecify "simple downcase" do
125
+ translator = User.select { |m| m.name.downcase =~ 'chris%' }
126
+ translator.to_s.should == %Q(foo)
127
+ end
128
+
129
+ xspecify "simple upcase" do
130
+ translator = User.select { |m| m.name.upcase =~ 'chris%' }
131
+ translator.to_s.should == %Q(foo)
132
+ end
133
+
134
+ xspecify "undefined equality symbol" do
135
+ should.raise { User.select { |m| m.name =* /chris/ } }
136
+ end
137
+
138
+ xspecify "block variable / assigning variable conflict" do
139
+ m = User.select { |m| m.name == 'chris' }
140
+ m.should == %Q(foo)
141
+ end
142
+
143
+ xspecify "simple == with inline ruby" do
144
+ translator = User.select { |m| m.created_at == 2.days.ago(:db) }
145
+ translator.to_s.should == %Q(foo)
146
+ end
147
+
148
+ xspecify "inspect" do
149
+ User.select { |u| u.name }.inspect.should.match %r(call #to_s or #to_hash)
150
+ end
151
+ end
File without changes
File without changes
data/test/debug ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
3
+ libs = []
4
+ dirname = File.dirname(__FILE__)
5
+
6
+ libs << 'irb/completion'
7
+ libs << File.join(dirname, '..', 'lib', 'ambition')
8
+
9
+ exec "#{irb} -Ilib #{libs.map{|l| " -r #{l}" }.join} --simple-prompt"
data/test/helper.rb ADDED
@@ -0,0 +1,4 @@
1
+ %w( rubygems test/spec mocha redgreen English ).each { |f| require f }
2
+
3
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
4
+ require 'ambition'
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: defunkt-ambition
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.3
5
+ platform: ruby
6
+ authors:
7
+ - Chris Wanstrath
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-04-26 00:00:00 -07:00
13
+ default_executable: ambition_adapter
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ParseTree
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - "="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.1
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: ruby2ruby
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - "="
30
+ - !ruby/object:Gem::Version
31
+ version: 1.1.7
32
+ version:
33
+ - !ruby/object:Gem::Dependency
34
+ name: rubigen
35
+ version_requirement:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.1
41
+ version:
42
+ description: Ambition builds yer API calls from plain jane Ruby.
43
+ email: chris@ozmm.org
44
+ executables:
45
+ - ambition_adapter
46
+ extensions: []
47
+
48
+ extra_rdoc_files:
49
+ - bin/ambition_adapter
50
+ - lib/ambition/api.rb
51
+ - lib/ambition/context.rb
52
+ - lib/ambition/core_ext.rb
53
+ - lib/ambition/enumerable.rb
54
+ - lib/ambition/processors/base.rb
55
+ - lib/ambition/processors/ruby.rb
56
+ - lib/ambition/processors/select.rb
57
+ - lib/ambition/processors/slice.rb
58
+ - lib/ambition/processors/sort.rb
59
+ - lib/ambition/sexp_translator.rb
60
+ - lib/ambition.rb
61
+ - LICENSE
62
+ - README
63
+ files:
64
+ - app_generators/ambition_adapter/ambition_adapter_generator.rb
65
+ - app_generators/ambition_adapter/templates/lib/adapter/base.rb.erb
66
+ - app_generators/ambition_adapter/templates/lib/adapter/query.rb.erb
67
+ - app_generators/ambition_adapter/templates/lib/adapter/select.rb.erb
68
+ - app_generators/ambition_adapter/templates/lib/adapter/slice.rb.erb
69
+ - app_generators/ambition_adapter/templates/lib/adapter/sort.rb.erb
70
+ - app_generators/ambition_adapter/templates/lib/init.rb.erb
71
+ - app_generators/ambition_adapter/templates/LICENSE
72
+ - app_generators/ambition_adapter/templates/Rakefile
73
+ - app_generators/ambition_adapter/templates/README
74
+ - app_generators/ambition_adapter/templates/test/helper.rb.erb
75
+ - app_generators/ambition_adapter/templates/test/select_test.rb.erb
76
+ - app_generators/ambition_adapter/templates/test/slice_test.rb.erb
77
+ - app_generators/ambition_adapter/templates/test/sort_test.rb.erb
78
+ - app_generators/ambition_adapter/USAGE
79
+ - bin/ambition_adapter
80
+ - lib/ambition/api.rb
81
+ - lib/ambition/context.rb
82
+ - lib/ambition/core_ext.rb
83
+ - lib/ambition/enumerable.rb
84
+ - lib/ambition/processors/base.rb
85
+ - lib/ambition/processors/ruby.rb
86
+ - lib/ambition/processors/select.rb
87
+ - lib/ambition/processors/slice.rb
88
+ - lib/ambition/processors/sort.rb
89
+ - lib/ambition/sexp_translator.rb
90
+ - lib/ambition.rb
91
+ - LICENSE
92
+ - Manifest
93
+ - README
94
+ - test/adapters/exemplar/association_test.rb
95
+ - test/adapters/exemplar/count_test.rb
96
+ - test/adapters/exemplar/detect_test.rb
97
+ - test/adapters/exemplar/enumerable_test.rb
98
+ - test/adapters/exemplar/helper.rb
99
+ - test/adapters/exemplar/index_operator.rb
100
+ - test/adapters/exemplar/reject_test.rb
101
+ - test/adapters/exemplar/select_test.rb
102
+ - test/adapters/exemplar/slice_test.rb
103
+ - test/adapters/exemplar/sort_test.rb
104
+ - test/debug
105
+ - test/helper.rb
106
+ - ambition.gemspec
107
+ has_rdoc: true
108
+ homepage: http://errtheblog.com/
109
+ post_install_message:
110
+ rdoc_options:
111
+ - --line-numbers
112
+ - --inline-source
113
+ - --title
114
+ - Ambition
115
+ - --main
116
+ - README
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 1.8.6
124
+ version:
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: "0"
130
+ version:
131
+ requirements: []
132
+
133
+ rubyforge_project: err
134
+ rubygems_version: 1.0.1
135
+ signing_key:
136
+ specification_version: 2
137
+ summary: Ambition builds yer API calls from plain jane Ruby.
138
+ test_files: []
139
+