graft 0.2.1 → 0.3.0

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.
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