graft 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,123 +1,50 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: graft
3
- version: !ruby/object:Gem::Version
4
- version: 0.2.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
5
  platform: ruby
6
- authors:
7
- - Patrick Reagan
6
+ authors:
7
+ - Loic Nageleisen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
-
12
- date: 2010-01-25 00:00:00 -05:00
13
- default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: hpricot
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 0.6.164
24
- version:
25
- - !ruby/object:Gem::Dependency
26
- name: tzinfo
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 0.3.12
34
- version:
35
- - !ruby/object:Gem::Dependency
36
- name: builder
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: 2.1.2
44
- version:
45
- - !ruby/object:Gem::Dependency
46
- name: activesupport
47
- type: :runtime
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: "2.0"
54
- version:
55
- - !ruby/object:Gem::Dependency
56
- name: json
57
- type: :runtime
58
- version_requirement:
59
- version_requirements: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- version: 1.1.7
64
- version:
65
- description:
66
- email: reaganpr@gmail.com
11
+ date: 2024-05-17 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Vendor-independent collaborative hooking library for Ruby
14
+ email: loic.nageleisen@gmail.com
67
15
  executables: []
68
-
69
16
  extensions: []
70
-
71
- extra_rdoc_files:
72
- - README.rdoc
73
- files:
74
- - README.rdoc
75
- - Rakefile
76
- - lib/graft/core_ext/hash.rb
77
- - lib/graft/json/attribute.rb
78
- - lib/graft/json/model.rb
79
- - lib/graft/json.rb
80
- - lib/graft/model.rb
81
- - lib/graft/version.rb
82
- - lib/graft/xml/attribute.rb
83
- - lib/graft/xml/model.rb
84
- - lib/graft/xml/type.rb
85
- - lib/graft/xml.rb
86
- - test/test_helper.rb
87
- - test/unit/core_ext/hash_test.rb
88
- - test/unit/json/attribute_test.rb
89
- - test/unit/json/model_test.rb
90
- - test/unit/xml/attribute_test.rb
91
- - test/unit/xml/model_test.rb
92
- - test/unit/xml/type_test.rb
93
- has_rdoc: true
94
- homepage: http://sneaq.net/
95
- licenses: []
96
-
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/graft.rb
20
+ - lib/graft/callback.rb
21
+ - lib/graft/hook.rb
22
+ - lib/graft/hook_point.rb
23
+ - lib/graft/stack.rb
24
+ homepage: https://rubygems.org/gems/graft
25
+ licenses:
26
+ - BSD-3-Clause
27
+ - Apache-2.0
28
+ metadata:
29
+ rubygems_mfa_required: 'true'
30
+ source_code_uri: https://github.com/DataDog/graft-rb
97
31
  post_install_message:
98
- rdoc_options:
99
- - --main
100
- - README.rdoc
101
- require_paths:
32
+ rdoc_options: []
33
+ require_paths:
102
34
  - lib
103
- required_ruby_version: !ruby/object:Gem::Requirement
104
- requirements:
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
105
37
  - - ">="
106
- - !ruby/object:Gem::Version
107
- version: "0"
108
- version:
109
- required_rubygems_version: !ruby/object:Gem::Requirement
110
- requirements:
38
+ - !ruby/object:Gem::Version
39
+ version: '2.5'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
111
42
  - - ">="
112
- - !ruby/object:Gem::Version
113
- version: "0"
114
- version:
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
115
45
  requirements: []
116
-
117
- rubyforge_project:
118
- rubygems_version: 1.3.5
46
+ rubygems_version: 3.4.19
119
47
  signing_key:
120
- specification_version: 3
121
- summary: Graft provides an easy way to map XML and JSON data onto your Ruby classes
48
+ specification_version: 4
49
+ summary: Standardised hook interface
122
50
  test_files: []
