amp-core 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/VERSION +1 -1
- data/lib/amp-core.rb +28 -46
- data/lib/amp-core/amp_plugin.rb +16 -0
- data/lib/amp-core/commands/info.rb +9 -0
- data/lib/amp-core/commands/root.rb +6 -0
- data/lib/amp-core/support/{string_utils.rb → hex_string.rb} +75 -30
- data/spec/plugin_spec.rb +23 -0
- data/spec/repository_specs/repository_spec.rb +0 -1
- data/spec/spec_helper.rb +0 -2
- data/spec/support_specs/hex_string_spec.rb +112 -0
- data/test/test_templates.rb +0 -1
- metadata +11 -8
- data/spec/amp-core_spec.rb +0 -11
- data/spec/support_specs/string_utils_spec.rb +0 -44
data/Gemfile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/amp-core.rb
CHANGED
@@ -1,53 +1,35 @@
|
|
1
|
+
puts "Loading amp-core..."
|
2
|
+
|
3
|
+
require 'amp-core/command_ext/repository_loading'
|
4
|
+
require 'amp-core/repository/repository.rb'
|
5
|
+
require 'amp-core/repository/generic_repo_picker.rb'
|
6
|
+
|
7
|
+
Dir[File.join(File.dirname(__FILE__), 'amp-core', 'commands', '**', '*.rb')].each do |file|
|
8
|
+
require file
|
9
|
+
end
|
10
|
+
|
1
11
|
module Amp
|
2
|
-
module Core
|
3
|
-
end
|
4
12
|
module Support
|
13
|
+
autoload :Template, 'amp-core/templates/template.rb'
|
5
14
|
end
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
autoload :AbstractChangeset, 'amp-core/repository/abstract/abstract_changeset.rb'
|
19
|
-
autoload :AbstractVersionedFile, 'amp-core/repository/abstract/abstract_versioned_file.rb'
|
20
|
-
autoload :CommonChangesetMethods, 'amp-core/repository/abstract/common_methods/changeset.rb'
|
21
|
-
autoload :CommonLocalRepoMethods, 'amp-core/repository/abstract/common_methods/local_repo.rb'
|
22
|
-
autoload :CommonStagingAreaMethods, 'amp-core/repository/abstract/common_methods/staging_area.rb'
|
23
|
-
autoload :CommonChangesetMethods, 'amp-core/repository/abstract/common_methods/changeset.rb'
|
24
|
-
autoload :CommonVersionedFileMethods,'amp-core/repository/abstract/common_methods/versioned_file.rb'
|
25
|
-
end
|
26
|
-
module Support
|
27
|
-
autoload :EncodingUtils, 'amp-core/support/encoding_utils.rb'
|
28
|
-
autoload :Platform, 'amp-core/support/platform_utils.rb'
|
29
|
-
autoload :RootedOpener, 'amp-core/support/rooted_opener.rb'
|
30
|
-
autoload :StringUtils, 'amp-core/support/string_utils.rb'
|
31
|
-
end
|
32
|
-
end
|
15
|
+
module Core
|
16
|
+
module Repositories
|
17
|
+
autoload :GenericRepoPicker, 'amp-core/repository/generic_repo_picker.rb'
|
18
|
+
autoload :AbstractLocalRepository, 'amp-core/repository/abstract/abstract_local_repo.rb'
|
19
|
+
autoload :AbstractStagingArea, 'amp-core/repository/abstract/abstract_staging_area.rb'
|
20
|
+
autoload :AbstractChangeset, 'amp-core/repository/abstract/abstract_changeset.rb'
|
21
|
+
autoload :AbstractVersionedFile, 'amp-core/repository/abstract/abstract_versioned_file.rb'
|
22
|
+
autoload :CommonChangesetMethods, 'amp-core/repository/abstract/common_methods/changeset.rb'
|
23
|
+
autoload :CommonLocalRepoMethods, 'amp-core/repository/abstract/common_methods/local_repo.rb'
|
24
|
+
autoload :CommonStagingAreaMethods, 'amp-core/repository/abstract/common_methods/staging_area.rb'
|
25
|
+
autoload :CommonChangesetMethods, 'amp-core/repository/abstract/common_methods/changeset.rb'
|
26
|
+
autoload :CommonVersionedFileMethods,'amp-core/repository/abstract/common_methods/versioned_file.rb'
|
33
27
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
def initialize(opts={})
|
40
|
-
@opts = opts
|
41
|
-
end
|
42
|
-
|
43
|
-
def load!
|
44
|
-
puts "Loading amp-core..."
|
45
|
-
require 'amp-core/command_ext/repository_loading'
|
46
|
-
require 'amp-core/repository/repository.rb'
|
47
|
-
require 'amp-core/repository/generic_repo_picker.rb'
|
48
|
-
::Amp::Support.class_eval do
|
49
|
-
autoload :Template, "amp-core/templates/template.rb"
|
28
|
+
module Support
|
29
|
+
autoload :EncodingUtils, 'amp-core/support/encoding_utils.rb'
|
30
|
+
autoload :Platform, 'amp-core/support/platform_utils.rb'
|
31
|
+
autoload :RootedOpener, 'amp-core/support/rooted_opener.rb'
|
32
|
+
autoload :HexString, 'amp-core/support/hex_string.rb'
|
50
33
|
end
|
51
|
-
self.class.loader.call
|
52
34
|
end
|
53
35
|
end
|
@@ -19,26 +19,76 @@ module Amp
|
|
19
19
|
# This module is a set of string functions that we use frequently.
|
20
20
|
# They sued to be monkey-patched onto the String class, but we don't
|
21
21
|
# do that anymore.
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
class HexString
|
23
|
+
# Construct a HexString
|
24
|
+
def self.from_bin(bin)
|
25
|
+
HexString === bin ? bin : new(bin, nil)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Construct a HexString
|
29
|
+
def self.from_hex(hex)
|
30
|
+
HexString === hex ? hex : new(nil, hex)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Mainly internal/test helper method; change the encoding in 1.9
|
34
|
+
def self.as_binary(s)
|
35
|
+
if s.respond_to?(:force_encoding)
|
36
|
+
s.force_encoding('binary')
|
37
|
+
else
|
38
|
+
s
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.sha1(str)
|
43
|
+
HexString.from_bin(Digest::SHA1.new.update(str).digest)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Assumes one or the other argument will be nil.
|
47
|
+
# Mostly an internal constructor
|
48
|
+
def initialize(binary_part, hex_part)
|
49
|
+
@binary = self.class.as_binary(binary_part)
|
50
|
+
@hex = hex_part
|
51
|
+
end
|
52
|
+
|
53
|
+
def <=>(other)
|
54
|
+
to_s <=> other.to_s
|
55
|
+
end
|
56
|
+
include Comparable
|
57
|
+
|
58
|
+
# Return raw binary data
|
59
|
+
def to_bin
|
60
|
+
@binary ||= unhexlify
|
61
|
+
end
|
62
|
+
|
63
|
+
# Return hexidecimal representation of binary data
|
64
|
+
def to_hex
|
65
|
+
@hex ||= hexlify
|
66
|
+
end
|
67
|
+
|
68
|
+
# Return hexidecimal representation of binary data
|
69
|
+
alias_method :to_s, :to_hex
|
70
|
+
|
25
71
|
# Converts this text into hex. each letter is replaced with
|
26
72
|
# it's hex counterpart
|
27
|
-
def hexlify
|
28
|
-
|
29
|
-
|
30
|
-
|
73
|
+
def hexlify
|
74
|
+
hex = ""
|
75
|
+
@binary.each_byte do |i|
|
76
|
+
hex << i.to_s(16).rjust(2, "0")
|
31
77
|
end
|
32
|
-
|
78
|
+
hex
|
79
|
+
end
|
80
|
+
|
81
|
+
def empty?
|
82
|
+
to_bin.size == 0
|
33
83
|
end
|
34
84
|
|
35
85
|
if RUBY_VERSION < "1.9"
|
36
86
|
# Returns the value of the first byte of the string.
|
37
87
|
#
|
38
88
|
# @return [Fixnum, 0 <= x < 256] The value of the first byte.
|
39
|
-
def ord
|
40
|
-
raise ArgumentError.new('empty string') if
|
41
|
-
|
89
|
+
def ord
|
90
|
+
raise ArgumentError.new('empty string') if to_bin.empty?
|
91
|
+
to_bin[0]
|
42
92
|
end
|
43
93
|
##
|
44
94
|
# Converts a string of hex into the binary values it represents. This is used for
|
@@ -46,40 +96,35 @@ module Amp
|
|
46
96
|
#
|
47
97
|
# @example StringUtils.unhexlify("DEADBEEF") #=> "\336\255\276\357"
|
48
98
|
# @return [String] the string decoded from hex form
|
49
|
-
def unhexlify
|
50
|
-
|
99
|
+
def unhexlify
|
100
|
+
bin = "\000" * (@hex.size/2)
|
51
101
|
c = 0
|
52
|
-
(0
|
53
|
-
|
54
|
-
|
102
|
+
(0..@hex.size-2).step(2) do |i|
|
103
|
+
byte = @hex[i,2].to_i(16)
|
104
|
+
bin[c] = byte
|
55
105
|
c += 1
|
56
106
|
end
|
57
|
-
|
107
|
+
bin
|
58
108
|
end
|
59
109
|
else
|
60
110
|
# Returns the value of the first byte of the string.
|
61
111
|
#
|
62
112
|
# @return [Fixnum, 0 <= x < 256] The value of the first byte.
|
63
|
-
def ord
|
64
|
-
|
65
|
-
str.ord
|
113
|
+
def ord
|
114
|
+
to_bin.ord
|
66
115
|
end
|
67
116
|
|
68
|
-
def unhexlify
|
69
|
-
|
117
|
+
def unhexlify
|
118
|
+
bin = "\000" * (@hex.size/2)
|
70
119
|
c = 0
|
71
|
-
(0
|
72
|
-
|
73
|
-
|
120
|
+
(0..@hex.size-2).step(2) do |i|
|
121
|
+
byte = @hex[i,2].to_i(16)
|
122
|
+
bin[c] = byte.chr
|
74
123
|
c += 1
|
75
124
|
end
|
76
|
-
|
125
|
+
bin
|
77
126
|
end
|
78
127
|
end
|
79
|
-
|
80
|
-
def sha1(str)
|
81
|
-
Digest::SHA1.new.update(str)
|
82
|
-
end
|
83
128
|
end
|
84
129
|
end
|
85
130
|
end
|
data/spec/plugin_spec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
|
4
|
+
require '../amp-front/lib/amp-front'
|
5
|
+
require 'amp-core/amp_plugin'
|
6
|
+
|
7
|
+
describe "plugin" do
|
8
|
+
it "should have a plugin constant: Amp::Plugins::Core" do
|
9
|
+
result = nil
|
10
|
+
Amp::Plugins.class_eval do
|
11
|
+
result = const_defined?(:Core)
|
12
|
+
end
|
13
|
+
result.should be_true
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should load the plugin' do
|
17
|
+
plugin = Amp::Plugins::Core.new
|
18
|
+
# this is entirely too white-box, but other tests already loaded everything
|
19
|
+
# mucking with the environment would be kind of messy
|
20
|
+
plugin.should_receive(:require)
|
21
|
+
plugin.load!
|
22
|
+
end
|
23
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,112 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# chosen as something that forces the subject to deal with encodings
|
3
|
+
##################################################################
|
4
|
+
# Licensing Information #
|
5
|
+
# #
|
6
|
+
# The following code is licensed, as standalone code, under #
|
7
|
+
# the Ruby License, unless otherwise directed within the code. #
|
8
|
+
# #
|
9
|
+
# For information on the license of this code when distributed #
|
10
|
+
# with and used in conjunction with the other modules in the #
|
11
|
+
# Amp project, please see the root-level LICENSE file. #
|
12
|
+
# #
|
13
|
+
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
14
|
+
# #
|
15
|
+
##################################################################
|
16
|
+
|
17
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
18
|
+
|
19
|
+
describe Amp::Core::Support::HexString do
|
20
|
+
Subject = Amp::Core::Support::HexString
|
21
|
+
describe 'created from binary data' do
|
22
|
+
it 'can be created without error' do
|
23
|
+
Subject.from_bin('A').should be_kind_of(Subject)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'is compareable' do
|
27
|
+
Subject.from_bin('A').should == Subject.from_bin('A')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'is compareable and right' do
|
31
|
+
Subject.from_bin('A').should_not == Subject.from_bin('B')
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#ord' do
|
35
|
+
it 'raises an ArgumentError on an empty string' do
|
36
|
+
lambda { Subject.from_bin('').ord }.should raise_error(ArgumentError)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns the first byte of a simple character' do
|
40
|
+
Subject.from_bin('A').ord.should == 65
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns the first byte of a complex character' do
|
44
|
+
Subject.from_bin('™').ord.should == 226
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#to_bin' do
|
49
|
+
it 'maintains itself' do
|
50
|
+
Subject.from_bin('abcd').to_bin.should == "abcd"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#to_hex' do
|
55
|
+
it 'converts text data to its hex form' do
|
56
|
+
Subject.from_bin('ABCD').to_hex.should == '41424344'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#to_s' do
|
61
|
+
it 'same result as to_hex' do
|
62
|
+
s = Subject.from_bin('ABCD')
|
63
|
+
s.to_s.should == s.to_hex
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'created from hex string' do
|
69
|
+
it 'can be created without error' do
|
70
|
+
Subject.from_hex('ab').should be_kind_of(Subject)
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#ord' do
|
74
|
+
it 'raises an ArgumentError on an empty string' do
|
75
|
+
lambda { Subject.new('').ord }.should raise_error(ArgumentError)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'returns the first byte of a simple character' do
|
79
|
+
Subject.from_hex('41').ord.should == 65
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns the first byte of a complex character' do
|
83
|
+
Subject.from_hex('e2').ord.should == 226
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '#to_bin' do
|
88
|
+
it 'converts a few hex bytes to binary' do
|
89
|
+
Subject.from_hex('abcd').to_bin.should == Subject.as_binary("\xab\xcd")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#to_hex' do
|
94
|
+
it 'maintains itself' do
|
95
|
+
Subject.from_hex('ABCD').to_hex.should == 'ABCD'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#to_s' do
|
100
|
+
it 'same result as to_hex' do
|
101
|
+
s = Subject.from_hex('ABCD')
|
102
|
+
s.to_s.should == s.to_hex
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '::sha1' do
|
108
|
+
it 'creates a HexString' do
|
109
|
+
Subject.sha1('A').should be_kind_of(Subject)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/test/test_templates.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Michael Edgar
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-11-
|
17
|
+
date: 2010-11-11 00:00:00 -06:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -79,7 +79,10 @@ files:
|
|
79
79
|
- features/step_definitions/amp-core_steps.rb
|
80
80
|
- features/support/env.rb
|
81
81
|
- lib/amp-core.rb
|
82
|
+
- lib/amp-core/amp_plugin.rb
|
82
83
|
- lib/amp-core/command_ext/repository_loading.rb
|
84
|
+
- lib/amp-core/commands/info.rb
|
85
|
+
- lib/amp-core/commands/root.rb
|
83
86
|
- lib/amp-core/repository/abstract/abstract_changeset.rb
|
84
87
|
- lib/amp-core/repository/abstract/abstract_local_repo.rb
|
85
88
|
- lib/amp-core/repository/abstract/abstract_staging_area.rb
|
@@ -91,9 +94,9 @@ files:
|
|
91
94
|
- lib/amp-core/repository/generic_repo_picker.rb
|
92
95
|
- lib/amp-core/repository/repository.rb
|
93
96
|
- lib/amp-core/support/encoding_utils.rb
|
97
|
+
- lib/amp-core/support/hex_string.rb
|
94
98
|
- lib/amp-core/support/platform_utils.rb
|
95
99
|
- lib/amp-core/support/rooted_opener.rb
|
96
|
-
- lib/amp-core/support/string_utils.rb
|
97
100
|
- lib/amp-core/templates/git/blank.log.erb
|
98
101
|
- lib/amp-core/templates/git/default.log.erb
|
99
102
|
- lib/amp-core/templates/mercurial/blank.commit.erb
|
@@ -101,17 +104,17 @@ files:
|
|
101
104
|
- lib/amp-core/templates/mercurial/default.commit.erb
|
102
105
|
- lib/amp-core/templates/mercurial/default.log.erb
|
103
106
|
- lib/amp-core/templates/template.rb
|
104
|
-
- spec/amp-core_spec.rb
|
105
107
|
- spec/command_ext_specs/repository_loading_spec.rb
|
106
108
|
- spec/command_ext_specs/spec_helper.rb
|
109
|
+
- spec/plugin_spec.rb
|
107
110
|
- spec/repository_specs/repository_spec.rb
|
108
111
|
- spec/repository_specs/spec_helper.rb
|
109
112
|
- spec/spec.opts
|
110
113
|
- spec/spec_helper.rb
|
111
114
|
- spec/support_specs/encoding_utils_spec.rb
|
115
|
+
- spec/support_specs/hex_string_spec.rb
|
112
116
|
- spec/support_specs/platform_utils_spec.rb
|
113
117
|
- spec/support_specs/spec_helper.rb
|
114
|
-
- spec/support_specs/string_utils_spec.rb
|
115
118
|
- test/test_templates.rb
|
116
119
|
has_rdoc: true
|
117
120
|
homepage: http://github.com/michaeledgar/amp-core
|
@@ -144,14 +147,14 @@ signing_key:
|
|
144
147
|
specification_version: 3
|
145
148
|
summary: The core plugin for Amp. Necessary for Amp to function.
|
146
149
|
test_files:
|
147
|
-
- spec/amp-core_spec.rb
|
148
150
|
- spec/command_ext_specs/repository_loading_spec.rb
|
149
151
|
- spec/command_ext_specs/spec_helper.rb
|
152
|
+
- spec/plugin_spec.rb
|
150
153
|
- spec/repository_specs/repository_spec.rb
|
151
154
|
- spec/repository_specs/spec_helper.rb
|
152
155
|
- spec/spec_helper.rb
|
153
156
|
- spec/support_specs/encoding_utils_spec.rb
|
157
|
+
- spec/support_specs/hex_string_spec.rb
|
154
158
|
- spec/support_specs/platform_utils_spec.rb
|
155
159
|
- spec/support_specs/spec_helper.rb
|
156
|
-
- spec/support_specs/string_utils_spec.rb
|
157
160
|
- test/test_templates.rb
|
data/spec/amp-core_spec.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe "amp-core" do
|
4
|
-
it "should have a plugin constant: Amp::Plugins::Core" do
|
5
|
-
result = nil
|
6
|
-
Amp::Plugins.class_eval do
|
7
|
-
result = const_defined?(:Core)
|
8
|
-
end
|
9
|
-
result.should be_true
|
10
|
-
end
|
11
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
##################################################################
|
2
|
-
# Licensing Information #
|
3
|
-
# #
|
4
|
-
# The following code is licensed, as standalone code, under #
|
5
|
-
# the Ruby License, unless otherwise directed within the code. #
|
6
|
-
# #
|
7
|
-
# For information on the license of this code when distributed #
|
8
|
-
# with and used in conjunction with the other modules in the #
|
9
|
-
# Amp project, please see the root-level LICENSE file. #
|
10
|
-
# #
|
11
|
-
# © Michael J. Edgar and Ari Brown, 2009-2010 #
|
12
|
-
# #
|
13
|
-
##################################################################
|
14
|
-
|
15
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
16
|
-
|
17
|
-
describe Amp::Core::Support::StringUtils do
|
18
|
-
describe '#ord' do
|
19
|
-
it 'raises an ArgumentError on an empty string' do
|
20
|
-
lambda { Amp::Core::Support::StringUtils.ord('') }.should raise_error(ArgumentError)
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'returns the first byte of the string' do
|
24
|
-
Amp::Core::Support::StringUtils.ord('A').should == 65
|
25
|
-
Amp::Core::Support::StringUtils.ord('™').should == 226
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe '#unhexlify' do
|
30
|
-
it 'converts a few hex bytes to binary' do
|
31
|
-
Amp::Core::Support::StringUtils.unhexlify('abcd').should == "\xab\xcd"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe '#hexlify' do
|
36
|
-
it 'converts text data to its hex form' do
|
37
|
-
Amp::Core::Support::StringUtils.hexlify('ABCD').should == '41424344'
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'converts binary data to its hex form' do
|
41
|
-
Amp::Core::Support::StringUtils.hexlify('ABCD').should == '41424344'
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|