dm-regex 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.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ coverage
2
+ pkg
3
+ Gemfile.lock
4
+ .rvmrc
5
+ gems
6
+ bin
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - rbx
6
+ - jruby
7
+ - ree
8
+ - ruby-head
9
+ - 2.0.0
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ dm-regex
2
+ ===
3
+
4
+ [![Build Status](https://travis-ci.org/locomote/dm-regex.png)](https://travis-ci.org/locomote/dm-regex)
5
+ [![Dependency Status](https://gemnasium.com/locomote/dm-regex.png)](https://gemnasium.com/locomote/dm-regex)
6
+
7
+ Installation
8
+ ---
9
+
10
+ ```
11
+ gem install dm-regex
12
+ ```
13
+
14
+ Usage
15
+ ---
16
+ ``` ruby
17
+ require 'dm-regex'
18
+
19
+ class ApacheLogEntry
20
+ include DataMapper::Resource
21
+
22
+ property :id , Serial
23
+ property :h , String , :pat => /[.0-9]+?/
24
+ property :l , String
25
+ property :u , String
26
+ property :t , DateTime , :method => lambda { |value| DateTime.strptime(value, '%d/%b/%Y:%H:%M:%S %z') }
27
+ property :r , String
28
+ property :s , Integer
29
+ property :b , Integer
30
+ property :referer , String
31
+ property :user_agent , String
32
+
33
+ compile '^\g<h> \g<l> \g<u> \[\g<t>\] "\g<r>" \g<s> \g<b> "\g<referer>" "\g<user_agent>"$'
34
+ end
35
+
36
+
37
+ DataMapper.setup :default, "sqlite::memory:"
38
+ require 'dm-migrations'
39
+ DataMapper.auto_upgrade!
40
+
41
+ p ApacheLogEntry.match(
42
+ '87.18.183.252 - - [13/Aug/2008:00:50:49 -0700] "GET /blog/index.xml HTTP/1.1" 302 527 "-" "Feedreader 3.13 (Powered by Newsbrain)"'
43
+ )
44
+ # => #<ApacheLogEntry @id=nil @h="87.18.183.252" @l="-" @u="-" @t=#<DateTime: 2008-08-13T00:50:49-07:00 ((2454692j,28249s,0n),-25200s,2299161j)> @r="GET /blog/index.xml HTTP/1.1" @s=302 @b=527 @referer="-" @user_agent="Feedreader 3.13 (Powered by Newsbrain)">
45
+ ```
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require 'bundler'
2
+ Bundler.setup
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ require "rspec/core/rake_task"
6
+
7
+ task "default" => "spec"
8
+
9
+ RSpec::Core::RakeTask.new do |t|
10
+ t.pattern = 'spec/**/*_spec.rb'
11
+ t.rspec_opts = ["--colour", "--format", "nested"]
12
+ end
data/dm-regex.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/dm-regex/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = [ 'locochris' ]
6
+ gem.email = [ 'chris@locomote.com.au' ]
7
+ gem.summary = 'DataMapper plugin enabling models to be created from matching a regex'
8
+ gem.description = gem.summary
9
+ gem.homepage = "http://github.com/locomote/dm-regex"
10
+
11
+ gem.files = `git ls-files`.split("\n")
12
+ gem.test_files = `git ls-files -- {spec}/*`.split("\n")
13
+
14
+ gem.name = 'dm-regex'
15
+ gem.require_paths = [ "lib" ]
16
+ gem.version = DataMapper::Regex::VERSION
17
+
18
+ gem.add_runtime_dependency('dm-core', '~> 1.0')
19
+ gem.add_runtime_dependency('dm-migrations', '~> 1.0')
20
+ gem.add_runtime_dependency('dm-sqlite-adapter', '~> 1.0')
21
+
22
+ gem.add_development_dependency('rake', '~> 10.0')
23
+ gem.add_development_dependency('rspec', '~> 2.0')
24
+ end
@@ -0,0 +1,68 @@
1
+ require 'dm-core'
2
+
3
+ module DataMapper
4
+ module Regex
5
+ def self.included(model)
6
+ model.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+ attr_reader :pat
11
+
12
+ def compile(pattern, options=0)
13
+ @group_names = pattern.scan(/\\g<(\w+)>/).flatten.map(&:to_sym)
14
+ @pat = ::Regexp.compile("#{groups}#{pattern}", options)
15
+ end
16
+
17
+ def match(buf, parent=self)
18
+ pat.match(buf) { |m| parent.first_or_new(attrs_from_match(m)) }
19
+ end
20
+
21
+ def property(name, type, opts={}, &block)
22
+ if group_pat = opts.delete(:pat)
23
+ map_pat[name] = group_pat
24
+ end
25
+ if group_method = opts.delete(:method)
26
+ map_method[name] = group_method
27
+ end
28
+ super
29
+ end
30
+
31
+ private
32
+
33
+ def map_pat
34
+ @map_pat ||= {}
35
+ end
36
+
37
+ def map_method
38
+ @map_method ||= {}
39
+ end
40
+
41
+ def map_value(name, value)
42
+ value
43
+ end
44
+
45
+ def groups
46
+ @groups ||= @group_names.inject("") { |str, name|
47
+ str << "(?<#{name}>#{map_pat.fetch(name, '.+?')}){0}"
48
+ }
49
+ end
50
+
51
+ def attrs_from_match(m)
52
+ properties.map(&:name).inject({}) { |h, k|
53
+ if @group_names.include?(k)
54
+ value = m[k]
55
+ if method = map_method[k]
56
+ value = method.call(value)
57
+ end
58
+ h.update(k => value)
59
+ else
60
+ h
61
+ end
62
+ }
63
+ end
64
+ end
65
+ end
66
+
67
+ Model.append_inclusions(Regex)
68
+ end
@@ -0,0 +1,5 @@
1
+ module DataMapper
2
+ module Regex
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
data/lib/dm-regex.rb ADDED
@@ -0,0 +1 @@
1
+ require 'dm-regex/regex'
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ class ApacheLogEntry
4
+ include DataMapper::Resource
5
+
6
+ property :id , Serial
7
+ property :h , String , :pat => /[.0-9]+?/
8
+ property :l , String
9
+ property :u , String
10
+ property :t , DateTime , :method => lambda { |value| DateTime.strptime(value, '%d/%b/%Y:%H:%M:%S %z') }
11
+ property :r , String
12
+ property :s , Integer
13
+ property :b , Integer
14
+ property :referer , String
15
+ property :user_agent , String
16
+
17
+ # 87.18.183.252 - - [13/Aug/2008:00:50:49 -0700] "GET /blog/index.xml HTTP/1.1" 302 527 "-" "Feedreader 3.13 (Powered by Newsbrain)"
18
+ compile '^\g<h> \g<l> \g<u> \[\g<t>\] "\g<r>" \g<s> \g<b> "\g<referer>" "\g<user_agent>"$'
19
+ end
20
+
21
+
22
+ DataMapper.setup :default, "sqlite::memory:"
23
+ DataMapper.auto_upgrade!
24
+
25
+ describe DataMapper::Regex do
26
+ describe '.match' do
27
+ subject { ApacheLogEntry.match(line) }
28
+
29
+ before :all do
30
+
31
+ end
32
+
33
+ let(:line) {
34
+ '87.18.183.252 - - [13/Aug/2008:00:50:49 -0700] "GET /blog/index.xml HTTP/1.1" 302 527 "-" "Feedreader 3.13 (Powered by Newsbrain)"'
35
+ }
36
+
37
+ its(:h) { should == '87.18.183.252' }
38
+ its(:l) { should == '-' }
39
+ its(:u) { should == '-' }
40
+ its(:t) { should == DateTime.parse('13/08/2008T00:50:49 -0700') }
41
+ its(:r) { should == 'GET /blog/index.xml HTTP/1.1' }
42
+ its(:s) { should == 302 }
43
+ its(:b) { should == 527 }
44
+ its(:referer) { should == '-' }
45
+ its(:user_agent) { should == 'Feedreader 3.13 (Powered by Newsbrain)' }
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ require 'dm-regex'
2
+ require 'dm-migrations'
3
+
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dm-regex
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - locochris
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: dm-core
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: dm-migrations
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: dm-sqlite-adapter
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '1.0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '10.0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '10.0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '2.0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '2.0'
94
+ description: DataMapper plugin enabling models to be created from matching a regex
95
+ email:
96
+ - chris@locomote.com.au
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - .travis.yml
103
+ - Gemfile
104
+ - README.md
105
+ - Rakefile
106
+ - dm-regex.gemspec
107
+ - lib/dm-regex.rb
108
+ - lib/dm-regex/regex.rb
109
+ - lib/dm-regex/version.rb
110
+ - spec/dm-regex_spec.rb
111
+ - spec/spec_helper.rb
112
+ homepage: http://github.com/locomote/dm-regex
113
+ licenses: []
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ segments:
125
+ - 0
126
+ hash: -1581250388491881790
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ segments:
134
+ - 0
135
+ hash: -1581250388491881790
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 1.8.24
139
+ signing_key:
140
+ specification_version: 3
141
+ summary: DataMapper plugin enabling models to be created from matching a regex
142
+ test_files: []