123
-
data/README.rdoc DELETED
@@ -1,138 +0,0 @@
1
- = Graft
2
-
3
- == Description
4
-
5
- Graft provides an easy way to map XML and JSON data onto your Ruby classes.
6
-
7
- == Installation
8
-
9
- Stable:
10
-
11
- $ sudo gem install graft
12
-
13
- Bleeding edge:
14
-
15
- $ git clone git://github.com/reagent/graft.git
16
- $ cd graft && rake gem
17
- $ sudo gem install pkg/graft-<version>.gem
18
-
19
- == Usage
20
-
21
- When interacting with APIs, it's quite often the case that the data returned as
22
- part of the response is represented either as XML or JSON. The Graft library makes
23
- turning that data into Ruby objects pretty simple. This code was an extraction from
24
- my work on both the Fleakr[http://reagent.github.com/fleakr] and
25
- Etsy[http://github.com/reagent/etsy] gems.
26
-
27
- === Mapping XML
28
-
29
- If you want to use Graft in XML mode, you'll need to include the right library:
30
-
31
- require 'rubygems'
32
- require 'graft/xml'
33
-
34
- Once that is set up, you can take an XML string like this:
35
-
36
- <rsp>
37
- <user nsid="3">reagent</user>
38
- <name>Patrick Reagan</name>
39
- </rsp>
40
-
41
- And map it onto a Ruby class:
42
-
43
- class User
44
- include Graft
45
-
46
- attribute :name
47
- attribute :username, :from => 'user'
48
- attribute :id, :from => 'user@nsid', :type => :integer
49
- end
50
-
51
- There are a couple of ways to pull this data into the +User+ object. The simplest
52
- is from the constructor:
53
-
54
- user = User.new(xml)
55
-
56
- There is also a +populate_from+ instance method that will do the same:
57
-
58
- user = User.new
59
- user.populate_from(xml)
60
-
61
- This second method is useful if the data you want in your Ruby object comes from 2
62
- separate XML files. Accessing it is simple:
63
-
64
- >> user.name # => "Patrick Reagan"
65
- >> user.username # => "reagent"
66
- >> user.id # => 3
67
-
68
- === Mapping JSON
69
-
70
- The process of mapping JSON is similar to XML, except:
71
-
72
- * You don't need to declare the type of the attribute
73
- * You need to provide a full path to the JSON value
74
-
75
- To get started, include the correct library:
76
-
77
- require 'rubygems'
78
- require 'graft/json'
79
-
80
- Then for simple JSON data:
81
-
82
- {
83
- "rsp": {
84
- "user_id": 3,
85
- "username": "reagent",
86
- "name": "Patrick Reagan"
87
- }
88
- }
89
-
90
- You can map it in a similar way:
91
-
92
- class User
93
- include Graft
94
-
95
- attribute :name, :from => 'rsp/name'
96
- attribute :username, :from => 'rsp/username'
97
- attribute :id, :from => 'rsp/user_id'
98
- end
99
-
100
- Again, you can initialize the values from both the constructor:
101
-
102
- user = User.new(json)
103
-
104
- Or the +populate_from+ method:
105
-
106
- user = User.new
107
- user.populate_from(json)
108
-
109
- The results are the same:
110
-
111
- >> user.name # => "Patrick Reagan"
112
- >> user.username # => "reagent"
113
- >> user.id # => 3
114
-
115
- == License
116
-
117
- Copyright (c) 2009 Patrick Reagan (reaganpr@gmail.com)
118
-
119
- Permission is hereby granted, free of charge, to any person
120
- obtaining a copy of this software and associated documentation
121
- files (the "Software"), to deal in the Software without
122
- restriction, including without limitation the rights to use,
123
- copy, modify, merge, publish, distribute, sublicense, and/or sell
124
- copies of the Software, and to permit persons to whom the
125
- Software is furnished to do so, subject to the following
126
- conditions:
127
-
128
- The above copyright notice and this permission notice shall be
129
- included in all copies or substantial portions of the Software.
130
-
131
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
132
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
133
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
134
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
135
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
136
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
137
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
138
- OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile DELETED
@@ -1,43 +0,0 @@
1
- require 'rubygems'
2
- require 'rake/gempackagetask'
3
- require 'rake/testtask'
4
-
5
- require 'lib/graft/version'
6
-
7
- task :default => :test
8
-
9
- spec = Gem::Specification.new do |s|
10
- s.name = 'graft'
11
- s.version = Graft::Version.to_s
12
- s.has_rdoc = true
13
- s.extra_rdoc_files = %w(README.rdoc)
14
- s.rdoc_options = %w(--main README.rdoc)
15
- s.summary = "Graft provides an easy way to map XML and JSON data onto your Ruby classes"
16
- s.author = 'Patrick Reagan'
17
- s.email = 'reaganpr@gmail.com'
18
- s.homepage = 'http://sneaq.net/'
19
- s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib,test}/**/*")
20
-
21
- s.add_dependency('hpricot', '>= 0.6.164')
22
- s.add_dependency('tzinfo', '>= 0.3.12')
23
- s.add_dependency('builder', '>= 2.1.2')
24
- s.add_dependency('activesupport', '>= 2.0')
25
- s.add_dependency('json', '>= 1.1.7')
26
- end
27
-
28
- Rake::GemPackageTask.new(spec) do |pkg|
29
- pkg.gem_spec = spec
30
- end
31
-
32
- Rake::TestTask.new do |t|
33
- t.libs << 'test'
34
- t.test_files = FileList["test/**/*_test.rb"]
35
- t.verbose = true
36
- end
37
-
38
- desc 'Generate the gemspec to serve this Gem from Github'
39
- task :github do
40
- file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
41
- File.open(file, 'w') {|f| f << spec.to_ruby }
42
- puts "Created gemspec: #{file}"
43
- end
@@ -1,9 +0,0 @@
1
- class Hash
2
-
3
- def /(path)
4
- path.to_s.split('/').inject(self) do |data, key|
5
- (data.is_a?(Hash) && data[key]) ? data[key] : nil
6
- end
7
- end
8
-
9
- end
@@ -1,18 +0,0 @@
1
- module Graft
2
- module Json
3
- class Attribute
4
-
5
- attr_reader :name, :source
6
-
7
- def initialize(name, source = nil)
8
- @name = name
9
- @source = source.nil? ? @name.to_s : source
10
- end
11
-
12
- def value_from(data)
13
- data/source
14
- end
15
-
16
- end
17
- end
18
- end
@@ -1,28 +0,0 @@
1
- module Graft
2
- module Json
3
- module Model
4
-
5
- module ClassMethods
6
-
7
- def attribute(name, options = {})
8
- source = options[:from]
9
-
10
- self.attributes << Graft::Json::Attribute.new(name, source)
11
- class_eval "attr_accessor :#{name}"
12
- end
13
-
14
- def data_from(json_or_hash)
15
- json_or_hash.is_a?(String) ? JSON.parse(json_or_hash) : json_or_hash
16
- end
17
-
18
- end
19
-
20
- def self.included(other)
21
- other.send(:extend, Graft::Model::ClassMethods)
22
- other.send(:extend, Graft::Json::Model::ClassMethods)
23
- other.send(:include, Graft::Model::InstanceMethods)
24
- end
25
-
26
- end
27
- end
28
- end
data/lib/graft/json.rb DELETED
@@ -1,14 +0,0 @@
1
- $:.unshift File.dirname(__FILE__) + '/..'
2
-
3
- require 'json'
4
- require 'graft/core_ext/hash'
5
-
6
- require 'graft/model'
7
- require 'graft/json/attribute'
8
- require 'graft/json/model'
9
-
10
- module Graft
11
- def self.included(other)
12
- other.send(:include, Graft::Json::Model)
13
- end
14
- end
data/lib/graft/model.rb DELETED
@@ -1,39 +0,0 @@
1
- module Graft
2
- module Model
3
-
4
- module ClassMethods
5
- def attributes
6
- @attributes ||= []
7
- end
8
-
9
- def collection_from(data_source, node)
10
- (data_from(data_source)/node).map {|n| new n }
11
- end
12
- end
13
-
14
- module InstanceMethods
15
-
16
- def initialize(source_data = nil)
17
- self.source_data = source_data
18
- self.populate_from(self.source_data) unless self.source_data.nil?
19
- end
20
-
21
- def source_data=(source_data)
22
- @source_data = self.class.data_from(source_data)
23
- end
24
-
25
- def source_data
26
- @source_data
27
- end
28
-
29
- def populate_from(data_source)
30
- self.class.attributes.each do |attribute|
31
- value = attribute.value_from(self.class.data_from(data_source))
32
- self.send("#{attribute.name}=".to_sym, value) unless value.nil?
33
- end
34
- end
35
-
36
- end
37
-
38
- end
39
- end
data/lib/graft/version.rb DELETED
@@ -1,13 +0,0 @@
1
- module Graft
2
- module Version
3
-
4
- MAJOR = 0
5
- MINOR = 2
6
- TINY = 1
7
-
8
- def self.to_s # :nodoc:
9
- [MAJOR, MINOR, TINY].join('.')
10
- end
11
-
12
- end
13
- end
@@ -1,55 +0,0 @@
1
- module Graft
2
- module Xml
3
- class Attribute
4
-
5
- # TODO: Refactor the location / attribute logic into a Source class
6
-
7
- attr_reader :name, :sources
8
-
9
- def initialize(name, type = :string, sources = nil)
10
- @name = name.to_sym
11
- @type = type
12
-
13
- @sources = Array(sources)
14
- @sources << @name.to_s if @sources.empty?
15
- end
16
-
17
- def type_class
18
- "Graft::Xml::Type::#{@type.to_s.camelize}".constantize
19
- end
20
-
21
- def split(source)
22
- location, attribute = source.split('@')
23
- location = self.name.to_s if location.blank?
24
-
25
- [location, attribute]
26
- end
27
-
28
- def node_for(document, source)
29
- document.at(location(source)) || document.search("//[@#{attribute(source)}]").first
30
- end
31
-
32
- def attribute(source)
33
- location, attribute = source.split('@')
34
- attribute || location
35
- end
36
-
37
- def location(source)
38
- split(source).first
39
- end
40
-
41
- def value_from(document)
42
- values = sources.map do |source|
43
- node = node_for(document, source)
44
- if !node.nil?
45
- possible_values = [node.attributes[attribute(source)], node.inner_text]
46
- possible_values.detect {|value| !value.blank? }
47
- end
48
- end
49
-
50
- type_class.new(values.compact.first).value
51
- end
52
-
53
- end
54
- end
55
- end
@@ -1,49 +0,0 @@
1
- module Graft
2
- module Xml
3
- module Model
4
-
5
- module ClassMethods
6
-
7
- def attribute(name, options = {})
8
- source = options[:from]
9
- type = options[:type] || :string
10
-
11
- self.attributes << Graft::Xml::Attribute.new(name, type, source)
12
- class_eval "attr_accessor :#{name}"
13
- end
14
-
15
- def data_from(xml_or_document)
16
- xml_or_document.is_a?(String) ? Hpricot.XML(xml_or_document) : xml_or_document
17
- end
18
-
19
- end
20
-
21
- module InstanceMethods
22
-
23
- def to_hash
24
- self.class.attributes.inject({}) {|h,a| h.merge(a.name.to_s => send(a.name)) }
25
- end
26
-
27
- def to_xml(tag_name)
28
- xml = Builder::XmlMarkup.new
29
- xml.instruct!
30
- xml.tag! tag_name do
31
- to_hash.each do |attribute, value|
32
- xml.tag! attribute, value
33
- end
34
- end
35
- xml.target!
36
- end
37
-
38
- end
39
-
40
- def self.included(other)
41
- other.send(:extend, Graft::Model::ClassMethods)
42
- other.send(:extend, Graft::Xml::Model::ClassMethods)
43
- other.send(:include, Graft::Model::InstanceMethods)
44
- other.send(:include, Graft::Xml::Model::InstanceMethods)
45
- end
46
-
47
- end
48
- end
49
- end
@@ -1,91 +0,0 @@
1
- module Graft
2
- module Xml
3
-
4
- # = Type
5
- #
6
- class Type
7
-
8
- class ConversionError < StandardError; end
9
-
10
- def initialize(source)
11
- @source = source
12
- end
13
-
14
- def convertible?
15
- true
16
- end
17
-
18
- def value
19
- raise ConversionError unless (@source.blank? || convertible?)
20
- @source.blank? ? nil : convert
21
- end
22
-
23
- # = String
24
- #
25
- class String < Type
26
-
27
- def convert
28
- @source
29
- end
30
-
31
- end
32
-
33
- # = Boolean
34
- #
35
- class Boolean < Type
36
- def true_values
37
- ['true', '1']
38
- end
39
-
40
- def false_values
41
- ['false', '0']
42
- end
43
-
44
- def convertible?
45
- (true_values + false_values).include?(@source)
46
- end
47
-
48
- def convert
49
- true_values.include?(@source) ? true : false
50
- end
51
- end
52
-
53
- # = Integer
54
- #
55
- class Integer < Type
56
- def convertible?
57
- !@source.match(/\d+/).nil?
58
- end
59
-
60
- def convert
61
- @source.to_i
62
- end
63
- end
64
-
65
- # = Time
66
- #
67
- class Time < Type
68
-
69
- def timestamp?
70
- !@source.match(/^\d+$/).nil?
71
- end
72
-
73
- def convert
74
- timestamp? ? ::Time.at(@source.to_i) : ::Time.parse(@source)
75
- end
76
-
77
- end
78
-
79
- # = Date
80
- #
81
- class Date < Type
82
-
83
- def convert
84
- ::Date.parse(@source)
85
- end
86
-
87
- end
88
-
89
- end
90
- end
91
- end
data/lib/graft/xml.rb DELETED
@@ -1,27 +0,0 @@
1
- $:.unshift File.dirname(__FILE__) + '/..'
2
-
3
- require 'hpricot'
4
- require 'builder'
5
- require 'tzinfo'
6
-
7
- begin
8
- # ActiveSupport < 2.3.5
9
- require 'active_support/core_ext/blank'
10
- rescue NameError
11
- # ActiveSupport >= 2.3.5 will raise a NameError exception
12
- require 'active_support/core_ext/object/blank'
13
- end
14
-
15
- require 'active_support/time_with_zone'
16
- require 'active_support/inflector'
17
-
18
- require 'graft/model'
19
- require 'graft/xml/type'
20
- require 'graft/xml/attribute'
21
- require 'graft/xml/model'
22
-
23
- module Graft
24
- def self.included(other)
25
- other.send(:include, Graft::Xml::Model)
26
- end
27
- end