scoped 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: afcd7140f27e740f73d6b732543df70a0026a4c0
4
+ data.tar.gz: 54ce2dac7b7dd04c1696f384b6f054128a1e0eb3
5
+ SHA512:
6
+ metadata.gz: f7bc38329402cdbe4180fd68c9b5e755d9b244019408c58c3a4385d1e9f26c9115cde4bb313c7c6fc6bee97c6174135fb715f77cc9f0969d383aba097bd186a9
7
+ data.tar.gz: 175e18de532071a6f9115d47dfe7fa4c756f9561d144b2e244d6a7a50abd999b8e4e9b4d63b8b99b0f27519e016bd58347cf9966aa555b0e841b696ca7e0b0de
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/History.txt ADDED
@@ -0,0 +1,3 @@
1
+ == 0.0.1
2
+
3
+ * Inception... without Leo
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ A rigid, readable alternative for defining AR scopes.
2
+
3
+ ## Installation
4
+
5
+ `gem install scoped`
6
+
7
+ ## Usage
8
+
9
+ ```ruby
10
+ require 'scoped'
11
+ ```
12
+
13
+ Then in your `ActiveRecord` models:
14
+
15
+ ```ruby
16
+ class Meme < ActiveRecord::Base
17
+ include Scoped
18
+
19
+ scopes do
20
+ sad_keanu { where(name: 'Keanu Reaves') }
21
+ end
22
+ end
23
+ ```
24
+
25
+ ```ruby
26
+ Meme.sad_keanu #=> an ActiveRecord::Relation of Memes!
27
+ ```
28
+
29
+ ## Requirements
30
+
31
+ Requires ActiveRecord >= 3.1.0, <= 4.1.0, tested with Ruby 1.9.3, 2.0.0, and 2.1.0.
32
+
33
+ ## Running Tests
34
+
35
+ `bundle exec rspec`
36
+
37
+ ## Authors
38
+
39
+ * Evan Sherwood: http://github.com/neezer
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
2
+
3
+ require 'bundler'
4
+ require 'rspec/core/rake_task'
5
+ require 'rubygems/package_task'
6
+
7
+ require './lib/scoped'
8
+
9
+ Bundler::GemHelper.install_tasks
10
+
11
+ task :default => :spec
12
+
13
+ desc 'Run specs'
14
+ RSpec::Core::RakeTask.new do |t|
15
+ t.pattern = './spec/**/*_spec.rb'
16
+ end
data/lib/scoped.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'active_record'
2
+
3
+ module Scoped
4
+ autoload :ScopeCollection, 'scoped/scope_collection'
5
+
6
+ extend ActiveSupport::Concern
7
+
8
+ module ClassMethods
9
+ def scopes(&block)
10
+ ScopeCollection.new(&block).all.each do |name, source|
11
+ scope(name, eval(source))
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,50 @@
1
+ module Scoped
2
+ class ScopeCollection
3
+ def initialize(&block)
4
+ @scopes = {}
5
+ instance_eval &block
6
+ end
7
+
8
+ def all
9
+ @scopes
10
+ end
11
+
12
+ def method_missing(name, *args, &block)
13
+ return super unless block_given?
14
+
15
+ arg_list, block_contents = parse(block.source.split("\n"))
16
+
17
+ @scopes[name] = <<-RUBY
18
+ lambda do #{"|#{arg_list}|" if arg_list}
19
+ #{block_contents.join("\n")}
20
+ end
21
+ RUBY
22
+ end
23
+
24
+ private
25
+
26
+ def parse(block_source)
27
+ if block_source.size > 1
28
+ parse_multiline(block_source)
29
+ else
30
+ parse_single_line(block_source.first)
31
+ end
32
+ end
33
+
34
+ def parse_single_line(block_source)
35
+ block_source.strip.match(%r(^.+\{\s*(\|.*\|)?(.+?)\}.*$)).tap do |matchdata|
36
+ arg_list = (matchdata.captures[0] || '')[1..-2]
37
+ block_contents = matchdata.captures[1].strip
38
+ break [arg_list, [block_contents]]
39
+ end
40
+ end
41
+
42
+ def parse_multiline(block_source)
43
+ arg_list = block_source[0].match(%r(\|(.+?)\|)).tap do |match|
44
+ break (match && match.captures.any?) ? match.captures.first : nil
45
+ end
46
+ block_contents = block_source[1..-2]
47
+ [arg_list, block_contents]
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,3 @@
1
+ module Scoped
2
+ VERSION = '0.0.1'
3
+ end
data/scoped.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), 'lib')
2
+ require 'scoped/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "scoped"
6
+ s.version = ::Scoped::VERSION
7
+ s.authors = ["Evan Sherwood"]
8
+ s.email = ["evan@sherwood.io"]
9
+ s.homepage = "http://github.com/neezer"
10
+
11
+ s.description = s.summary = "A rigid, readable alternative for defining AR scopes."
12
+
13
+ s.platform = Gem::Platform::RUBY
14
+ s.has_rdoc = true
15
+
16
+ if ENV["AR"]
17
+ s.add_dependency 'activerecord', ENV["AR"]
18
+ else
19
+ s.add_dependency 'activerecord', '>= 3.1.0', '< 5'
20
+ end
21
+
22
+ s.require_path = 'lib'
23
+ s.files = Dir["{lib,spec}/**/*", "Gemfile", "History.txt", "README.md", "Rakefile", "scoped.gemspec"]
24
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scoped
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Evan Sherwood
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.1.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
33
+ description: A rigid, readable alternative for defining AR scopes.
34
+ email:
35
+ - evan@sherwood.io
36
+ executables: []
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - Gemfile
41
+ - History.txt
42
+ - README.md
43
+ - Rakefile
44
+ - lib/scoped.rb
45
+ - lib/scoped/scope_collection.rb
46
+ - lib/scoped/version.rb
47
+ - scoped.gemspec
48
+ homepage: http://github.com/neezer
49
+ licenses: []
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 2.2.2
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: A rigid, readable alternative for defining AR scopes.
71
+ test_files: []