dm-regex 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []