ia-redis-rpc 2.0.0.pre.dev

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.
Binary file
@@ -0,0 +1,329 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="438px" height="236.632px" viewBox="0 0 438 236.632" enable-background="new 0 0 438 236.632" xml:space="preserve">
6
+ <path fill="#CCCCCC" stroke="#000000" stroke-miterlimit="10" d="M299.5,146.566c0,6.627-5.373,12-12,12h-138
7
+ c-6.627,0-12-5.373-12-12v-111c0-6.627,5.373-12,12-12h138c6.627,0,12,5.373,12,12V146.566z"/>
8
+ <g>
9
+ <path d="M199.735,3.092c0.792-0.144,1.945-0.252,3.007-0.252c1.674,0,2.772,0.324,3.511,0.99c0.594,0.54,0.955,1.368,0.955,2.323
10
+ c0,1.584-1.008,2.647-2.269,3.079v0.054c0.918,0.324,1.477,1.188,1.765,2.449c0.396,1.692,0.684,2.863,0.937,3.331h-1.621
11
+ c-0.198-0.36-0.468-1.386-0.792-2.899c-0.36-1.674-1.026-2.305-2.449-2.359h-1.476v5.258h-1.567V3.092z M201.302,8.62h1.602
12
+ c1.675,0,2.737-0.918,2.737-2.305c0-1.566-1.135-2.251-2.791-2.251c-0.756,0-1.278,0.054-1.548,0.126V8.62z"/>
13
+ <path d="M210.32,10.997c0.036,2.143,1.386,3.025,2.989,3.025c1.134,0,1.836-0.198,2.413-0.45l0.288,1.134
14
+ c-0.558,0.252-1.53,0.559-2.917,0.559c-2.683,0-4.286-1.783-4.286-4.412c0-2.628,1.548-4.681,4.087-4.681
15
+ c2.863,0,3.601,2.484,3.601,4.087c0,0.324-0.018,0.559-0.054,0.738H210.32z M214.965,9.862c0.018-0.99-0.414-2.557-2.196-2.557
16
+ c-1.621,0-2.305,1.458-2.431,2.557H214.965z"/>
17
+ <path d="M225.964,2.282v10.533c0,0.774,0.036,1.656,0.071,2.25h-1.404l-0.071-1.513h-0.054c-0.469,0.973-1.514,1.711-2.936,1.711
18
+ c-2.106,0-3.745-1.783-3.745-4.43c-0.018-2.898,1.801-4.663,3.907-4.663c1.351,0,2.232,0.63,2.629,1.314h0.036V2.282H225.964z
19
+ M224.397,9.898c0-0.198-0.019-0.468-0.072-0.667c-0.233-0.99-1.099-1.818-2.286-1.818c-1.639,0-2.611,1.44-2.611,3.349
20
+ c0,1.765,0.883,3.223,2.574,3.223c1.062,0,2.035-0.721,2.323-1.891c0.054-0.216,0.072-0.432,0.072-0.685V9.898z"/>
21
+ <path d="M230.372,3.903c0,0.54-0.378,0.972-1.009,0.972c-0.576,0-0.954-0.432-0.954-0.972c0-0.541,0.396-0.991,0.99-0.991
22
+ C229.976,2.912,230.372,3.344,230.372,3.903z M228.607,15.066V6.351h1.584v8.715H228.607z"/>
23
+ <path d="M232.604,13.463c0.486,0.288,1.314,0.612,2.106,0.612c1.134,0,1.675-0.558,1.675-1.296c0-0.756-0.451-1.152-1.604-1.584
24
+ c-1.584-0.576-2.322-1.422-2.322-2.467c0-1.404,1.152-2.557,3.007-2.557c0.882,0,1.657,0.234,2.125,0.54l-0.378,1.152
25
+ c-0.342-0.216-0.973-0.522-1.783-0.522c-0.936,0-1.439,0.54-1.439,1.188c0,0.72,0.504,1.044,1.638,1.495
26
+ c1.495,0.558,2.287,1.314,2.287,2.611c0,1.548-1.206,2.629-3.241,2.629c-0.954,0-1.836-0.252-2.449-0.612L232.604,13.463z"/>
27
+ </g>
28
+ <g>
29
+ <path d="M5.929,24.592c0.792-0.144,1.945-0.252,3.007-0.252c1.674,0,2.772,0.324,3.511,0.99c0.594,0.54,0.955,1.368,0.955,2.323
30
+ c0,1.584-1.008,2.647-2.269,3.079v0.054c0.918,0.324,1.477,1.188,1.765,2.449c0.396,1.692,0.684,2.863,0.937,3.331h-1.621
31
+ c-0.198-0.36-0.468-1.386-0.792-2.899c-0.36-1.674-1.026-2.305-2.449-2.359H7.496v5.258H5.929V24.592z M7.496,30.12h1.602
32
+ c1.675,0,2.737-0.918,2.737-2.305c0-1.566-1.135-2.251-2.791-2.251c-0.756,0-1.278,0.054-1.548,0.126V30.12z"/>
33
+ <path d="M15.613,24.574c0.756-0.126,1.746-0.234,3.007-0.234c1.548,0,2.683,0.36,3.403,1.008c0.648,0.576,1.062,1.458,1.062,2.539
34
+ c0,1.099-0.324,1.963-0.937,2.593c-0.846,0.882-2.179,1.333-3.709,1.333c-0.468,0-0.9-0.018-1.26-0.108v4.861h-1.566V24.574z
35
+ M17.18,30.426c0.342,0.09,0.774,0.126,1.296,0.126c1.89,0,3.042-0.937,3.042-2.575c0-1.621-1.152-2.395-2.863-2.395
36
+ c-0.684,0-1.206,0.054-1.476,0.126V30.426z"/>
37
+ <path d="M33.651,36.188c-0.558,0.288-1.729,0.576-3.205,0.576c-3.421,0-5.978-2.161-5.978-6.158c0-3.817,2.575-6.374,6.338-6.374
38
+ c1.494,0,2.466,0.324,2.881,0.54l-0.396,1.278c-0.576-0.288-1.422-0.504-2.431-0.504c-2.845,0-4.735,1.819-4.735,5.006
39
+ c0,2.989,1.71,4.879,4.646,4.879c0.972,0,1.944-0.198,2.575-0.504L33.651,36.188z"/>
40
+ <path d="M39.174,34.963c0.486,0.288,1.314,0.612,2.107,0.612c1.134,0,1.674-0.558,1.674-1.296c0-0.756-0.45-1.152-1.603-1.584
41
+ c-1.584-0.576-2.323-1.422-2.323-2.467c0-1.404,1.152-2.557,3.007-2.557c0.882,0,1.657,0.234,2.125,0.54l-0.378,1.152
42
+ c-0.342-0.216-0.972-0.522-1.782-0.522c-0.937,0-1.44,0.54-1.44,1.188c0,0.72,0.504,1.044,1.638,1.495
43
+ c1.495,0.558,2.287,1.314,2.287,2.611c0,1.548-1.207,2.629-3.241,2.629c-0.954,0-1.836-0.252-2.449-0.612L39.174,34.963z"/>
44
+ <path d="M47.401,32.497c0.036,2.143,1.386,3.025,2.989,3.025c1.134,0,1.836-0.198,2.413-0.45l0.288,1.134
45
+ c-0.558,0.252-1.53,0.559-2.917,0.559c-2.683,0-4.286-1.783-4.286-4.412c0-2.628,1.548-4.681,4.087-4.681
46
+ c2.863,0,3.601,2.484,3.601,4.087c0,0.324-0.018,0.559-0.054,0.738H47.401z M52.046,31.362c0.018-0.99-0.414-2.557-2.196-2.557
47
+ c-1.621,0-2.305,1.458-2.431,2.557H52.046z"/>
48
+ <path d="M55.536,30.57c0-1.026-0.018-1.909-0.072-2.719h1.387l0.072,1.729h0.054c0.396-1.17,1.368-1.908,2.431-1.908
49
+ c0.162,0,0.288,0.018,0.432,0.036v1.494c-0.162-0.036-0.324-0.036-0.54-0.036c-1.117,0-1.909,0.829-2.125,2.017
50
+ c-0.036,0.216-0.054,0.486-0.054,0.738v4.646h-1.584V30.57z"/>
51
+ <path d="M62.484,27.851l1.71,4.88c0.288,0.81,0.522,1.53,0.702,2.25h0.054c0.198-0.72,0.45-1.44,0.738-2.25l1.693-4.88h1.656
52
+ l-3.421,8.715h-1.513l-3.313-8.715H62.484z"/>
53
+ <path d="M71.232,32.497c0.036,2.143,1.386,3.025,2.989,3.025c1.134,0,1.836-0.198,2.413-0.45l0.288,1.134
54
+ c-0.558,0.252-1.53,0.559-2.917,0.559c-2.683,0-4.285-1.783-4.285-4.412c0-2.628,1.549-4.681,4.087-4.681
55
+ c2.863,0,3.601,2.484,3.601,4.087c0,0.324-0.018,0.559-0.054,0.738H71.232z M75.878,31.362c0.018-0.99-0.415-2.557-2.197-2.557
56
+ c-1.621,0-2.305,1.458-2.431,2.557H75.878z"/>
57
+ <path d="M79.368,30.57c0-1.026-0.018-1.909-0.072-2.719h1.387l0.072,1.729h0.054c0.396-1.17,1.368-1.908,2.431-1.908
58
+ c0.162,0,0.288,0.018,0.432,0.036v1.494c-0.162-0.036-0.324-0.036-0.54-0.036c-1.116,0-1.909,0.829-2.125,2.017
59
+ c-0.036,0.216-0.054,0.486-0.054,0.738v4.646h-1.584V30.57z"/>
60
+ </g>
61
+ <g>
62
+ <path d="M16.236,231.754c-0.558,0.288-1.729,0.576-3.205,0.576c-3.421,0-5.978-2.161-5.978-6.158c0-3.817,2.575-6.374,6.338-6.374
63
+ c1.494,0,2.466,0.324,2.881,0.54l-0.396,1.278c-0.576-0.288-1.422-0.504-2.431-0.504c-2.845,0-4.735,1.819-4.735,5.006
64
+ c0,2.989,1.71,4.879,4.646,4.879c0.972,0,1.944-0.198,2.575-0.504L16.236,231.754z"/>
65
+ <path d="M24.155,230.043c0,0.756,0.036,1.495,0.126,2.089h-1.422l-0.126-1.098h-0.054c-0.486,0.684-1.422,1.296-2.665,1.296
66
+ c-1.765,0-2.665-1.243-2.665-2.503c0-2.106,1.873-3.259,5.239-3.241v-0.18c0-0.702-0.198-2.017-1.98-1.999
67
+ c-0.828,0-1.674,0.234-2.287,0.648l-0.36-1.062c0.72-0.45,1.783-0.756,2.881-0.756c2.665,0,3.313,1.818,3.313,3.547V230.043z
68
+ M22.625,227.685c-1.729-0.036-3.691,0.27-3.691,1.962c0,1.044,0.684,1.513,1.476,1.513c1.152,0,1.891-0.72,2.143-1.458
69
+ c0.054-0.18,0.072-0.36,0.072-0.504V227.685z"/>
70
+ <path d="M26.709,219.349h1.584v12.784h-1.584V219.349z"/>
71
+ <path d="M37.169,231.826c-0.414,0.198-1.333,0.504-2.503,0.504c-2.629,0-4.339-1.783-4.339-4.447c0-2.683,1.837-4.646,4.682-4.646
72
+ c0.936,0,1.765,0.234,2.196,0.468l-0.36,1.207c-0.378-0.198-0.972-0.414-1.836-0.414c-1.999,0-3.079,1.495-3.079,3.295
73
+ c0,2.017,1.296,3.259,3.025,3.259c0.9,0,1.495-0.216,1.945-0.415L37.169,231.826z"/>
74
+ <path d="M46.313,229.738c0,0.918,0.018,1.71,0.072,2.395h-1.404l-0.09-1.422h-0.036c-0.396,0.702-1.332,1.621-2.881,1.621
75
+ c-1.368,0-3.007-0.774-3.007-3.817v-5.096h1.584v4.808c0,1.657,0.522,2.791,1.945,2.791c1.062,0,1.8-0.738,2.088-1.458
76
+ c0.09-0.216,0.144-0.504,0.144-0.81v-5.33h1.584V229.738z"/>
77
+ <path d="M48.939,219.349h1.584v12.784h-1.584V219.349z"/>
78
+ <path d="M59.309,230.043c0,0.756,0.036,1.495,0.126,2.089h-1.422l-0.126-1.098h-0.054c-0.486,0.684-1.422,1.296-2.665,1.296
79
+ c-1.765,0-2.665-1.243-2.665-2.503c0-2.106,1.873-3.259,5.239-3.241v-0.18c0-0.702-0.198-2.017-1.98-1.999
80
+ c-0.828,0-1.674,0.234-2.287,0.648l-0.36-1.062c0.72-0.45,1.783-0.756,2.881-0.756c2.665,0,3.313,1.818,3.313,3.547V230.043z
81
+ M57.778,227.685c-1.729-0.036-3.691,0.27-3.691,1.962c0,1.044,0.684,1.513,1.476,1.513c1.152,0,1.891-0.72,2.143-1.458
82
+ c0.054-0.18,0.072-0.36,0.072-0.504V227.685z"/>
83
+ <path d="M63.7,221.329v2.088h2.269v1.207H63.7v4.7c0,1.08,0.306,1.692,1.188,1.692c0.432,0,0.685-0.036,0.918-0.108l0.072,1.207
84
+ c-0.306,0.108-0.792,0.216-1.404,0.216c-0.738,0-1.332-0.252-1.71-0.667c-0.432-0.486-0.612-1.26-0.612-2.287v-4.753h-1.35v-1.207
85
+ h1.35v-1.62L63.7,221.329z"/>
86
+ <path d="M75.527,227.703c0,3.223-2.25,4.627-4.339,4.627c-2.34,0-4.177-1.729-4.177-4.483c0-2.899,1.927-4.609,4.321-4.609
87
+ C73.835,223.238,75.527,225.056,75.527,227.703z M68.631,227.793c0,1.909,1.081,3.349,2.629,3.349c1.512,0,2.646-1.422,2.646-3.385
88
+ c0-1.476-0.738-3.331-2.611-3.331C69.441,224.426,68.631,226.155,68.631,227.793z"/>
89
+ <path d="M77.523,226.137c0-1.026-0.018-1.909-0.072-2.719h1.387l0.072,1.729h0.054c0.396-1.17,1.368-1.908,2.431-1.908
90
+ c0.162,0,0.288,0.018,0.432,0.036v1.494c-0.162-0.036-0.324-0.036-0.54-0.036c-1.116,0-1.909,0.829-2.125,2.017
91
+ c-0.036,0.216-0.054,0.486-0.054,0.738v4.646h-1.584V226.137z"/>
92
+ </g>
93
+ <g>
94
+ <path d="M357.652,24.592c0.792-0.144,1.944-0.252,3.007-0.252c1.675,0,2.772,0.324,3.511,0.99c0.594,0.54,0.955,1.368,0.955,2.323
95
+ c0,1.584-1.009,2.647-2.27,3.079v0.054c0.918,0.324,1.477,1.188,1.765,2.449c0.396,1.692,0.685,2.863,0.937,3.331h-1.621
96
+ c-0.197-0.36-0.468-1.386-0.792-2.899c-0.36-1.674-1.026-2.305-2.448-2.359h-1.477v5.258h-1.566V24.592z M359.219,30.12h1.603
97
+ c1.675,0,2.736-0.918,2.736-2.305c0-1.566-1.134-2.251-2.79-2.251c-0.757,0-1.279,0.054-1.549,0.126V30.12z"/>
98
+ <path d="M367.336,24.574c0.756-0.126,1.746-0.234,3.008-0.234c1.548,0,2.682,0.36,3.402,1.008c0.648,0.576,1.062,1.458,1.062,2.539
99
+ c0,1.099-0.324,1.963-0.937,2.593c-0.847,0.882-2.179,1.333-3.709,1.333c-0.468,0-0.9-0.018-1.261-0.108v4.861h-1.566V24.574z
100
+ M368.902,30.426c0.342,0.09,0.774,0.126,1.297,0.126c1.891,0,3.043-0.937,3.043-2.575c0-1.621-1.152-2.395-2.863-2.395
101
+ c-0.684,0-1.206,0.054-1.477,0.126V30.426z"/>
102
+ <path d="M385.375,36.188c-0.559,0.288-1.729,0.576-3.205,0.576c-3.422,0-5.979-2.161-5.979-6.158c0-3.817,2.575-6.374,6.338-6.374
103
+ c1.494,0,2.467,0.324,2.881,0.54l-0.396,1.278c-0.576-0.288-1.422-0.504-2.43-0.504c-2.846,0-4.736,1.819-4.736,5.006
104
+ c0,2.989,1.711,4.879,4.646,4.879c0.972,0,1.943-0.198,2.574-0.504L385.375,36.188z"/>
105
+ <path d="M397.326,36.26c-0.414,0.198-1.333,0.504-2.504,0.504c-2.629,0-4.339-1.783-4.339-4.447c0-2.683,1.837-4.646,4.682-4.646
106
+ c0.937,0,1.765,0.234,2.196,0.468l-0.359,1.207c-0.379-0.198-0.973-0.414-1.837-0.414c-1.999,0-3.079,1.495-3.079,3.295
107
+ c0,2.017,1.297,3.259,3.025,3.259c0.9,0,1.494-0.216,1.944-0.415L397.326,36.26z"/>
108
+ <path d="M399.178,23.782h1.584v12.784h-1.584V23.782z"/>
109
+ <path d="M405.189,25.403c0,0.54-0.378,0.972-1.008,0.972c-0.576,0-0.955-0.432-0.955-0.972c0-0.541,0.396-0.991,0.99-0.991
110
+ C404.793,24.412,405.189,24.844,405.189,25.403z M403.426,36.566v-8.715h1.584v8.715H403.426z"/>
111
+ <path d="M408.52,32.497c0.036,2.143,1.387,3.025,2.988,3.025c1.135,0,1.837-0.198,2.413-0.45l0.288,1.134
112
+ c-0.559,0.252-1.53,0.559-2.917,0.559c-2.683,0-4.285-1.783-4.285-4.412c0-2.628,1.549-4.681,4.087-4.681
113
+ c2.863,0,3.602,2.484,3.602,4.087c0,0.324-0.018,0.559-0.055,0.738H408.52z M413.165,31.362c0.018-0.99-0.415-2.557-2.196-2.557
114
+ c-1.621,0-2.305,1.458-2.432,2.557H413.165z"/>
115
+ <path d="M416.655,30.21c0-0.918-0.019-1.638-0.072-2.359h1.405l0.09,1.44h0.035c0.433-0.81,1.441-1.62,2.881-1.62
116
+ c1.207,0,3.079,0.72,3.079,3.709v5.186h-1.585v-5.023c0-1.404-0.521-2.575-2.016-2.575c-1.026,0-1.837,0.738-2.125,1.621
117
+ c-0.072,0.198-0.107,0.468-0.107,0.738v5.24h-1.585V30.21z"/>
118
+ <path d="M428.482,25.763v2.088h2.268v1.207h-2.268v4.7c0,1.08,0.306,1.692,1.188,1.692c0.432,0,0.685-0.036,0.918-0.108
119
+ l0.072,1.207c-0.306,0.108-0.792,0.216-1.404,0.216c-0.738,0-1.332-0.252-1.711-0.667c-0.432-0.486-0.611-1.26-0.611-2.287v-4.753
120
+ h-1.351v-1.207h1.351v-1.62L428.482,25.763z"/>
121
+ </g>
122
+ <g>
123
+ <path d="M160.963,102.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
124
+ c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
125
+ c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
126
+ s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V102.83z"/>
127
+ <path d="M166.623,102.267c-0.699,0.586-1.396,0.879-2.092,0.879c-0.582,0-1.062-0.166-1.438-0.498s-0.565-0.752-0.565-1.26
128
+ c0-0.66,0.293-1.191,0.879-1.594s1.359-0.604,2.32-0.604h0.715v-0.545c0-0.449-0.1-0.77-0.299-0.961s-0.529-0.287-0.99-0.287
129
+ c-0.668,0-1.359,0.188-2.074,0.562v-0.99c0.819-0.293,1.588-0.439,2.306-0.439c0.808,0,1.378,0.16,1.711,0.48s0.5,0.873,0.5,1.658
130
+ v2.666c0,0.383,0.041,0.644,0.123,0.782s0.236,0.208,0.463,0.208c0.074,0,0.195-0.02,0.363-0.059l0.105,0.691
131
+ c-0.386,0.125-0.678,0.188-0.876,0.188C167.205,103.146,166.822,102.853,166.623,102.267z M166.441,101.517v-1.605h-0.346
132
+ c-1.582,0-2.373,0.428-2.373,1.283c0,0.309,0.102,0.557,0.305,0.744s0.473,0.281,0.809,0.281
133
+ C165.34,102.22,165.875,101.986,166.441,101.517z"/>
134
+ <path d="M172.43,103.035V94.65h-2.455v-0.867h3.609v9.252H172.43z"/>
135
+ <path d="M182.654,102.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
136
+ c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
137
+ c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
138
+ s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V102.83z"/>
139
+ <path d="M186.17,98.406v-1.734h1.734v1.734H186.17z M186.17,103.035V101.3h1.734v1.734H186.17z"/>
140
+ <path d="M192.457,103.035v-6.363h1.154v1.195c0.586-0.891,1.373-1.336,2.361-1.336c0.348,0,0.742,0.049,1.184,0.146v1.805h-0.867
141
+ v-0.885c-0.172-0.039-0.328-0.059-0.469-0.059c-0.441,0-0.829,0.103-1.163,0.308s-0.683,0.554-1.046,1.046v4.143H192.457z"/>
142
+ <path d="M198.932,105.349v-8.678h1.154v1.195c0.559-0.891,1.252-1.336,2.08-1.336c0.723,0,1.292,0.278,1.708,0.835
143
+ s0.624,1.315,0.624,2.276c0,1.055-0.246,1.908-0.738,2.561s-1.137,0.979-1.934,0.979c-0.684,0-1.264-0.289-1.74-0.867v3.035
144
+ H198.932z M200.086,101.447c0.535,0.578,1.062,0.867,1.582,0.867c0.508,0,0.901-0.224,1.181-0.671s0.419-1.073,0.419-1.878
145
+ c0-1.5-0.447-2.25-1.342-2.25c-0.652,0-1.266,0.406-1.84,1.219V101.447z"/>
146
+ <path d="M211.576,102.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
147
+ c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
148
+ c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
149
+ s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V102.83z"/>
150
+ <path d="M215.092,98.406v-1.734h1.734v1.734H215.092z M215.092,103.035V101.3h1.734v1.734H215.092z"/>
151
+ <path d="M219.639,103.035l2.939-3.816l-2.688-3.702h1.368l2.025,2.79l2.155-2.79h1.125l-2.738,3.537l2.891,3.98h-1.369
152
+ l-2.221-3.061l-2.363,3.061H219.639z"/>
153
+ <path d="M228.451,103.035c0.07-0.625,0.209-1.184,0.416-1.676s0.686-1.4,1.436-2.725l1.811-3.188h-4.131v-1.084h5.227v0.973
154
+ l-0.281,0.469c-1.863,3.141-2.896,5.551-3.1,7.23H228.451z"/>
155
+ <path d="M237.076,103.035v-3.076l-2.854-4.441h1.33l2.186,3.469l2.391-3.469h1.096l-2.994,4.441v3.076H237.076z"/>
156
+ <path d="M242.25,103.035v-1.014c0.477-0.922,1.188-1.852,2.133-2.789l0.521-0.521c0.719-0.715,1.078-1.436,1.078-2.162
157
+ c0-0.465-0.138-0.837-0.413-1.116s-0.644-0.419-1.104-0.419c-0.559,0-1.225,0.203-1.998,0.609v-1.02
158
+ c0.719-0.305,1.422-0.457,2.109-0.457c0.793,0,1.431,0.216,1.913,0.647s0.724,1.001,0.724,1.708c0,0.457-0.111,0.887-0.334,1.289
159
+ s-0.6,0.852-1.131,1.348l-0.492,0.463c-0.906,0.844-1.451,1.65-1.635,2.42h3.545v1.014H242.25z"/>
160
+ <path d="M249.393,95.517h1.154v4.564c0,0.797,0.126,1.374,0.378,1.731s0.659,0.536,1.222,0.536c0.594,0,1.021-0.179,1.283-0.536
161
+ s0.393-0.944,0.393-1.761v-4.535h1.008v4.365c0,0.941-0.111,1.617-0.334,2.027c-0.473,0.871-1.252,1.307-2.338,1.307
162
+ c-0.941,0-1.638-0.258-2.089-0.773s-0.677-1.309-0.677-2.379V95.517z"/>
163
+ <path d="M261.645,95.693v1.002c-0.848-0.328-1.602-0.492-2.262-0.492c-1.043,0-1.564,0.352-1.564,1.055
164
+ c0,0.285,0.098,0.515,0.293,0.688s0.557,0.353,1.084,0.536l0.738,0.258l0.703,0.24c1.09,0.383,1.635,1.031,1.635,1.945
165
+ c0,0.695-0.278,1.251-0.835,1.667s-1.302,0.624-2.235,0.624c-0.648,0-1.486-0.139-2.514-0.416v-1.143
166
+ c1.023,0.461,1.873,0.691,2.549,0.691c0.57,0,1.025-0.112,1.365-0.337s0.51-0.526,0.51-0.905c0-0.289-0.101-0.518-0.302-0.686
167
+ s-0.616-0.367-1.245-0.598l-0.773-0.281c-0.77-0.285-1.304-0.578-1.603-0.879s-0.448-0.701-0.448-1.201
168
+ c0-0.676,0.229-1.199,0.688-1.57s1.104-0.557,1.937-0.557C260.041,95.335,260.801,95.455,261.645,95.693z"/>
169
+ </g>
170
+ <rect x="153.5" y="109.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
171
+ <g>
172
+ <path d="M160.963,41.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
173
+ c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
174
+ c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
175
+ s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V41.83z"/>
176
+ <path d="M166.623,41.267c-0.699,0.586-1.396,0.879-2.092,0.879c-0.582,0-1.062-0.166-1.438-0.498s-0.565-0.752-0.565-1.26
177
+ c0-0.66,0.293-1.191,0.879-1.594s1.359-0.604,2.32-0.604h0.715v-0.545c0-0.449-0.1-0.77-0.299-0.961s-0.529-0.287-0.99-0.287
178
+ c-0.668,0-1.359,0.188-2.074,0.562v-0.99c0.819-0.293,1.588-0.439,2.306-0.439c0.808,0,1.378,0.16,1.711,0.48s0.5,0.873,0.5,1.658
179
+ v2.666c0,0.383,0.041,0.644,0.123,0.782s0.236,0.208,0.463,0.208c0.074,0,0.195-0.02,0.363-0.059l0.105,0.691
180
+ c-0.386,0.125-0.678,0.188-0.876,0.188C167.205,42.146,166.822,41.853,166.623,41.267z M166.441,40.517v-1.605h-0.346
181
+ c-1.582,0-2.373,0.428-2.373,1.283c0,0.309,0.102,0.557,0.305,0.744s0.473,0.281,0.809,0.281
182
+ C165.34,41.22,165.875,40.986,166.441,40.517z"/>
183
+ <path d="M172.43,42.035V33.65h-2.455v-0.867h3.609v9.252H172.43z"/>
184
+ <path d="M182.654,41.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
185
+ c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
186
+ c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
187
+ s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V41.83z"/>
188
+ </g>
189
+ <rect x="153.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
190
+ <rect x="178.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
191
+ <rect x="203.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
192
+ <rect x="228.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
193
+ <rect x="253.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
194
+ <g>
195
+ <g>
196
+ <path fill="none" stroke="#000000" stroke-miterlimit="10" d="M353.588,74.419c0-7.02-30.376-12.765-69.053-13.311"/>
197
+ <g>
198
+ <path d="M278.5,61.066c2.858-1.003,6.413-2.737,8.631-4.602l-1.805,4.724l1.635,4.785C284.812,64.03,281.32,62.169,278.5,61.066z
199
+ "/>
200
+ </g>
201
+ </g>
202
+ </g>
203
+ <circle fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" cx="393.75" cy="90.816" r="43.75"/>
204
+ <circle fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" cx="44.25" cy="90.816" r="43.75"/>
205
+ <g>
206
+ <g>
207
+ <path fill="none" stroke="#000000" stroke-miterlimit="10" d="M153.55,61.915c-0.314-2.674-29.853-1.425-67.189,2.743"/>
208
+ <g>
209
+ <path d="M80.364,65.345c2.717-1.339,6.037-3.489,8.015-5.607l-1.224,4.907l2.199,4.553
210
+ C86.986,67.528,83.296,66.101,80.364,65.345z"/>
211
+ </g>
212
+ </g>
213
+ </g>
214
+ <circle fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" cx="44.25" cy="198.316" r="13.75"/>
215
+ <g>
216
+ <g>
217
+ <path fill="none" stroke="#000000" stroke-miterlimit="10" d="M9.744,117.695c0,37.331,6.515,68.695,15.375,77.89"/>
218
+ <g>
219
+ <path d="M30.5,198.316c-2.996-0.444-6.95-0.565-9.781,0.052l3.798-3.34l0.783-4.996C26.296,192.753,28.518,196.026,30.5,198.316z
220
+ "/>
221
+ </g>
222
+ </g>
223
+ </g>
224
+ <g>
225
+ <g>
226
+ <path fill="none" stroke="#000000" stroke-miterlimit="10" d="M78.699,123.73C77.905,165.468,68.95,198.316,58,198.316"/>
227
+ <g>
228
+ <path d="M78.756,117.695c-1.127,2.812-3.016,6.287-4.976,8.421l4.799-1.597l4.708,1.843
229
+ C81.44,124.13,79.735,120.562,78.756,117.695z"/>
230
+ </g>
231
+ </g>
232
+ </g>
233
+ <g>
234
+ <g>
235
+ <path fill="none" stroke="#000000" stroke-miterlimit="10" d="M83.784,109.566c0,6.544,27.977,11.906,63.68,12.454"/>
236
+ <g>
237
+ <path d="M153.5,122.066c-2.858,1.002-6.414,2.736-8.632,4.601l1.806-4.724l-1.634-4.785
238
+ C147.189,119.101,150.68,120.962,153.5,122.066z"/>
239
+ </g>
240
+ </g>
241
+ </g>
242
+ <g>
243
+ <g>
244
+ <path fill="none" stroke="#000000" stroke-miterlimit="10" d="M178.45,121.602c2.182,10.063,76.521,2.517,167.441-16.836"/>
245
+ <g>
246
+ <path d="M351.792,103.499c-2.57,1.603-5.66,4.073-7.417,6.377l0.729-5.004l-2.642-4.312
247
+ C344.985,101.985,348.799,103.038,351.792,103.499z"/>
248
+ </g>
249
+ </g>
250
+ </g>
251
+ <g>
252
+ <path d="M332.59,40.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
253
+ s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
254
+ s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
255
+ s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
256
+ S332.59,39.109,332.59,40.257z M327.715,46.281v-0.785c-0.703-0.047-1.242-0.199-1.617-0.457s-0.602-0.633-0.68-1.125V34h-0.844
257
+ c-0.539,0.633-1.15,1.113-1.834,1.441s-1.439,0.504-2.268,0.527v0.785l1.582-0.094h0.094c0.312,0,0.531,0.09,0.656,0.27
258
+ s0.188,0.5,0.188,0.961v6.023c0,0.672-0.129,1.104-0.387,1.295s-0.898,0.287-1.922,0.287v0.785H327.715z"/>
259
+ </g>
260
+ <g>
261
+ <path d="M125.547,40.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
262
+ s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
263
+ s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
264
+ s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
265
+ S125.547,39.109,125.547,40.257z M121.422,41.746l-0.797,0.012c-0.023,0.93-0.139,1.541-0.346,1.834s-0.619,0.439-1.236,0.439
266
+ h-4.969c0.156-0.508,0.463-0.959,0.92-1.354s1.295-0.873,2.514-1.436c1.438-0.672,2.4-1.297,2.889-1.875s0.732-1.297,0.732-2.156
267
+ c0-0.953-0.402-1.727-1.207-2.32S118.055,34,116.734,34c-1.094,0-1.975,0.238-2.643,0.715s-1.002,1.102-1.002,1.875
268
+ c0,0.422,0.117,0.756,0.352,1.002s0.551,0.369,0.949,0.369c0.328,0,0.621-0.121,0.879-0.363s0.387-0.516,0.387-0.82
269
+ c0-0.086-0.035-0.234-0.105-0.445s-0.105-0.379-0.105-0.504c0-0.242,0.129-0.459,0.387-0.65s0.551-0.287,0.879-0.287
270
+ c0.492,0,0.904,0.201,1.236,0.604s0.498,0.912,0.498,1.529c0,0.656-0.162,1.24-0.486,1.752s-1.033,1.182-2.127,2.01
271
+ c-1.328,1.008-2.205,1.867-2.631,2.578s-0.639,1.535-0.639,2.473v0.445h8.766L121.422,41.746z"/>
272
+ </g>
273
+ <g>
274
+ <path d="M34.547,158.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
275
+ s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
276
+ s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
277
+ s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
278
+ S34.547,157.109,34.547,158.257z M25.43,158.093c0.742,0,1.32,0.219,1.734,0.656s0.621,1.051,0.621,1.84
279
+ c0,0.836-0.23,1.521-0.691,2.057s-1.047,0.803-1.758,0.803c-0.383,0-0.699-0.09-0.949-0.27s-0.375-0.402-0.375-0.668
280
+ c0-0.094,0.027-0.23,0.082-0.41s0.082-0.324,0.082-0.434c0-0.375-0.123-0.684-0.369-0.926s-0.561-0.363-0.943-0.363
281
+ c-0.438,0-0.783,0.125-1.037,0.375s-0.381,0.586-0.381,1.008c0,0.781,0.381,1.422,1.143,1.922s1.748,0.75,2.959,0.75
282
+ c1.492,0,2.709-0.348,3.65-1.043s1.412-1.59,1.412-2.684c0-0.922-0.346-1.67-1.037-2.244s-1.623-0.881-2.795-0.92v-0.07
283
+ c0.984-0.195,1.734-0.52,2.25-0.973s0.773-1.02,0.773-1.699c0-0.852-0.359-1.531-1.078-2.039S27.035,152,25.816,152
284
+ c-1.117,0-2.021,0.219-2.713,0.656s-1.037,1.004-1.037,1.699c0,0.367,0.113,0.666,0.34,0.896s0.523,0.346,0.891,0.346
285
+ c0.328,0,0.605-0.119,0.832-0.357s0.34-0.533,0.34-0.885c0-0.102-0.025-0.219-0.076-0.352s-0.08-0.223-0.088-0.27
286
+ c0.023-0.234,0.146-0.426,0.369-0.574s0.498-0.223,0.826-0.223c0.555,0,0.998,0.186,1.33,0.557s0.498,0.873,0.498,1.506
287
+ c0,0.734-0.229,1.301-0.686,1.699s-1.111,0.598-1.963,0.598h-0.598v0.797H25.43z"/>
288
+ </g>
289
+ <g>
290
+ <path d="M71.547,158.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
291
+ s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
292
+ s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
293
+ s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
294
+ S71.547,157.109,71.547,158.257z M67.445,161.093v-1.219h-2.93V152h-1.652l-5.672,8.332l0.152,0.762h4.887v0.82
295
+ c0,0.664-0.123,1.09-0.369,1.277s-0.881,0.289-1.904,0.305v0.785h6.457l-0.012-0.785c-0.836-0.016-1.359-0.105-1.57-0.27
296
+ s-0.316-0.602-0.316-1.312v-0.82H67.445z M62.359,154.378l-0.07,5.613h-3.633L62.359,154.378z"/>
297
+ </g>
298
+ <g>
299
+ <path d="M125.547,138.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
300
+ s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
301
+ s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
302
+ s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
303
+ S125.547,137.109,125.547,138.257z M114.051,139.242c0.328-0.469,0.664-0.816,1.008-1.043s0.703-0.34,1.078-0.34
304
+ c0.617,0,1.129,0.254,1.535,0.762s0.609,1.164,0.609,1.969c0,0.93-0.197,1.654-0.592,2.174s-0.943,0.779-1.646,0.779
305
+ c-0.398,0-0.738-0.084-1.02-0.252s-0.422-0.365-0.422-0.592c0-0.062,0.045-0.199,0.135-0.41s0.135-0.395,0.135-0.551
306
+ c0-0.359-0.131-0.66-0.393-0.902s-0.588-0.363-0.979-0.363c-0.398,0-0.73,0.139-0.996,0.416s-0.398,0.627-0.398,1.049
307
+ c0,0.727,0.373,1.324,1.119,1.793s1.717,0.703,2.912,0.703c1.555,0,2.797-0.357,3.727-1.072s1.395-1.662,1.395-2.842
308
+ c0-1.117-0.377-2.018-1.131-2.701s-1.748-1.025-2.982-1.025c-0.523,0-1.041,0.088-1.553,0.264s-1.033,0.443-1.564,0.803
309
+ l0.293-3.176c0.367,0.031,0.76,0.055,1.178,0.07s0.881,0.023,1.389,0.023c1.43,0,2.414-0.193,2.953-0.58s0.945-1.119,1.219-2.197
310
+ c-0.391,0.117-0.824,0.203-1.301,0.258s-1.148,0.082-2.016,0.082c-1.078,0-1.92-0.027-2.525-0.082s-1.154-0.141-1.646-0.258
311
+ c-0.023,1.117-0.08,2.246-0.17,3.387s-0.217,2.293-0.381,3.457c0.164,0.031,0.334,0.082,0.51,0.152
312
+ S113.879,139.148,114.051,139.242z"/>
313
+ </g>
314
+ <g>
315
+ <path d="M332.59,138.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
316
+ s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
317
+ s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
318
+ s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
319
+ S332.59,137.109,332.59,138.257z M321.574,138.621v-0.281c0-1.836,0.229-3.211,0.686-4.125s1.143-1.371,2.057-1.371
320
+ c0.352,0,0.654,0.088,0.908,0.264s0.381,0.381,0.381,0.615c0,0.078-0.031,0.213-0.094,0.404s-0.094,0.346-0.094,0.463
321
+ c0,0.375,0.115,0.678,0.346,0.908s0.529,0.346,0.896,0.346c0.391,0,0.701-0.125,0.932-0.375s0.346-0.582,0.346-0.996
322
+ c0-0.711-0.348-1.301-1.043-1.77s-1.582-0.703-2.66-0.703c-1.562,0-2.844,0.592-3.844,1.775s-1.5,2.713-1.5,4.588
323
+ c0,1.891,0.455,3.375,1.365,4.453s2.158,1.617,3.744,1.617c1.352,0,2.465-0.387,3.34-1.16s1.312-1.746,1.312-2.918
324
+ c0-1.016-0.354-1.871-1.061-2.566s-1.576-1.043-2.607-1.043c-0.695,0-1.318,0.15-1.869,0.451S322.051,137.972,321.574,138.621z
325
+ M326.203,140.66c0,0.891-0.205,1.605-0.615,2.145s-0.947,0.809-1.611,0.809c-0.656,0-1.201-0.258-1.635-0.773
326
+ s-0.65-1.176-0.65-1.98c0-0.852,0.223-1.541,0.668-2.068s1.023-0.791,1.734-0.791c0.625,0,1.133,0.244,1.523,0.732
327
+ S326.203,139.863,326.203,140.66z"/>
328
+ </g>
329
+ </svg>
data/examples/calc.rb ADDED
@@ -0,0 +1,32 @@
1
+ class Calculator
2
+ # A simple, mutable calculator used for testing.
3
+ # referenced explicitly in ../spec/calculator.spec.rb
4
+
5
+ def initialize
6
+ @acc = 0.0
7
+ end
8
+
9
+ def clr
10
+ @acc = 0.0
11
+ end
12
+
13
+ def add(number)
14
+ @acc += number
15
+ end
16
+
17
+ def div(number)
18
+ @acc /= number
19
+ end
20
+
21
+ def mul(number)
22
+ @acc *= number
23
+ end
24
+
25
+ def sub(number)
26
+ @acc -= number
27
+ end
28
+
29
+ def val
30
+ @acc
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'redis'
4
+
5
+ require File.expand_path('../../lib/redis-rpc', __FILE__)
6
+ require File.expand_path('../calc', __FILE__)
7
+
8
+ def assert(cond)
9
+ if not cond
10
+ fail 'assertion failed'
11
+ end
12
+ end
13
+
14
+ def do_calculations(calculator)
15
+ calculator.clr
16
+ calculator.add 5
17
+ calculator.sub 3
18
+ calculator.mul 4
19
+ calculator.div 2
20
+ assert calculator.val == 4
21
+ begin
22
+ calculator.missing_method
23
+ assert false
24
+ rescue NoMethodError
25
+ rescue RedisRpc::RemoteException
26
+ end
27
+ end
28
+
29
+ # 1. Local object
30
+ calculator = Calculator.new
31
+ do_calculations calculator
32
+
33
+ # 2. Remote object, should act like local object
34
+ redis_server = Redis.new
35
+ message_queue = 'calc'
36
+ timeout = 1
37
+ calculator = RedisRpc::Client.new redis_server, message_queue, timeout
38
+ do_calculations calculator
39
+ puts 'success!'
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'redis'
4
+
5
+ require File.expand_path('../../lib/redis-rpc', __FILE__)
6
+ require File.expand_path('../calc', __FILE__)
7
+
8
+ redis_server = Redis.new
9
+ message_queue = 'calc'
10
+ local_object = Calculator.new
11
+ server = RedisRpc::Server.new redis_server, message_queue, local_object, verbose: true
12
+ server.run
@@ -0,0 +1,3 @@
1
+ module RedisRpc
2
+ VERSION = "2.0.0-dev"
3
+ end
data/lib/redis-rpc.rb ADDED
@@ -0,0 +1,204 @@
1
+ # Copyright (C) 2012. Nathan Farrington <nfarring@gmail.com>
2
+ #
3
+ # This program is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require_relative 'redis-rpc/version'
17
+ require 'json'
18
+
19
+ require 'redis'
20
+
21
+ module RedisRpc
22
+
23
+ class RemoteException < StandardError
24
+ attr_reader :remote_backtrace
25
+
26
+ def initialize(message, remote_backtrace)
27
+ super(message)
28
+ @remote_backtrace = remote_backtrace
29
+ end
30
+ end
31
+
32
+ class TimeoutException < StandardError; end
33
+
34
+ class MalformedResponseException < RemoteException
35
+ def initialize(response)
36
+ super "Malformed RPC Response message: #{response.inspect}", []
37
+ end
38
+ end
39
+
40
+ class MalformedRequestException < ArgumentError
41
+ def initialize(reason)
42
+ super "Malformed RPC Request: #{reason.inspect}"
43
+ end
44
+ end
45
+
46
+ class Client
47
+ def initialize(redis_server, message_queue, timeout: 0)
48
+ @redis_server = redis_server
49
+ @message_queue = message_queue
50
+ @timeout = timeout
51
+ end
52
+
53
+ alias :send! :send
54
+
55
+ def get_timeout_at
56
+ # allow mock to manipulate timeout to verify safety behavior
57
+ Time.now.to_i + @timeout + 60
58
+ end
59
+
60
+ def send(method_name, *args, **kwargs)
61
+ raise MalformedRequestException, 'block not allowed over RPC' if block_given?
62
+
63
+ # request setup
64
+ function_call = { 'name' => method_name.to_s, 'args' => args, 'kwargs' => kwargs }
65
+ response_queue = @message_queue + ':rpc:' + rand_string
66
+ rpc_request = {
67
+ 'function_call' => function_call,
68
+ 'response_queue' => response_queue,
69
+ 'timeout_at' => get_timeout_at,
70
+ }
71
+
72
+ rpc_raw_request = JSON.dump rpc_request
73
+
74
+ # transport
75
+ @redis_server.rpush @message_queue, rpc_raw_request
76
+ _message_queue, rpc_raw_response = @redis_server.blpop response_queue, timeout: @timeout
77
+ raise TimeoutException if rpc_raw_response.nil?
78
+
79
+ # response handling
80
+ rpc_response = JSON.parse(rpc_raw_response)
81
+ raise RemoteException.new(rpc_response['exception'], rpc_response['backtrace']) if rpc_response.has_key? 'exception'
82
+ raise MalformedResponseException, rpc_response unless rpc_response.has_key? 'return_value'
83
+
84
+ # noinspection RubyUnnecessaryReturnStatement
85
+ return rpc_response['return_value']
86
+ rescue TimeoutException, SignalException
87
+ # stale request cleanup
88
+ @redis_server.lrem @message_queue, 0, rpc_raw_request
89
+ raise
90
+ end
91
+
92
+ alias :method_missing :send
93
+
94
+ def respond_to?(method_name)
95
+ send(:respond_to?, method_name)
96
+ end
97
+
98
+ private
99
+
100
+ def rand_string(size = 8)
101
+ rand(36 ** size).to_s(36).upcase.rjust(size, '0')
102
+ end
103
+ end
104
+
105
+ class Server
106
+ attr_reader :timeout
107
+ attr_accessor :logger
108
+
109
+ # @param [Redis] redis_server
110
+ # @param [String] message_queue
111
+ # @param [Object] local_object
112
+ # @param [nil,Numeric] timeout
113
+ # @param [Integer] response_expiry
114
+ # @param [Boolean] verbose
115
+ # @param [nil,Logger] logger
116
+ def initialize(redis_server, message_queue, local_object, timeout: nil, response_expiry: 1, verbose: false, logger: nil)
117
+ @redis_server = redis_server
118
+ @message_queue = message_queue
119
+ @local_object = local_object
120
+ @timeout = timeout || 0
121
+ @response_expiry = response_expiry
122
+ @verbose = verbose
123
+ @logger = logger
124
+ end
125
+
126
+ def run
127
+ catch(:stop!) do
128
+ loop { run_one }
129
+ logger&.info("[#{Time.now}] #{self.class.name} : action=run stopped")
130
+ end
131
+ end
132
+
133
+ def run!
134
+ flush_queue!
135
+ run
136
+ end
137
+
138
+ def stop!
139
+ client = Client.new(@redis_server.dup, @message_queue)
140
+ client.send(stop_message)
141
+ end
142
+
143
+ def flush_queue!
144
+ @redis_server.del @message_queue
145
+ end
146
+
147
+ private
148
+
149
+ def stop_message
150
+ @stop_message ||= "stop-#{@message_queue}"
151
+ end
152
+
153
+ def run_one
154
+ # request setup
155
+ _message_queue, rpc_raw_request = @redis_server.blpop @message_queue, timeout: timeout
156
+ return nil if rpc_raw_request.nil?
157
+
158
+ rpc_request = JSON.parse(rpc_raw_request)
159
+ response_queue = rpc_request['response_queue']
160
+ function_call = rpc_request['function_call']
161
+
162
+ # request execution
163
+ begin
164
+ if rpc_request['timeout_at'].nil?
165
+ raise "Unsafe RPC call: timeout_at not specified"
166
+ end
167
+
168
+ if rpc_request['timeout_at'] < Time.now.to_i
169
+ raise "Expired RPC call. timeout_at = #{rpc_request['timeout_at']}. Time.now = #{Time.now.to_i}"
170
+ end
171
+
172
+ if stop_message == function_call['name']
173
+ send_response(response_queue, { 'return_value' => true })
174
+ throw :stop!
175
+ end
176
+
177
+ logger&.info("[#{Time.now}] #{self.class.name} : action=run_one rpc_call=#{@local_object.class.name}##{function_call['name']}(#{function_call['args']})")
178
+
179
+ function_call['kwargs'].transform_keys!(&:to_sym) if function_call['kwargs']&.kind_of?(Hash)
180
+ return_value = @local_object.send(function_call['name'].to_sym, *function_call['args'], **function_call['kwargs'])
181
+ rpc_response = { 'return_value' => return_value }
182
+ rescue StandardError => err
183
+ rpc_response = { 'exception' => err.to_s, 'backtrace' => err.backtrace }
184
+ end
185
+
186
+ send_response(response_queue, rpc_response)
187
+ end
188
+
189
+ def send_response(response_queue, rpc_response)
190
+ if @verbose
191
+ p rpc_response
192
+ end
193
+
194
+ # response transport
195
+ rpc_raw_response = JSON.dump rpc_response
196
+ @redis_server.multi do |pipeline|
197
+ pipeline.rpush response_queue, rpc_raw_response
198
+ pipeline.expire response_queue, @response_expiry
199
+ end
200
+
201
+ true
202
+ end
203
+ end
204
+ end